我的装配程序似乎没有返回

时间:2017-03-30 07:14:35

标签: assembly x86 stack interrupt real-mode

我试图编写一个代码作为引导加载程序运行。它应该打印'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字节的磁盘。

0 个答案:

没有答案