我必须在汇编中定义一个函数,该函数允许我循环遍历声明的字节字符串并使用 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 代码之外的其他操作。当我通过模拟器启动时,它会打印出几行乱码,并最终挂在那里让我看到我的失败的全部荣耀。哈哈哈。
嗯,看起来它在调用函数之前将字符串的地址加载到 BX 寄存器中。
实际的函数看起来像是尝试循环遍历字符串,使用 BX 作为指针并递增它(inc bx),直到它到达字符串末尾的 ASCII NUL(cmp al, 0; je return)...
……但是有些不对劲。 “mov al, bl”指令看起来不正确,因为这会将地址的低 8 位移到 al 中以与 ASCII NUL 进行比较,这没有多大意义。我认为它应该更像“mov al,[bx]”;即将 BX 地址引用的字节移动到 AL 寄存器中——尽管我已经很长时间没有使用汇编了,所以我的语法可能不正确。
由于该错误,10h 中断还将根据字符串的地址而不是字符串的内容打印随机字符。这可以解释你所看到的胡言乱语。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)