Загрузчик продолжает добавлять eax для всех - PullRequest
2 голосов
/ 20 марта 2019

Я пытаюсь собрать свой первый загрузчик, и он на самом деле работает, но, по словам GDB, есть одна вещь, которую я не понимаю.

Это мой загрузчик, написанный в nasm:

org 0x7c00
bits 16
start: jmp boot

msg db "Bootinggggg!", 0

Print:
lodsb ;loading si to al
cmp al,0 ;loop
je PrintDone
mov ah,0eh
mov bl,14 ;yellow color
int 10h
jmp Print 

PrintDone:
ret

boot:
mov ah,00h
mov al,0eh
int 10h ;stepping into graphic mode
mov si,msg
call Print
cli
cld
hlt


times 510-($-$$) db 0
dw 0xAA55 

Я использую qemu и визуализирую архитектуру 8086 на моей машине unbuntu. После использования команды ni несколько раз в GDB, GDB показывает, что программа просто бесконечно добавляет eax в al. Я нажимал ni много раз, и он просто добавляет его. Но когда я нажимаю продолжить, это на самом деле работает, как вы видите, печатает строку. Почему это происходит?

screenshot

1 Ответ

3 голосов
/ 20 марта 2019

Вы разбираете пустую память. 00 00 - это кодировка add %al, (%eax) или add [eax], al. Вы можете легко это проверить с помощью этого онлайн-дизассемблера

0:  00 00                   add    BYTE PTR [eax],al

Обратите внимание, что инструкция не добавляет eax к al . Добавляет al к значению по адресу, указанному в eax

...