实验4 汇编应用编程和c语言程序反汇编分析

实验任务一

源代码:

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回到原来的主函数当中,多个参数入栈时是后定义的数据先入栈。

 

posted @ 2020-12-15 18:01  影子_yrr  阅读(74)  评论(1编辑  收藏  举报