《x86汇编语言:从实模式到保护模式》 第5章 本章习题 第2题
https://www.jianshu.com/p/d481cb547e9f
e5-2.asm :显示标号infi的偏移地址
;代码清单5-1
;文件名:e5-2.asm
;文件说明:硬盘主引导扇区代码
;参考代码:c05_mbr.asm
;创建日期:21:20 2018/5/20
mov ax,0xb800 ;指向文本模式的显示缓冲区
mov es,ax
;以下显示字符串"Label offset:"
mov byte [es:0x00],'L'
mov byte [es:0x01],0x07
mov byte [es:0x02],'a'
mov byte [es:0x03],0x07
mov byte [es:0x04],'b'
mov byte [es:0x05],0x07
mov byte [es:0x06],'e'
mov byte [es:0x07],0x07
mov byte [es:0x08],'l'
mov byte [es:0x09],0x07
mov byte [es:0x0a],' '
mov byte [es:0x0b],0x07
mov byte [es:0x0c],"o"
mov byte [es:0x0d],0x07
mov byte [es:0x0e],'f'
mov byte [es:0x0f],0x07
mov byte [es:0x10],'f'
mov byte [es:0x11],0x07
mov byte [es:0x12],'s'
mov byte [es:0x13],0x07
mov byte [es:0x14],'e'
mov byte [es:0x15],0x07
mov byte [es:0x16],'t'
mov byte [es:0x17],0x07
mov byte [es:0x18],':'
mov byte [es:0x19],0x07
mov ax,infi ;取得标号number的偏移地址
mov bx,10
;设置数据段的基地址
mov cx,cs
mov ds,cx
;求个位上的数字
mov dx,0
div bx
mov [0x7c00+number+0x00],dl ;保存个位上的数字
;求十位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x01],dl ;保存十位上的数字
;求百位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x02],dl ;保存百位上的数字
;求千位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x03],dl ;保存千位上的数字
;求万位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x04],dl ;保存万位上的数字
;以下用十进制显示标号的偏移地址
mov al,[0x7c00+number+0x04]
add al,0x30
mov [es:0x1a],al
mov byte [es:0x1b],0x04
mov al,[0x7c00+number+0x03]
add al,0x30
mov [es:0x1c],al
mov byte [es:0x1d],0x04
mov al,[0x7c00+number+0x02]
add al,0x30
mov [es:0x1e],al
mov byte [es:0x1f],0x04
mov al,[0x7c00+number+0x01]
add al,0x30
mov [es:0x20],al
mov byte [es:0x21],0x04
mov al,[0x7c00+number+0x00]
add al,0x30
mov [es:0x22],al
mov byte [es:0x23],0x04
mov byte [es:0x24],'D'
mov byte [es:0x25],0x07
infi: jmp near infi ;无限循环
number db 0,0,0,0,0
times 203 db 0
db 0x55,0xaa
代码说明
- 对
参考代码:c05_mbr.asm
只做一处修改:第38行 ,取出标号偏移地址:mov ax,infi ;取得标号infi的偏移地址
- 开机后,主引导扇区代码(放在硬盘0道0面1扇区的代码)被加载到内存
0x0000:0x7c00处
- 利用除法
div
运算,取出每个位上的数 -
+30H
做成ASCII码
,送入显卡显存0xB800
对应处显示
异或操作 xor
0 xor 0 = 0
1 xor 0 = 1
0 xor 1 = 1
1 xor 1 = 0
运行测试
Bochs
说明
- Bochs:本质就是一台虚拟机,类似于 VirutalBox
- 使用Bochs来调试,使用VirtualBox来运行结果
下载
https://sourceforge.net/projects/bochs/files/bochs/2.6.9/
配置
https://www.jianshu.com/p/d481cb547e9f
参见配书文件包 booktool \ 相关教程 \ Bochs安装手册.pdf
命令
后接 [真实物理地址]
s (step)单步执行
b (break)断点 b 0x7C00
c (continue)继续执行
r (register)查看寄存器
sreg (segment regi)查看段寄存器
xp (eXamine memory at physical address)查看内存 xp/2 0xB8000
q (quit)退出