我必須在程序集中定義一個函數,它允許我遍歷一串聲明的字節並使用BIOS中斷打印它們。我在16位真實模式。這是一本關於從教科書中編寫一個小引導程序的練習,但它似乎只是一個草稿,並且缺少一些東西。 我一直在考慮下面的代碼:使用沒有預定義的函數在程序集中打印字符串
org 0x7c00
mov bx, HELLO_MSG
call print_string
mov bx, GOODBYE_MSG
call print_string
jmp $ ;hang so we can see the message
%include "print_string.asm"
HELLO_MSG:
db 'Hello, World!', 0
GOODBYE_MSG:
db 'Goodbye!', 0
times 510 - ($ - $$) db 0
dw 0xaa55
我print_string.asm看起來是這樣的:
print_string:
pusha
mov ah, 0x0e
loop:
mov al, bl
cmp al, 0
je return
int 0x10
inc bx
jmp loop
return:
popa
ret
我有我在做什麼了,但書中沒有解釋如何遍歷一些東西。我知道如何在C中做到這一點,但這是我第一次使用程序集來調試C代碼以外的東西。當我通過模擬器啓動時會發生什麼,它會打印出幾行亂碼,最後掛在那裏讓我看到我的失敗。哈哈哈。
感謝您的幫助。對於不同的尋址模式是如何工作的,我仍然困惑不解。 'op寄存器'似乎直接使用該值,'op [register]'表示「使用該寄存器中的數字作爲地址去」,但我並不完全清楚它。 – Hugo
@Steven,巧合的是,我也使用與OP所使用的相同的書。我也被困在同一件事上,並且之前嘗試過這樣的語法: - 'mov al,[bx]'。但NASM在該行上發出編譯錯誤(無效的有效地址)。 –