环境bochs
使用bochsdbg.exe
环境初始状态
f000:fff0: 对应逻辑地址和偏移地址 和8086不同bochs里面初始状态cs:f000 ip:fff0
jmpf 0xf000:e05b: 要执行的第一条指令
ea5be000f0: 指令对应的机器码
t=0: bochs内部的时钟 每执行一条指令时钟加1
bochs调试指令
sreg: 查看段寄存器的状态
r: 查看通用寄存器的状态
s: 查看下一条要执行的指令
b 内存地址: 在指定的内存地址处设置一个断点
c: 持续执行指令 如果设置了断点就执行到断点处
代码
start: ; 标号表示离它最近的汇编代码的地址
mov ax, 0xB800
mov ds, ax
mov byte[0x00], 'H' ; 放到显存的字符
mov byte[0x01], 0x06 ; 字符的显示颜色
mov byte[0x02], 'e'
mov byte[0x03], 0x06
mov byte[0x04], 'l'
mov byte[0x05], 0x06
mov byte[0x06], 'l'
mov byte[0x07], 0x06
mov byte[0x08], 'o'
mov byte[0x09], 0x06
mov byte[0x0a], ' '
mov byte[0x0b], 0x06
mov byte[0x0c], 'W'
mov byte[0x0d], 0x06
mov byte[0x0e], 'o'
mov byte[0x0f], 0x06
mov byte[0x10], 'r'
mov byte[0x11], 0x06
mov byte[0x12], 'l'
mov byte[0x13], 0x06
mov byte[0x14], 'd'
mov byte[0x15], 0x06
current:
; times表示循环执行n次指令
; 主引导扇区必须512字节 除了末尾的55 aa和前面的
times 510-(current-start) db 0
; 格式要求最后两个字节必须是55 aa
db 0x55, 0xaa
结果
调试过程
b 0x7c00 设置断点
c 执行指令一直到0x7c00处 主引导扇区开始的位置
u/32 反汇编代码 查看最后一条字符输出指令的地址
b 0x7c73 设置断点
c 执行指令一直到0x7c73处 完成字符输出过程
b 0x7c00
c
u/32
b 0x7c73
c