學習https://github.com/cfenollosa/os-tutorial/tree/master/05-bootsector-functions-strings,我一直在試圖編寫自己的引導扇區。NASM指令序列
我正在嘗試打印給定的字符串。
這些是我的兩個文件:
boot_main.asm
[org 0x7c00]
mov bx, hello
call print
jmp $
hello db 'HI', 0
%include "boot_print.asm"
times 510 - ($ - $$) db 0
dw 0xaa55
boot_print.asm
print:
pusha
start:
mov al, [bx]
cmp al, 0
je done
mov ah, 0x0e
int 0x10
add bx, 1
jmp start
done:
popa
ret
print_nl:
pusha
mov ah, 0x0e
mov al, 0x0a
int 0x10
mov al, 0x0d
int 0x10
jmp done
現在這個完美的作品,並打印 「HI」 到屏幕上。但是,如果我將指令hello db 'HI', 0
開始。即
boot_main.asm
[org 0x7c00]
hello db 'HI', 0
mov bx, hello
call print
jmp $
%include "boot_print.asm"
times 510 - ($ - $$) db 0
dw 0xaa55
這不能在所有打印任何東西。我試圖理解兩者之間的區別。任何幫助?
你的例子,與sidestep錦上添花,美麗,謝謝! :) –
@KarthikNayak:很高興幫助!有趣的是,當生成與位置無關的代碼時,和/或當您的數據很小但不符合立即數,但仍然可以從中受益時,實際上將其用於「現實生活中」已經在使用它的寒冷中緩存。 –
關閉主題,你能解釋你的個人資料中的笑話嗎? –