1. 程式人生 > 實用技巧 >Python教程:跳出多層迴圈for、while

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的值,即迴圈次數。