實驗結論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從後往前寫的。