1. 程式人生 > 其它 >實驗:8086彙編指令編碼和除錯

實驗: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) = 2E
push [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 s
    
    
mov 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