x86汇编学习-打印HelloWorld-8

190 阅读2分钟

环境bochs

使用bochsdbg.exe
环境初始状态
捕获.PNG 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

结果

捕获.PNG

调试过程

b 0x7c00 设置断点 c 执行指令一直到0x7c00处 主引导扇区开始的位置 捕获.PNG u/32 反汇编代码 查看最后一条字符输出指令的地址 捕获.PNG b 0x7c73 设置断点 c 执行指令一直到0x7c73处 完成字符输出过程

b 0x7c00
c
u/32
b 0x7c73
c