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