Моя процедура сборки не возвращается

Я пытаюсь написать код для запуска в качестве загрузчика. Это должно напечатать '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

PS запускаю код на qemu с minix3

PS2 Не беспокойтесь о том, что моему загрузчику не хватает таблицы разделов и 0xaa55 В завершение я записываю скомпилированный код на первые 446 байт диска.

0 ответов

Другие вопросы по тегам