實驗1 用機器指令和彙編指令編程

實驗結論spa

1.教材實驗一結論3d

  實驗任務(1)指針

    首先使用-a方式將彙編指令寫入內存中:調試

    

 

 

     能夠發現內存中已經寫入了相應的指令,blog

     使用-e命令寫入內存:ip

 

     

     -e表示使用十六進制形式寫入內存,此時反編譯能夠發現內容與以a寫入相同:
內存

    

 

 

     使用-t單步運行此彙編代碼。編譯

    CS(Code segment)代碼段寄存器   IP(Instructor  point)指令指針寄存器變量

     1.此時CS寄存器的值爲073FH,IP寄存器的值爲0100H,cpu到地址073f:0100H物理地址的內存中尋址,程序

     獲得命令mov, AX, 4E20H,因而將AX寄存器的內容修改成4E20H,並將IP寄存器的值修改成0100H+3(指令長度) = 0103H

     此時,AX寄存器的值改變爲4E20H,IP寄存器的值改變爲0103H,實驗發現實驗結果與預期符合的很好。

     

 

     2.CPU訪問物理地址爲CS:IP,即地址073F:0103H,獲得下一條指令爲ADD AX,1416,

    此時,AX <-  AX + 1416H,IP寄存器的值修改成0103H+3(指令長度) = 0106H。

    AX的理論值爲6236H,IP的理論值爲0106H,實驗發現實驗值與預期值符合的很好。

    

 

     3.CPU訪問物理地址爲073F:0106H的內存空間,獲得下一條指令爲MOV BX, 2000H

     BX  <-  2000H, IP  <-  IP+3(指令長度)

     BX的理論值爲2000H,IP的理論值爲0109H

     實驗發現實驗值與理論值符合的很好。

     

     4.CPU訪問物理地址爲073F:0109H的內存空間,獲得下一條指令爲ADD AX, BX

     AX  <-  AX+BX ,  IP  <-  IP+2(指令長度)

     AX的理論值爲8236H, IP的理論值爲010BH,實驗發現實驗值與理論值符合的很好。

          

 

  實驗任務(2)

    首先使用A命令將指令寫入2000:0000H開始的內存空間:

     

 

 

     此時使用u命令反編譯能夠發現內存中已經有指令了

      

    使用-t命令進行調試:

      

     CPU從CS:IP中獲得命令並運行,將AX賦值爲1,IP變爲0003H

     接下來,ADD AX,AX  

     將AX <-  AX+AX,至關於AX  <-  AX x 2

     下一步, JMP 2000:0003H,

     至關於CS  <-  2000H,  IP  <-  0003H,

     接下來至關於屢次運行AX = AX *2,運行屢次能夠獲得2的8次方爲256,十六進制形式爲0100H

     

  實驗任務(3)

    分析:物理地址爲FFF00H-FFFFFH,能夠解釋爲FFF0*16+00 - FFF0*16+FF

   總共FF個內存單元。

    即-e FFF0:00 LFF

    獲得內存中內容以下:

    

 

 

     能夠發現FFF0:00F5H - FFF0:00FDH爲生產日期01/01/92,嘗試修改其中內容:

     

 

     發現內存中的數據並無改變:

    

 

     查詢8086CPU的內存分配圖能夠發現,該段區域屬於ROM只讀區域,不可修改。

     8086CPU的內存分配圖以下:

    

 

     仔細想一想,若是一塊主板的生產日期能夠隨意改變的話,記錄這個生產日期的意義不足,一塊2000年生產的主板能夠被隨意改變爲2020年生產的,對維修業務很不友好。

 

  實驗任務(4)

   從內存B8100H開始的內存單元寫入數據:01 02 03 01 03 02 01 02

   使用-e 命令改變內存單元:

   

 

 

   能夠發現出現了圖案:

    

 

     改變寫入的數據,發現圖案也跟着變化:

     

 

   解釋:查閱8086CPU內存分配能夠發現:

   A0000H - BFFFFH屬於顯存地址空間,而B8100H開始的一小塊地址空間正好屬於這個區域,

   修改B8100H開始的一小塊內存區域修改的爲顯存空間,所以會出現圖案,而隨着內存的改變,圖案也會變化。

 2.教材實驗二結論

實驗任務一

1.先使用 e 命令將內存單元 0022:0 ~0022:7連續 8 個字 節數據修改成 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H 

同時使用d命令查看內存內容,發現寫入正確:

 2.使用a命令寫入彙編代碼:

 

 

 

 

 

 接下來開始單步執行:

1.mov ax,0022

將ax寄存器的值改變爲0022。

 

 

 2.mov ds,ax

將ds的值修改成ax內的值,即將ds修改成0022H

 

 3.mov ax,2200

將寄存器ax的值改成2200H

 

 4.mov ss,ax

將ss寄存器的內容改成ax的內容2200H

 

 5.mov sp,0100

將sp內存器的值修改成0100,此時棧頂的物理地址爲ss:sp即爲22100H

 

6.mov ax,[0]

將ax寄存器的值修改成ds:0內存單元中的值

因爲8086採用的是大端法,0022:0中的值爲50,0022:1中的值爲51,因此ax=5150H

 

 7.add ax,[2]

由上述分析可知,ax = ax + 5352H = A4A2H

 

 8.mov bx,[4]

將ax寄存器的值修改成ds:4內存單元中的值

因爲8086採用的是大端法,0022:4中的值爲54,0022:4中的值爲55,因此bx=5554H

 

 

 9.add bx,[6]

由上述分析可知,bx = bx + 5756H = ACAAH

 

 

 

 10.push ax

表示ax進棧。

進棧後,sp = sp - 2 = 00FEH

被修改的內存單元爲:

22100被修改成A4H

220FF被修改成A2H

 

 

 

 下爲內存單元查看:

 

 

 實驗值與理論值符合的很是好。

11.push bx

表示bx進棧。

進棧後,sp = sp - 2 = 00FCH

被修改的內存單元爲:

220FE被修改成ACH

220FD被修改成AAH

 

 下爲內存修改顯示:

 

 12. pop ax

表示出棧,並將元素存在ax中。

出棧時,sp = sp + 2 = 00FEH

ax = ACAAH

 

 

 13. pop bx

表示出棧,並將元素存放在BX中,

出棧時,sp = sp  + 2 = 0100H

BX = A4A2H

 

14. push [4]

表示進棧,進棧元素爲ds:4中的元素

sp = sp - 2 = 00FEH

被修改的內存單元爲:

220FF被修改成55H

220FE被修改成54H

 

 

 

 

15.push [5]

表示進棧,進棧元素爲ds:6中的元素

sp = sp - 2 = 00FCH

被修改的內存單元爲:

220FD被修改成57H

220FC被修改成56H

實驗任務二

 1.首先,使用e命令寫入數據

 

 2.用a命令寫入程序

 

 (1)mov ax,2000

 

 能夠發現,ax寄存器變爲2000,2000:0 - 2000:F的區域沒有發生變化。

2.mov ss,ax

 

 將ss寄存器的值修改成ax中的值,此時ss爲2000H,sp變爲0010H

聯想:0000H-0010H正好爲16B的存儲空間

觀察幾個改變了的內存的內容,爲 00 20 00 00 08 01 3f 07 a3 01

由大端法的存儲特色,能夠猜測,其中內容分別爲:

2000H 0000H 0108H 073FH 01A3H

2000H與 AX寄存器內容相同

0000H與BX CX DX內容相同

0108H與IP寄存器內容相同

073F與CS寄存器內容相同

01A3H沒有找到。

通過查閱資料,我發現

設置棧頂位置後

會觸發一次中斷,棧會存儲cs,ip和ax等的內容。

mov ss,ax執行後,mov sp,10當即執行,而後靠近棧頂的16個字節發生變化,對部分環境變量,如ss,ip,cs進行暫存,以保護現場。  

前三條命令執行事後,初始時的棧頂和棧底爲:2000:0010

 

 

 

  

 

 個人思考:在mov ss,ax後,mov sp,0010被馬上執行了。

數據是從2000:0010從後往前寫的。

相關文章
相關標籤/搜索