我遇到了一些汇编代码的问题。我试图使用不同的程序集文件中的函数打印出一个字符串。但它不输出字符串而是输出“S”。我该如何解决? 我想补充说我使用的是NASM汇编程序。 码: string.asm
print_string:
pusha
mov ah, 0x0e
loop:
mov al, [bx]
cmp al, 0
je return
int 0x10
inc bx
jmp loop
return:
popa
ret
boot_sector.asm -
[org 0x7c00]
%include "string.asm"
mov bx, [my_string]
call print_string
my_string:
db 'hello world', 0
times 510 - ($ - $$) db 0
dw 0xaa55
答案 0 :(得分:2)
引导扇区的执行从第一个字节开始。 在这种情况下,第一条指令是函数的顶部,因为你把它放在第一位。
代码组装完全相同,就像你在组装之前手动包含它一样。所以你的引导部门真的是:
[org 0x7c00]
print_string:
pusha
...
ret
mov bx, [my_string] ; BX = load first 2 bytes of my_string.
; should have been
; mov bx, my_string ; BX = address of my_string. mov bx, imm16
call print_string
为什么它不起作用应该是非常明显的,如果您使用内置于BOCHS的调试器(或任何其他调试引导扇区的方式)单步执行代码,您会注意到这一点。即使只是看反汇编,也可能让你了解。
解决方案:将%include
放在其他代码之后,并避免执行落入其中。例如把这个放在电话之后:
cli ; disable interrupts
hlt ; halt until the next interrupt. (except for NMI)
(如果可以使用NMI,您可以将hlt
置于jmp
的无限循环中。)
这不是你唯一的错误。正如@MichaelPetch指出的那样,你从字符串加载2个字节而不是将其地址放入BX。