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