Qemu与GDB调试os

一、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

denglin12315

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值