我正在尝试构建我的第一个引导程序,它实际上可以工作,但是根据gdb的说法,这是发生的一件事,我不理解。
这是我用nasm编写的引导程序:
split(s.notes, '/')[SAFE_OFFSET(0)] as part1,
split(s.notes, '/')[SAFE_OFFSET(1)] as part2
我在unbuntu机器上使用qemu并可视化8086架构。在gdb中多次使用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
命令后,gdb显示该程序无休止地向al添加了eax。我多次按下ni
,并且一直在添加它。但是,当我按继续时,它实际上可以工作,如您所见,它可以打印字符串。为什么会发生?
答案 0 :(得分:3)
您正在拆卸空白内存。 00 00
是add %al, (%eax)
或add [eax], al
的编码。您可以使用this online disassembler
0: 00 00 add BYTE PTR [eax],al
请注意,该指令不是在al中添加eax 。它将al添加到eax指向的地址的值上