gpt4 book ai didi

string - 不使用预定义函数在程序集中打印字符串

转载 作者:行者123 更新时间:2023-12-04 04:42:05 25 4
gpt4 key购买 nike

我必须在汇编中定义一个函数,它允许我遍历一串声明的字节并使用 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 中断也将根据字符串的地址而不是字符串的内容打印随机字符。这可以解释您看到的乱码。

关于string - 不使用预定义函数在程序集中打印字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18731047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com