【发布时间】:2015-02-25 04:37:44
【问题描述】:
我刚刚开始学习 x86 汇编,并参考了我找到的一本在线书籍:http://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf
在阅读本书并遵循示例时,我遇到了一个我无法解决的问题,因为我对汇编或一般编程的无知。我试图在我的引导扇区程序中构建一些代码,这些代码可以打印一个以空字符结尾的字符串,但程序只打印第一个字符。
这是我尝试运行的一些示例代码:
[org 0x7c00]
mov bx, Hello
mov ah, 0x0e
Keep_Printing:
mov al, [bx]
cmp al, 0
je Finished_Printing
int 0x10
add bx, 0x0008
jmp Keep_Printing
Finished_Printing:
cli
hlt
Hello:
db "Hello", 0
times 510-($-$$) db 0
dw 0xAA55
我在想会发生什么,bx 将包含 Hello 的前两个字母的内存地址,但我不确定当我试图将 16 位寄存器的内容移动到 8 位时会发生什么人的。当我运行它时,它只打印“H”,所以我猜前 8 位进入 al,其余的被忽略?
之后,我希望程序在循环字符串时继续检查 al 是否为 0,如果不是 0,则打印到屏幕上。我不太确定如何迭代在汇编中逐个字符地字符串,但我想既然我有 Hello 的起始地址,我可以继续在 bx 中的内存地址添加 8 位。打印的内容会根据我在“H”之后在内存中击中的内容而改变,但我不确定为什么它不会是字符串的其余部分。
我确定我在各个层面上都误解了各种各样的事情,但希望这里有人可以帮助解决问题。谢谢!
【问题讨论】:
标签: assembly x86 nasm bootloader 16-bit