我正在将此代码用于 Hello world 引导加载程序。它不是打印出"Hello world",而是打印出一个"H"并挂起。我已经使用 loadsb 成功打印出消息,但我不明白为什么这种方法不起作用,因为它似乎等效。
[ORG 0x7c00]
[BITS 16]
xor ax, ax ;make it zero
mov ds, ax
mov ecx, msg
bios_print:
mov al, [ecx]
add ecx,1
cmp al, 0 ;zero=end of str
je hang ;get out
cmp al,100
jge hang
mov ah, 0x0E
int 0x10
jmp bios_print
hang:
jmp hang
msg db 'Hello World', 13, 10, 0
times 510-($-$$) db 0
db 0x55
db 0xAA
编辑:我将 [位 64] 更改为 [位 16]
你的程序完全按照你编码的方式工作。ASCII 中的小写e
表示为 65h
,等于十进制中的 101。因此,如果e
(101) 在 al
中,则执行 cmp al, 100 / jge hang
会导致跳转到标签hang
。一切都很好。:)
解决您的问题的方法就是简单地删除该行,因为我真的看不出它有任何目的 - 看看你是如何让你的字符串被