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

一、实验结论

实验过程中使用到的盘符注明为v。

实验一:

实验任务(1):教材「实验9 根据材料编程」(P187-189) 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。

assume cs:code,ds:data
data segment
    db 'Welcome to masm!'
    db 02h,24h,71h
data ends
code segment
start:
    mov bx,0b800h
    mov es,bx
    mov bx,data
    mov ds,bx
    mov cx,16
    mov di,0
    mov si,1824
s1:mov bx,ds:[16]
    mov es:[si],al
    add di,1  
    mov bx,ds:[di]
    mov es:[si],al
    add si,1
    add si,1
    loop s1
    mov cx,16
    mov si,1984
    mov di,0
s2: mov bx,ds:[17]
    mov es:[si],al
    add di,1
    mov bx,ds:[di]
    mov es:[si],al
    add si,1
    add si,1
    loop s2
    mov cx,16
    mov si,2144
    mov di,0
s3:mov bx,ds:[18]
    mov es:[si],al
    add di,1 
    mov bx,ds:[di]
    mov es:[si],al
    add si,1
    add si,1
    loop s3
    mov ah,4ch
    int 21h
code ends
end start

编译连接

 

 运行

 

实验任务(2):编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。录入编译源程序task2.asm

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

编译连接

运行结果

对源程序做如下修改:

把line3改为:

str db 'another try', 0

把line12改为:

mov al, 4

再次汇编、运行程序,观察运行结果。

 

 

 基于运行结果,理解源代码,以及,组合使用转移指令call和ret实现子程序的原理与方法。具体地,在line18-40中:

line19-22, line36-39,这组对称使用的push、pop,这样用的目的是什么?

用栈保存子程序执行之前的寄存器,子程序执行结束后,让程序能够继续执行。这样的保护恢复能更好利用寄存器。

 

line30的功能是什么?

将cx寄存器中的字符颜色和字型转移到es寄存器和di寄存器指示的显存地址中。

实验任务(3):使用任意文本编辑器,录入汇编程序task3.asm

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 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
code ends
end start

编译连接

 

 

执行debug

 

使用-u命令进行反汇编

 

 

使用-g命令执行到程序的退出之前,也就是line15之前

 

 

使用-d命令查看内存内容

 

 

转换后的数字字符串1984成功被放入了str标号之后的内存单元

修改后重新汇编连接

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

执行结果

 

 

更改line3中整数为任意数值更改为2077

 

 

 实验任务(4):使用任意文本编辑器,录入汇编源程序task4.asm。

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实现的功能是?

功能是循环读入字符串,在输入检测到#的时候跳出执行子程序,向next段执行   

line21-27实现的功能是?

将复制的数据段输出到屏幕对应内存上

实验任务(5):在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。代码如下:

#include<stdio.h>
int sum(int,int);

int main(){
    int a = 2, b = 7 , c;
    
    c = sum(a,b);

    return 0;
}

int sum(int x, int y){
    return (x + y);
}

在line7, line13分别设置断点,在调试模式下,查看反汇编代码。

设置断点:

 

 

 反汇编

 

 

--- c:\users\red\documents\visual studio 2012\projects\project1\project1\源.cpp -
#include<stdio.h>
int sum(int,int);

int main(){
009C1410  push        ebp  
009C1411  mov         ebp,esp  
009C1413  sub         esp,0E4h  
009C1419  push        ebx  
009C141A  push        esi  
009C141B  push        edi  
009C141C  lea         edi,[ebp-0E4h]  
009C1422  mov         ecx,39h  
009C1427  mov         eax,0CCCCCCCCh  
009C142C  rep stos    dword ptr es:[edi]  
    int a = 2, b = 7 , c;
009C142E  mov         dword ptr [a],2  
009C1435  mov         dword ptr [b],7  
    
    c = sum(a,b);
009C143C  mov         eax,dword ptr [b]  
009C143F  push        eax  
009C1440  mov         ecx,dword ptr [a]  
009C1443  push        ecx  
009C1444  call        sum (09C105Fh)  
009C1449  add         esp,8  
009C144C  mov         dword ptr [c],eax  

    return 0;
009C144F  xor         eax,eax  
}
009C1451  pop         edi  
}
009C1452  pop         esi  
009C1453  pop         ebx  
009C1454  add         esp,0E4h  
009C145A  cmp         ebp,esp  
009C145C  call        __RTC_CheckEsp (09C113Bh)  
009C1461  mov         esp,ebp  
009C1463  pop         ebp  
009C1464  ret  

分析反汇编代码,从汇编的角度,观察高级语言中参数传递和返回值是通过什么实现的,以及,参数入栈顺序,返回值的带回方式,等等:

原理:高级语言中的形参列表是从右往左进行压栈的,接下来利用call函数调用子程序。当进行函数调用的时候,参数从右到左进入寄存器,call命令调用返回函数内部。进行运算后返回,寄存器的运算值回到存储值得寄存器中完成了一次完整的函数执行。

二、实验总结:

1、学习了如何在屏幕不同位置显示字符。

2、了解学习了跳转指令

3、在高级语言反汇编学习中,初步了解了汇编连接的原理。

posted @ 2020-12-13 15:04  无口赤红  阅读(108)  评论(1编辑  收藏  举报