Python教程:跳出多層迴圈for、while
實驗2 彙編源程式編寫與彙編除錯
實驗任務1
使用任意一款文字編輯器,編寫8086彙編源程式ex1.asm。原始碼如下:
; ex1.asm assume cs:code code segment mov ax, 0b810h mov ds, ax mov byte ptr ds:[0], 1 mov byte ptr ds:[1], 1 mov byte ptr ds:[2], 2 mov byte ptr ds:[3], 2 mov byte ptr ds:[4], 3 mov byte ptr ds:[5], 3 mov byte ptr ds:[6], 4 mov byte ptr ds:[7], 4 mov ah, 4ch int 21h code ends end
1、分別使用masm命令和link命令彙編與連結
masm d:\code\ex1.asm;
link ex1.obj;
2、嘗試執行ex1.exe
可以看到dos介面上方出現了4個圖案
3、使用debug工具進行反彙編和除錯
1)反彙編
根據cx的值,可使用u命令精準檢視
2)檢視程式的PSP
PSP256個位元組 ,所以檢視範圍為ds:0-ds:ff
可以看到”ex1.exe“等程式相關資訊
3)使用g命令執行到line16退出執行之前
可以看到dos介面上方出現4個圖案,與直接執行結果相符
實驗任務2
使用任意一款文字編輯器,編寫8086彙編源程式ex2.asm。原始碼如下:
; ex2.asm
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov bx, 0
mov ax, 101H
mov cx, 4
s: mov [bx], ax
add bx, 2
add ax, 101H
loop s
mov ah, 4ch
int 21h
code ends
end
1、分別使用masm命令和link命令彙編與連結
masm d:\code\ex2.asm; link ex2.obj;
2、嘗試執行ex2.exe
可以看到dos介面上方出現了4個圖案,與實驗一結果相同
3、使用debug工具進行反彙編和除錯
1)反彙編
2)除錯
進行了一次單步除錯後,使用g命令跳到了結束命令之前
此時dos介面上方出現4個圖案,與直接執行結果相符
之後正常進行除錯,使用p命令跳過INT指令,程式正常結束。
4、回答問題
結合上述實驗和觀察,分析、對比ex2.asm和ex1.asm,它們實現的是否是相同的功能和效果?在具體實現上有什麼不同?
從執行結果上看,ex1.asm與ex2.asm實現了相同的功能和效果。
在具體實現上,ex1.asm與ex2.asm都是修改了相關視訊記憶體的數值。
但ex1.asm是硬編碼,而ex2.asm使用了loop迴圈指令減少了重複程式碼量。
實驗任務3
綜合使用loop,[bx],編寫完整彙編程式,實現向記憶體b800:07b8開始的連續16個字單元重複填充字資料0237H。
1、ex3.asm程式碼如下:
; ex3.asm
assume cs:code
code SEGMENT
mov ax,0b800H
mov ds,ax
mov dx,0237H
mov cx,16
mov bx,07b8H
s: mov [bx],dx
add bx,2
loop s
mov ax,4c00H
int 21h
code ENDS
END
2、執行結果
3、基於以下要求重複實驗
把填充的字資料,從0237H 改成0239H,再次儲存後,彙編、連結、執行,觀察結果。
把填充的字資料,從0237H 改成0437H,再次儲存後,彙編、連結、執行,觀察結果。
猜測並分析,這個字資料中高位位元組裡存放的是什麼資訊,低位位元組裡存放的是什麼資訊
1)從0237H 改成0239H執行結果:
2)從0237H 改成0439H執行結果:
3)結果分析
1.修改填充資料低位數值時,顯示的字元內容發生了改變
2.修改填充資料高位數值時,顯示的顏色內容發生了改變
可分析得出這個字資料中高位位元組裡存放的是字元顏色資訊,低位位元組裡存放的是字元符號資訊。
實驗任務4
編寫完整彙編源程式,實現向記憶體0:200-0:23F依次傳送資料0-63(3FH)。
1、ex4.asm程式碼如下:
assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,200H
mov cx,40H
mov dx,0
s: mov [bx],dx
add dx,1H
add bx,1H
loop s
mov ah,4cH
int 21H
code ends
end
2、執行結果
首先使用了u命令反彙編,找到相關程式碼後使用g命令跳轉
最後用d命令查看了程式的修改結果,即記憶體0:200-0:23F的數值變化
3、選做內容
利用棧的特性,綜合使用loop,push實現(限定僅使用8086中已學過指令實現),編
寫源程式
1)ex4.asm程式碼如下:
assume cs:code
code segment
mov ax,20H
mov ss,ax
mov sp,40H
mov cx,32
mov dx,3f3eH
s: push dx
sub dx,0202H
loop s
mov ah,4cH
int 21H
code ends
end
2)執行結果
首先使用了u命令反彙編,找到相關程式碼後使用g命令跳轉
最後用d命令查看了程式的修改結果,即記憶體0:200-0:23F的數值變化
與前一部分不同在於,利用了棧的特性,將需要修改的記憶體地址設定為了棧段
實驗任務5
教材P121 實驗4(3)
1、填空後的ex5.asm程式碼如下:
assume cs:code
code segment
mov ax,cs ;此處填寫cs
mov ds,ax
mov ax,0020H
mov es,ax
mov bx,0
mov cx,17H ;此處填寫17H
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end
2、執行結果
1)反彙編檢視相關地址,並用g命令跳轉
2)使用u命令檢視相關內容是否成功複製
可以看到,mov ax,4c00H
之前的指令都成功複製到了記憶體0:200處
3、填空說明
1.閱讀程式碼可知,程式每次將cs:[bx]處的單位元組資料複製至es:[bx],而程式入口為cs:0,根據題目要求,將cs的值設為ds
2.如何確定cx?
可先輸入任意值,編譯連結後使用debug工具檢視相關反彙編程式碼,根據程式長度來確定cx的值,即迴圈次數。