我试图编写一个代码作为引导加载程序运行。它应该打印'Enter your name'
,然后读取用户的名字,然后继续做其他事情,但我仍然坚持打印'Enter your name!'
。
当我运行此代码时,它会打印'Enter your name!'
,但无论我将其作为say_hello
标签下的下一条指令放置,似乎都无法正常工作。在这种情况下 - 我接下来尝试打印'Test message'
,但在启动时只打印'Enter your name!'
。
我检查过print
程序没有陷入无限循环。我尝试在ret_p
指令之前从ret
标签打印单个字符并且它有效。所以我的猜测是我在堆栈上有一些我不知道的东西?但我不知道那可能来自哪里。
org 0x7c00
jmp 0:start ;zero the cs register
start:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x8000 ;initialize stack
jmp 0:say_hello
; in register al procedure expects argument - character to print
print_char:
mov ah, 0xe
int 0x10
hlt
ret
; in register ax procedure expects argument - buffer text to print
print:
mov bx, ax
mov al, [bx]
cmp al, 0x0
je ret_p
call 0:print_char
inc bx
mov ax, bx
jmp 0:print
ret_p:
ret
say_hello:
mov ax, WELCOME_MSG
call 0:print
mov ax, TEST_MSG
call 0:print
section .data
WELCOME_MSG: db 'Enter your name!', 0xd, 0xa, 0x0
TEST_MSG: db 'Test message', 0x0;, 0xd, 0xa, 0x0
BUFFER: times 64 db 0x0
P.S。我使用minix3在qemu上运行代码
P.S.2不要担心我的引导加载程序缺少分区表并且0xaa55
结束,我将编译后的代码写入第一个446字节的磁盘。