一、boot调试
Qemu与gdb调试内核 (chiyiw.com)http://blog.chiyiw.com/2017/04/28/Qemu%E4%B8%8EGDB%E8%B0%83%E8%AF%95%E5%86%85%E6%A0%B8.html(5条消息) 基于qemu和gdb远程调试引导程序_qwe19910328的博客-CSDN博客
https://blog.csdn.net/qwe19910328/article/details/107009326二、调试一个boot程序
1.boot.asm源码
org 7c00h ;告诉编译器将程序链接到7c00处
mov ax, cs ;ds,ex=cs
mov ds, ax
call DispStr ;调用字符串打印程序
jmp $ ;执行完成进入死循环
DispStr:
mov ax, BootMessage ;加载显示的字符串首地址到bp
mov bp, ax
mov cx, 10 ;显示计数
mov ax, 1301h ;显示器模式
mov bx, 000ch ;字符显示格式和位置
mov dl, 0
int 10h ;触发bios 10h号中断
ret
BootMessage: db "denglin_os"
times 510-($-$$) db 0
dw 0xaa55
2.分别编译得到.bin和.lst文件
nasm boot.asm -o boot.bin
nasm boot.asm -l boot.lst
3.boot.lst文件
行号: 基于org的偏移地址 : 机器码 : 汇编指令 : 注释
1 org 7c00h ;告诉编译器将程序链接到7c00处
2 00000000 8CC8 mov ax, cs ;ds,ex=cs
3 00000002 8ED8 mov ds, ax
4 00000004 E80200 call DispStr ;调用字符串打印程序
5 00000007 EBFE jmp $ ;执行完成进入死循环
6
7 DispStr:
8 00000009 B8[1C00] mov ax, BootMessage ;加载显示的字符串首地址到bp
9 0000000C 89C5 mov bp, ax
10 0000000E B90A00 mov cx, 10 ;显示计数
11 00000011 B80113 mov ax, 1301h ;显示器模式
12 00000014 BB0C00 mov bx, 000ch ;字符显示格式和位置
13 00000017 B200 mov dl, 0
14 00000019 CD10 int 10h ;触发bios 10h号中断
15 0000001B C3 ret
16 0000001C 64656E676C696E5F6F- BootMessage: db "denglin_os"
16 00000025 73
17 00000026 00<rept> times 510-($-$$) db 0
18 000001FE 55AA dw 0xaa55
4、调试过程中,在0x7c09地址处设置断点并运行到该断点处打印出各个寄存器的值
(gdb) b *0x7c09
Breakpoint 2 at 0x7c09
(gdb) c
Continuing.
Breakpoint 2, 0x00007c09 in ?? ()
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0x6f02 0x6f02
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x7c09 0x7c09
eflags 0x202 [ IF ]
cs 0x0 0
ss 0x0 0
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
cs:ip = 0x0:0x7c09,可见,cs的值是0,并不是我认为的cs的值为0x07c0.
三、相关知识补充说明
BIOS int 10h中断第13H功能说明:
从这里看,其实我们的代码有点问题——没有初始化ES寄存器。但是,很巧合的是,ES寄存器默认值是0(刚好与我们程序逻辑对应),所以,恰巧使得这段程序可以正常工作。最正确的程序应该如下:
org 7c00h ;告诉编译器将程序链接到7c00处
mov ax, cs ;ds,ex=cs
mov ds, ax
mov es, ax
call DispStr ;调用字符串打印程序
jmp $ ;执行完成进入死循环
DispStr:
mov ax, BootMessage ;加载显示的字符串首地址到bp
mov bp, ax
mov cx, 10 ;显示计数
mov ax, 1301h ;显示器模式
mov bx, 000ch ;字符显示格式和位置
mov dl, 0
int 10h ;触发bios 10h号中断
ret
BootMessage: db "denglin_os"
times 510-($-$$) db 0
dw 0xaa55