[005][x86汇编语言]开发环境配置:硬盘主引导扇区代码:显示标号偏移地址 基础Bochs调试命令

《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

运行测试

[005][x86汇编语言]开发环境配置:硬盘主引导扇区代码:显示标号偏移地址 基础Bochs调试命令_第1张图片
vfirtual box 运行第5章 习题2 显示 infi在段内的偏移地址.png
[005][x86汇编语言]开发环境配置:硬盘主引导扇区代码:显示标号偏移地址 基础Bochs调试命令_第2张图片
bochs 调试 第5章 习题2 显示 infi在段内的偏移地址.png

Bochs

说明

  • Bochs:本质就是一台虚拟机,类似于 VirutalBox
  • 使用Bochs来调试,使用VirtualBox来运行结果

下载

https://sourceforge.net/projects/bochs/files/bochs/2.6.9/

配置

https://www.jianshu.com/p/d481cb547e9f
参见配书文件包 booktool \ 相关教程 \ Bochs安装手册.pdf

[005][x86汇编语言]开发环境配置:硬盘主引导扇区代码:显示标号偏移地址 基础Bochs调试命令_第3张图片
Disk&Boot.PNG
[005][x86汇编语言]开发环境配置:硬盘主引导扇区代码:显示标号偏移地址 基础Bochs调试命令_第4张图片
填写硬盘参数.png

命令

后接 [真实物理地址]

s       (step)单步执行
b       (break)断点  b 0x7C00  
c       (continue)继续执行
r       (register)查看寄存器
sreg    (segment regi)查看段寄存器
xp      (eXamine memory at physical address)查看内存 xp/2 0xB8000
q       (quit)退出

你可能感兴趣的:([005][x86汇编语言]开发环境配置:硬盘主引导扇区代码:显示标号偏移地址 基础Bochs调试命令)