[005][x86組合語言]開發環境配置:硬碟主引導扇區程式碼:顯示標號偏移地址 基礎Bochs除錯命令...

weixin_33670713發表於2018-05-20

《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

執行測試

10191360-97a87307f16abb80.png
vfirtual box 執行第5章 習題2 顯示 infi在段內的偏移地址.png
10191360-737594c5a955859f.png
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

10191360-ef9ee083b22efe15.PNG
Disk&Boot.PNG
10191360-2f6652e41b657184.png
填寫硬碟引數.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)退出

相關文章