1. 程式人生 > 實用技巧 >多檢視幾何三維重建實戰系列- Cascade-MVSNet

多檢視幾何三維重建實戰系列- Cascade-MVSNet

四、實驗結論

1.實驗任務1

編寫8086彙編源程式ex1.asm。原始碼如下:

 1 ;ex1.asm
 2 assume cs:code
 3 code segment
 4     mov ax, 0b810h
 5     mov ds, ax
 6 
 7     mov byte ptr ds:[0], 1
 8     mov byte ptr ds:[1], 1
 9     mov byte ptr ds:[2], 2
10     mov byte ptr ds:[3], 2
11     mov byte ptr ds:[4], 3
12     mov byte ptr ds:
[5], 3 13 mov byte ptr ds:[6], 4 14 mov byte ptr ds:[7], 4 15 16 mov ah, 4ch 17 int 21h 18 code ends 19 end

使用masm、link對ex1.asm進行彙編、連結,得到可執行檔案ex1.exe,執行並觀察結果。要注意命令列結尾加上分號,跳過中間檔案的生成。

執行檔案載入後暫存器CX的值,使用u命令精確反彙編。CX中存放程式的長度。

檢視PSP的命令及截圖。

使用g命令執行到line16退出執行之前。

2.實驗任務2

編寫8086彙編源程式ex2.asm。原始碼如下:

 1 ; ex2.asm
 2 assume cs:code
 3 code segment
 4     mov ax, 0b810h
 5     mov ds, ax
 6     mov bx, 0
 7     mov ax, 101H
 8     mov cx, 4
 9 s: mov [bx], ax
10     add bx, 2
11     add ax, 101H
12     loop s
13     mov ah,4ch
14     int 21h
15 code ends
16 end

使用masm、link工具彙編、連結的命令列及執行結果截圖。

結合可執行檔案載入後暫存器CX的值,使用u命令精確反彙編截圖。

對ex2.exe進行除錯.

單步除錯,發現頻幕上並沒有顯示圖案,猜測既有螢幕滾動重新整理的原因,也有單步除錯本身中斷機制的處理原因。

清屏,使用g命令執行,結果能正常顯示。

分析、對比ex2.asm和ex1.asm,它們實現相同的功能和效果,ex1重複使用mov指令向記憶體單元中寫入資料,ex2使用loop指令來實現迴圈功能,CX中存放迴圈次數,可以簡化程式,節省程式碼量。

把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,儲存後重新彙編、連結、執行並觀察結果。

3.實驗任務3

綜合使用loop,[bx],編寫完整彙編程式,實現向記憶體b800:07b8開始的連續16個字單元重複填充字資料 0237H。

 1 ;ex3.asm
 2 assume cs:code
 3 code segment
 4     mov ax,0b800h
 5     mov ds,ax
 6     mov bx,07b8h
 7     mov cx,16
 8   s:mov [bx],0237h
 9     add bx,2
10     loop s
11 
12     mov ah,4ch
13     int 21h
14 code ends
15 end

執行結果如圖所示。

把填充的字資料,從0237H 改成0239H,再次儲存後,彙編、連結、執行,觀察結果。

把填充的字資料,從0237H 改成0437H,再次儲存後,彙編、連結、執行,觀察結果。

猜測分析,這個字資料中高位位元組裡存放顯示內容的顏色,低位位元組裡存放的是顯示的數字。

4.實驗任務4

(1)編寫完整彙編源程式,實現向記憶體0:200~0:23F依次傳送資料0~63(3FH)

 1 ;ex4.asm
 2 assume cs:code
 3 code segment
 4     mov ax,0020h
 5     mov ds,ax
 6     mov bx,0
 7 
 8     mov cx,64
 9     s:mov [bx],bl
10     add bx,1
11     loop s
12 
13     mov ah,4ch
14     int 21h
15 code ends
16 end

執行完,使用d命令檢視資料是否成功寫入記憶體中。

(2)利用棧的特性,綜合使用loop,push實現(限定僅使用8086中已學過指令實現),編寫源程式

 1 ;ex4_2.asm
 2 assume cs:code
 3 code segment
 4     mov ax,0020h
 5     mov ss,ax
 6     mov sp,40h
 7 
 8     mov bx,3f3eh
 9     mov cx,32
10   s:push bx
11     sub bx,202h
12     loop s
13 
14     mov ah,4ch
15     int 21h
16 code ends
17 end

用d命令檢視的時候,要注意先把ds暫存器指向當前段地址,然後才能看到正確位置的資料。

5.實驗任務5

 1 ;ex5.asm
 2 assume cs:code
 3 code segment
 4     mov ax,cs
 5     mov ds,ax
 6     mov ax,0020h
 7     mov es,ax
 8     mov bx,0
 9     mov cx,17h
10   s:mov al,[bx]
11     mov es:[bx],al
12     inc bx
13     loop s
14     mov ah,4ch
15     int 21h
16 code ends
17 end

實驗要求將程式的程式碼按位元組複製,cs段暫存器中儲存的是指向程式程式碼段的段地址,故將cs暫存器中的指向程式碼的段地址賦值給ax,再通過ax暫存器賦值給ds段暫存器。

使用r命令顯示暫存器狀態,CX儲存整個程式程式碼所佔位元組數,CX=001Bh。

使用u命令顯示彙編指令,求出需要複製的機器碼位元組數。

mov ah,4ch 和 int 21h 這兩條指令共佔用了4個位元組,所以本實驗中需要複製的程式碼位元組數是 001bh - 0004h = 0017h 個位元組,故CX暫存器賦值為17h。

實驗結果測試,分別使用d命令檢視資料段地址0:200後的16h個位元組,程式碼段地址後的16h個位元組,對比發現兩者是一樣的。

五、實驗總結

  1. 綜合應用loop, [bx], inc指令實現迴圈,能簡化彙編源程式。inc指令實現的功能相當於C語言中的++自增運算,在真正程式設計實現時通常需要藉助運算子指定其單元屬性,即: 位元組單元還是字單元。(使用byte, word, dword等)
  2. 記憶體單元運算元在反彙編中的問題。在debug中使用a命令編寫彙編指令經過反彙編記憶體單元運算元與寫入時相同,但是在完整的彙編源程式.asm檔案中編寫相同的程式碼,在debug中反彙編.exe檔案後得到的指令碼與寫入不同。解決辦法:在完整彙編源 程式中,顯式寫出段字首,或者使用一個暫存器存放偏移地址,通過間接定址的方式得到記憶體單元中的運算元。
  3. 尚存在的問題:在實驗任務1和實驗任務2中向視訊記憶體中寫入資料,在單步除錯時發現螢幕上並沒有看見圖案,但是當清屏後使用-g命令執行到int前,螢幕上能顯示出圖案。猜測可能是螢幕滾動重新整理的原因,也有可能是單步除錯本身中斷機制的處理原因,在不同系統下可能還會有更多不同的情況。