我一直試圖讓它作業幾個小時,但似乎沒有任何東西可以讓輸出以一兩行的形式出現。我已經用字串進行了我之前的第二個回圈,將 a 更改為 b ,甚至一點一點地更改了順序。
代碼:
[org 0x7c00]
mov ah, 0x0e
mov bx, varName
printString:
mov al, [bx]
cmp al, 0
je end
int 0x10
inc bx
jmp printString
end:
jmp $
varName:
db "Hello World", 0
mov bh, 0x0e
mov bl, 'Z'
int 0x10
loop:
dec bl
cmp bl, 'A' - 1
je exit
int 0x10
jmp loop
exit:
jmp $
times 510-($-$$) db 0
dw 0xaa55
當前輸出:Hello World
我嘗試一次洗掉兩個,它按預期單獨運行。
注意:我正在使用 qemu、asm、vim 并且一直在使用 vscode 來幫助解決任何拼寫錯誤
uj5u.com熱心網友回復:
將 a 改為 b
不要這樣做!如果 api 宣告它需要AH暫存器中的函式編號,那么嘗試將它傳遞到BH暫存器中肯定無濟于事。
從某種意義上說,你很幸運,jmp $沒有讓你執行那個虛假的第二部分。
要執行代碼的兩部分,您可以替換它jmp $(這是一個無限回圈),正常跳轉到第二部分的第一條指令:
...
end:
jmp Part2
varName:
db "Hello World", 0
Part2:
mov ah, 0x0E ; BIOS.Teletype
mov al, 'Z'
...
或者,將資料移動到第二部分下方。這樣就不需要跳轉了:
...
end:
mov ah, 0x0E ; BIOS.Teletype
mov al, 'Z'
...
varName:
db "Hello World", 0
...
由于這是一個引導扇區程式,您可能會在將扇區加載到記憶體中時查看磁盤讀取錯誤,其中我列出了引導扇區程式中的一些重要內容,但您當前的程式仍然缺失。例如,您沒有設定任何段暫存器并且您省略了 BIOS.Teletype 函式的 DisplayPage 引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313731.html
上一篇:從匯編代碼和骨架C派生陣列的大小
下一篇:在MIPS中查找陣列中的最大元素
