设置断点
数据断点
b *0x7c00
查看寄存器
查看单个
p $ax
查看所有
i r
查看内存
x/nfu addr
n 表示数量
f 表示格式 x(hex),d(decimal),c(char)
u 表示显示单位,b(byte), h(halfword),w(word),g(giant,8byte)
(gdb) x/8xb 0x7c00
反汇编
disas 0x7c00, +10 ;这个是AT&T语法
set disassembly-flavor intel ;这样设置为intel格式
反汇编下一条要执行的指令
set disassemble-next-line on
执行下一条指令
si
退出
q
实际执行
编译hello world镜像
代码如下
org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call Disp
jmp $
Disp:
mov ax,BootMsg
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
BootMsg: db "Hello, OS World!"
times 510 - ($-$$) db 0
dw 0xaa55
使用dd命令创建一个虚拟磁盘文件,大小是4M
使用nasm将hello.asm编译为二进制文件
将这个二进制文件装入刚才创建的虚拟硬盘中
运行qemu
在windows终端中键入
qemu-system-i386 boot.img
gdb调试运行qemu
这是正常启动的状态,下面使用gbd调试来启动
加两个参数
-S 表示在cpu启动时就冻结其状态
-s 表示能通过端口1234远程访问该gdb
启动后虚拟机上显示的是还没有初始化显示
在windows上再开一个cmd窗口通过ipconfig命令查看ip地址
然后,到linux上输入gdb命令打开gdb,通过target remote 目标主机IP:端口
的格式远程连接windows上开启的gdb调试
接下来,就使用前面所讲gdb的命令进行执行
- 设置断点到0x7c00,并按c让它继续执行到断点位置停止
可以看到qemu上显示已经从硬盘中启动,证明他发现了硬盘中第一个扇区是以55aa结束的
最后再执行一下c,就到了之前没有设置断点调试的状态了