码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-12-21 11:30:09      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:查看   alt   结束   输出   设置   环境   测试   键盘   之间   

四、实验结论

1. 实验任务1

 源代码

assume cs:code,ds:data
data segment
    db welcome to masm!
data ends
code segment
start:    mov ax,data
    mov ds,ax
    mov ax,0b800h                      ;显示缓冲区的起始地址
    mov es,ax
    mov bx,0720h                       ;设置中间行中间列的首地址

    mov si,0                           ;指向显存
    mov cx,16                          ;共16个字符,循环16次
s:    mov ax,ds:[si]
    mov ah,2h
    mov es:[bx],ax                     ;设置绿色字体
    mov ah,24h
    mov es:[bx+0a0h],ax                ;设置绿底红色
    mov ah,71h
    mov es:[bx+0a0h+0a0h],ax           ;设置白底蓝色
    inc si                             ;指向下一个字符
    add bx,2                           ;指向下一个显存单元
    loop s

    mov ax,4c00h
    int 21h
code ends
end start

运行结果截图

技术图片

2. 实验任务2

源程序

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的功能是什么?

答:设置字符颜色属性

3. 实验任务3

子任务1的反汇编截图

技术图片

技术图片

子任务2修改、完善后的完整汇编源代码

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,0b800h
        mov es,ax
        mov ax, x
        mov di, offset str        
        mov si,0
        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
        mov dh,2
        mov es:[si],dx
        add si,2
        inc di
        loop s2
        
        pop dx
        pop cx
        pop bx
        pop ax

        ret
code ends
end start

运行测试截图

技术图片

把task3.asm源代码中,line3中整数改成0~2559之间的任意数值,运行测试,观察结果。

技术图片

4. 实验任务4

程序源代码

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

汇编、链接、运行程序,输入一个字符串并以#结束(比如,2020, bye#)观察运行结果

技术图片

结合运行结 果,理解程序功能,了解软中断指令。具体地:

line12-19实现的功能是?

答:将键盘输入字符存到指定的栈内,如果遇到‘#‘字符,则通过转移指令中断

 

line21-27实现的功能是?

答:在屏幕上输出栈内字符

5. 实验任务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分别设置断点,在调试模式下,查看反汇编代码。

技术图片

技术图片

分析反汇编代码可知,从汇编角度,高级语言中参数传递和返回值是通过栈实现的。参数传递顺序:先将参数b入栈,再将参数a入栈,都是借助寄存器完成的。

 

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

标签:查看   alt   结束   输出   设置   环境   测试   键盘   之间   

原文地址:https://www.cnblogs.com/lj0512/p/14133900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!