1. 程式人生 > 實用技巧 >Autossh打洞

Autossh打洞

實驗任務一

原始碼:

assume cs:code, ds:data
data segment
    db 'welcome to masm!';資料
data ends
code segment
start:
    mov ax,data
    mov ds,ax

    mov bx,0
    mov cx,16
    mov ax,0b800h
    mov es,ax;顯示的段地址
    mov si,0720h
s:    mov ah,02h;綠色字
    mov al,[bx];存入資料
    mov es:[si],ax
    add si,2
    inc bx
    loop s
    
    
mov cx,16 mov bx,0 mov si,07c0h s1: mov ah,24h;同上一樣 mov al,[bx] mov es:[si],ax add si,2 inc bx loop s1 mov cx,16 mov bx,0 mov si,0860h s2: mov ah,71h;同上一樣 mov al,[bx] mov es:[si],ax add si,2 inc bx loop s2 mov ax,4c00h int 21h code ends end start

結果:

實驗任務二

源程式:

assume cs:code, ds:data
data segment
    str db 'try', 0
data ends

code segment
start:  
    mov ax, data
    mov ds, ax

    mov si, offset str
    mov al, 2
    call printStr

    mov ah, 4ch
    int 21h

printStr:
    push bx
    push cx
    push si
    push di

    mov bx, 0b800H
    
mov es, bx mov di, 0 s: mov cl, [si] mov ch, 0 jcxz over mov ch, al mov es:[di], cx inc si add di, 2 jmp s over: pop di pop si pop cx pop bx ret code ends end start

結果:

修改後:

push和pop的組合使用是為了保留現場,防止在進行修改後出現問題,卻又無法回到原始位置。

line30是為了將數值和顏色送入視訊記憶體中。

實驗任務三

反彙編截圖:

程式碼:

assume cs:code, ds:data
data segment
        x dw 1984
        str db 16 dup(0)
data ends

code segment
start:  
        mov ax, data
        mov ds, ax
        mov ax, x
        mov di, offset str
        call num2str
  
        mov si,offset str
    mov al,2
    call printStr

        mov ah, 4ch
        int 21h

num2str:
        push ax
        push bx
        push cx
        push dx
        
        mov cx, 0
        mov bl, 10
s1:      
        div bl
        inc cx
        mov dl, ah
        push dx
        mov ah, 0
        cmp al, 0
        jne s1
s2:        
        pop dx
        or dl, 30h
        mov [di], dl
        inc di
        loop s2
        
        pop dx
        pop cx
        pop bx
        pop ax

        ret

printStr:
    push bx
    push cx
    push si
    push di

    mov bx, 0b800H
    mov es, bx
    mov di, 0
s:      mov cl, [si]
    mov ch, 0
    jcxz over
    mov ch, al
    mov es:[di], cx
    inc si
    add di, 2
    jmp s

over:   pop di
    pop si
    pop cx
    pop bx
    ret
code ends
end start

結果:

實驗任務四

原始碼:

assume cs:code, ds:data
data segment
        str db 80 dup(?)
data ends

code segment
start:  
        mov ax, data
        mov ds, ax
        mov si, 0

s1:        
        mov ah, 1
        int 21h
        mov [si], al
        cmp al, '#'
        je next
        inc si
        jmp s1
next:
        mov cx, si
        mov si, 0
s2:     mov ah, 2
        mov dl, [si]
        int 21h
        inc si
        loop s2

        mov ah, 4ch
        int 21h
code ends
end start

結果:

line12-19實現了輸入字串,直到輸入了一個“#”代表輸入結束。

line21-27實現了將字串輸出到螢幕上。

實驗任務五

反彙編:

#include <stdio.h>
int sum(int, int);
int main() {
008C13B0  push        ebp  
008C13B1  mov         ebp,esp  
008C13B3  sub         esp,0E4h  
008C13B9  push        ebx  
008C13BA  push        esi  
008C13BB  push        edi  
008C13BC  lea         edi,[ebp-0E4h]  
008C13C2  mov         ecx,39h  
008C13C7  mov         eax,0CCCCCCCCh  
008C13CC  rep stos    dword ptr es:[edi]  
int a = 2, b = 7, c;
008C13CE  mov         dword ptr [a],2  
008C13D5  mov         dword ptr [b],7  
c = sum(a, b);
008C13DC  mov         eax,dword ptr [b]  
008C13DF  push        eax  
008C13E0  mov         ecx,dword ptr [a]  
008C13E3  push        ecx  
008C13E4  call        sum (8C105Ah)  
008C13E9  add         esp,8  
008C13EC  mov         dword ptr [c],eax  
return 0;
008C13EF  xor         eax,eax  
}
008C13F1  pop         edi  
008C13F2  pop         esi  
008C13F3  pop         ebx  
008C13F4  add         esp,0E4h  
008C13FA  cmp         ebp,esp  
008C13FC  call        @ILT+305(__RTC_CheckEsp) (8C1136h)  
008C1401  mov         esp,ebp  
008C1403  pop         ebp  
008C1404  ret  

int sum(int x, int y) {
008C1420  push        ebp  
008C1421  mov         ebp,esp  
008C1423  sub         esp,0C0h  
008C1429  push        ebx  
008C142A  push        esi  
008C142B  push        edi  
008C142C  lea         edi,[ebp-0C0h]  
008C1432  mov         ecx,30h  
008C1437  mov         eax,0CCCCCCCCh  
008C143C  rep stos    dword ptr es:[edi]  
return (x + y);
008C143E  mov         eax,dword ptr [x]  
008C1441  add         eax,dword ptr [y]  
}
008C1444  pop         edi  
008C1445  pop         esi  
008C1446  pop         ebx  
008C1447  mov         esp,ebp  
008C1449  pop         ebp  
008C144A  ret  

總結:

從彙編角度來看,引數傳遞是將引數儲存到記憶體單元,然後使用暫存器來調參使用,返回值是存入到eax中,再使用call和ret回到原來的主函式當中,多個引數入棧時是後定義的資料先入棧。