gpt4 book ai didi

assembly - x86 汇编操作系统 hello world 未按预期工作

转载 作者:行者123 更新时间:2023-12-04 04:43:34 27 4
gpt4 key购买 nike

我做了这个代码,这应该是简单的操作系统,应该打印“Hello world!”。

bits 16
mov bx,msg
call printstr
printstr:
mov al,byte[bx]
mov ah,0Eh
int 10h
inc bx
cmp byte[bx],0
je end
jmp printstr
end:
jmp end
msg: db "Hello world!",0
times 510-($-$$) db 0
dw 0xaa55
我在 NASM 上组装了它。
当我在 QEMU 上运行它时,它会打印一个奇怪的字符和“S”。

我用这些参数运行 QEMU
"qemu-system-x86_64 ost.bin"其中 "ost.bin"是那个文件。
有人知道解决方案吗?

最佳答案

您的代码中有几个问题:

bits 16
mov bx, msg
msg现在只包含您的消息从输出二进制文件开始的偏移量。您可以通过添加 0x7c00 来解决此问题。至 msg或设置程序原点(在内存中启动, ORG 0x7c00 )。
  call printstr
printstr:
mov al,byte[bx]
BX不是索引字符串字符的好寄存器,因为它包含颜色(低字节)和页面(高字节)信息。
  mov ah,0Eh
int 10h

您不必设置 AH0x0E每次打印字符时。它可以在代码的开头完成。
  inc bx
cmp byte[bx], 0

在这种循环中,您应该首先检查值,然后对其进行处理。如果 BX+0 上的字符,你会怎么做?等于 0 ?你会错过这个事实,这会导致错误的输出甚至无限循环。
  je end
jmp printstr

这肯定会导致无限循环,因为您已经在该过程中。
end:
jmp end

首选语法是 jmp $ (其中美元符号的意思是“这里”)。
msg: db "Hello world!",0
times 510-($-$$) db 0
dw 0xaa55

关于assembly - x86 汇编操作系统 hello world 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18548305/

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