XOR和路徑 高斯消元+期望
實驗任務1
原始碼檔案task1.asm
assume cs:code, ds:data data segment db 'Nuist' db 2,3,4,5,6 data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si]mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
執行結果截圖:
彙編、連結並執行task1.asm:
使用debug工具執行到程式返回前的結果:
修改line4裡5個位元組單元的值,重新彙編、連結、執行,觀察結果:
基於觀察,分析、猜測這裡的data段line4數值作用是控制顯示字元顏色的數值碼。
實驗任務2
原始碼檔案task2.asm:
assume cs:code, ds:data data segment db23, 50, 66, 71, 35 data ends code segment start: mov ax, data mov ds, ax mov cx, 5 mov si, 0 mov bl,10 mov ax,0b900H mov es,ax mov di,0f00H s: mov al, [si] mov ah,0 div bl add al,48 add ah,48 mov es:[di],al mov es:[di+1],ah mov ah, 2 mov dl, es:[di] int 21h mov ah, 2 mov dl, es:[di+1] int 21h mov ah, 2 mov dl, 32 int 21h inc si add di,2 loop s mov ah, 4ch int 21h code ends end start
執行結果截圖:
實驗任務3
原始碼檔案task3.asm:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
彙編、連結並執行程式的截圖:
(1)CPU執行程式,程式返回前,data段中的資料為如下所示
反彙編的結果:
執行到程式退出前,用d命令檢視data段的資料:
(2)CPU執行程式,程式返回前,cs=076C、ss=076B、ds=076A
執行到程式返回前的各個暫存器的資料:
(3)設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1
單步除錯檢視各個段暫存器儲存的資料:
實驗任務4
原始碼檔案task4.asm:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
彙編、連結並執行程式的截圖:
(1)CPU執行程式,程式返回前,data段中的資料為如下所示
反彙編,執行到程式返回前,用d命令檢視data段中的資料:
(2)CPU執行程式,程式返回前,cs=076C、ss=076B、ds=076A
執行到程式返回前各個段暫存器的資料:
(3)設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1
單步除錯檢視各個段暫存器儲存的資料:
(4)對於如下定義的段:
name segment
...
name ends
如果段中的資料佔N個位元組,則程式載入後,該段實際佔有的空間為16位元組。
實驗任務5
原始碼檔案task5.asm:
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end
彙編、連結並執行程式的截圖:
(1)CPU執行程式,程式返回前,data段中的資料為如下所示
反彙編,執行到程式返回前,用d命令檢視data段中的資料:
(2)CPU執行程式,程式返回前,cs=076A、ss=076E、ds=076D
執行到程式返回前各個段暫存器的資料:
(3)設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4
單步除錯檢視各個段暫存器儲存的資料:
實驗任務6
第(3)題的程式仍然可以正確執行,因為沒有start指明程式的入口,程式將按照順序執行,第(1)(2)題的程式資料段位於程式碼段的前面,所以資料段的資料會被當成指令被編譯執行,雖然可能也會正確執行但會產生一些錯誤,但第(3)題資料段位於程式碼段的後面,按順序執行不影響源程式的目的,並且會在程式碼段最後返回結果,不執行後面的資料段。
實驗任務7
原始碼檔案task7.asm:
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment ; db 8 dup(0) c ends code segment start: mov ax,a mov ds,ax mov ax,c mov es,ax mov cx,8 mov di,0 s: mov dl,ds:[di] mov es:[di],dl inc di loop s mov ax,b mov ds,ax mov cx,8 mov di,0 s0: mov dl,es:[di] add dl,ds:[di] mov es:[di],dl inc di loop s0 mov ah,4ch int 21h code ends end start
彙編、連結並執行程式的截圖:
使用debug檢視當前暫存器的資料:
使用u反彙編:
使用g命令執行到程式返回前,並檢視段c的資料:
實驗任務8
原始碼檔案task8.asm:
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,b mov ss,ax mov sp,10H mov cx,8 mov di,0 mov ax,a mov ds,ax s: push ds:[di] add di,2 loop s mov ah,4ch int 21h code ends end start
彙編、連結並執行程式的截圖:
檢視暫存器的資料並用u命令反彙編:
用g命令執行到程式返回前並檢視段b的資料:
實驗總結
(1)掌握了更多指令的使用方法和注意點。
(2)學會使用div命令和asc碼與數值的關係及系統呼叫來將數字輸出成字元。
(3)瞭解了系統在分配資料段中的儲存地址時總是會分配16的倍數,方便CPU數位對齊處理。
(4)編寫彙編程式時注意數字的進位制,最好在16位進位制後加上h,否則容易混淆。dosbox中出現的資料均為十六進位制。
(5)使用分段的程式可以使資料和程式碼分離,同時需要在結束時指明程式的入口。