1. 程式人生 > 實用技巧 >XOR和路徑 高斯消元+期望

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
    db 
23, 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)使用分段的程式可以使資料和程式碼分離,同時需要在結束時指明程式的入口。