Autossh打洞
阿新 • • 發佈:2020-12-15
實驗任務一
原始碼:
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 smov 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, 0b800Hmov 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回到原來的主函式當中,多個引數入棧時是後定義的資料先入棧。