實驗:8086彙編指令編碼和除錯
實驗任務一
1.-d 檢視記憶體單元
2.-r 檢視並修改CPU暫存器的內容
3.-e 改寫記憶體內容
4.-t 執行一條機器指令
5.-a 以彙編指令的格式向記憶體中寫入一條機器指令
6.-u 將機器指令翻譯成彙編指令
實驗任務二
1.使用d命令檢視生產日期
2.使用e命令修改生產日期所在記憶體單元
3.結論
ROM可讀不可寫,因此不可改變ROM地址對應的內容
實驗任務三
1.e命令修改記憶體單元
2.f命令批量填充記憶體單元
實驗任務四
-a mov ax, 20 mov ds, ax mov ss, ax mov sp, 30 push [0] ; 執行後,暫存器(sp) = 2Epush [2] ; 執行後,暫存器(sp) = 2C push [4] ; 執行後,暫存器(sp) = 2A push [6] ; 執行後,暫存器(sp) = 28 pop [6] ; 執行後,暫存器(sp) = 2A pop [4] ; 執行後,暫存器(sp) = 2C pop [2] ; 執行後,暫存器(sp) = 2E pop [0] ; 執行後,暫存器(sp) = 30
1.單步執行push指令和pop指令時,觀察並記錄棧頂偏移地址的暫存器sp值的變化情況
2.push[6]執行後pop[6]執行前,此時棧空間的資料
3.pop[0]執行後,使用d 20:0 7檢視此時資料是否有變化
4.改變pop順序,觀察資料變化
實驗任務五
問題一:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?後面的指令 mov
sp, 30 是什麼時候執行的?回答:執行mov ss, ax 時,mov sp,30立即執行,並沒有暫停
問題二:觀察單步除錯時,棧空間00220H ~ 0022fH記憶體單元值的變化。
記憶體單元儲存指令的地址
實驗任務六
assume cs:code code:segment start: mov cx,10 mov dl,'0' s: mov ah,2 int 21h add dl,1 loop smov ah,,4ch int 21h code ends end start
彙編、連結、執行的過程:
段字首PSP:前兩個位元組的內容是CD 20
實驗任務七
(1)mov ax,cs目的是讓ds得到程式碼段的起始地址
(2)mov cx,offset s2 - offset s1 目的是將程式碼的首尾相減,得到程式碼段的位移
1 assume cs:code 2 code segment 3 s1: 4 mov ax,cs 5 mov ds,ax 6 mov ax,0020h 7 mov es,ax 8 mov bx,0 9 mov cx,offset s2 - offset s1 10 s: mov al,[bx] 11 mov es:[bx],al 12 inc bx 13 loop s 14 s2: 15 mov ax,4c00h 16 int 21h 17 18 code ends 19 end
結果截圖:
總結:
(1)CPU當中對RAM與ROM的讀寫許可權是不同的,RAM可讀可寫,ROM卻只可讀操作。
(2)段字首用於顯示指明記憶體單元的段地址,防止向其他記憶體空間寫入資料,覆蓋原本重要的資料。
(3)push指令 -> ①SP - 2 –> ②將字型資料存放到SS:SP地址中
pop指令 –> ①將SS:SP地址的字型資料取出來 –> ②SP + 2