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

四、实验结论

1. 实验任务1

源程序:

assume cs:code,ds:data
data segment
    db 'Welcome to masm!'
    db 16 dup(2)    ;绿色
    db 16 dup(36)    ;绿底红色
    db 16 dup(113)    ;白底蓝色
data ends

stacksg segment
    dw 8 dup(0)    ;栈段用来临时存放cx
stacksg ends

code segment
start:    mov ax,data
    mov ds,ax    ;data段地址送到ds

    mov ax,stacksg
    mov ss,ax    ;stacksg段地址送到ss
    mov sp,16

    mov ax,0b800h    ;显存地址送到es
    mov es,ax

    mov bx,16
    mov bp,0
    mov cx,3    ;外层循环3次

s0:    push cx    ;外层循环cx值入栈
    mov si,0
    mov di,1824    ;显存地址:行:(25-3)/2=11,列:11*160+(160-32)/2
    mov cx,16    ;内层循环16次

s:    mov al,[si]
    mov es:[bp+di],al    ;ascll码数据放入显存地址
    mov al,[bx+si]
    mov es:[bp+di+1],al    ;属性数据放入显存地址
    inc si
    add di,2
    loop s

    add bx,16    ;内存地址换行
    add bp,160    ;显存地址换行
    pop cx    ;从栈顶弹出原cx的值,恢复cx
    loop s0

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

运行结果截图

2. 实验任务2

源程序

 1 assume cs:code, ds:data
 2 data segment
 3     str db 'another try', 0
 4 data ends
 5 
 6 code segment
 7 start:  
 8     mov ax, data
 9     mov ds, ax
10 
11     mov si, offset str
12     mov al, 4
13     call printStr
14 
15     mov ah, 4ch
16     int 21h
17 
18 printStr:
19     push bx
20     push cx
21     push si
22     push di
23 
24     mov bx, 0b800H
25     mov es, bx
26     mov di, 0
27 s:      mov cl, [si]
28     mov ch, 0
29     jcxz over
30     mov ch, al
31     mov es:[di], cx
32     inc si
33     add di, 2
34     jmp s
35 
36 over:   pop di
37     pop si
38     pop cx
39     pop bx
40     ret
41 
42 code ends
43 end start

运行结果截图

把line3改为: str db 'another try', 0

把line12改为:mov al, 4

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

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

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

实现数据的暂存,可用的寄存器有限,将一些寄存器中的数据暂存起来,在子程序中使用寄存器就不会影响原来的值
line30的功能是什么?

mov ch,al:设置字符的属性

3. 实验任务3

子任务1

子任务2
对task3.asm源代码进行修改、完善,实现对转换后的字符串进行输出。

 1 assume cs:code, ds:data
 2 data segment
 3         x dw 2001
 4         str db 16 dup(0)
 5 data ends
 6 
 7 code segment
 8 start:  
 9         mov ax, data
10         mov ds, ax
11         mov ax,0b800H
12         mov es,ax
13         mov ax, x
14         mov di, offset str
15         mov si,0
16         call num2str
17 
18         mov ah, 4ch
19         int 21h
20 
21 num2str:
22         push ax
23         push bx
24         push cx
25         push dx
26         
27         mov cx, 0
28         mov bl, 10
29 s1:      
30         div bl
31         inc cx
32         mov dl, ah
33         push dx
34         mov ah, 0
35         cmp al, 0
36         jne s1
37 s2:        
38         pop dx
39         or dl, 30h
40         mov [di], dl
41         mov dh,2
42         mov es:[si],dx    ;添加的代码
43         inc di
44         add si,2
45         loop s2
46         
47         pop dx
48         pop cx
49         pop bx
50         pop ax
51 
52         ret
53 code ends
54 end start

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

4. 实验任务4

程序源代码

 1 assume cs:code, ds:data
 2 data segment
 3         str db 80 dup(?)
 4 data ends
 5 
 6 code segment
 7 start:  
 8         mov ax, data
 9         mov ds, ax
10         mov si, 0
11 
12 s1:        
13         mov ah, 1
14         int 21h
15         mov [si], al
16         cmp al, '#'
17         je next
18         inc si
19         jmp s1
20 next:
21         mov cx, si
22         mov si, 0
23 s2:     mov ah, 2
24         mov dl, [si]
25         int 21h
26         inc si
27         loop s2
28 
29         mov ah, 4ch
30         int 21h
31 code ends
32 end start

运行测试截图

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

line12-19实现的功能是?

从键盘输入字符,遇到'#'通过转移指令中断

line21-27实现的功能是?

输出栈内的字符

5. 实验任务5

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

 1 #include <stdio.h>
 2 int sum(int, int);
 3 
 4 int main() {
 5     int a = 2, b = 7, c;
 6 
 7     c = sum(a, b);
 8 
 9     return 0;
10 }
11 
12 int sum(int x, int y) {
13     return (x + y);
14 }

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

总结对这个简单的c代码反汇编后,你对反汇编出来的汇编指令分析的内容总结。

参数传递和返回值是通过栈实现的

参数传递:形参参数入栈自右向左。先借助寄存器,将参数b 的地址压入堆栈寄存器eax,再将参数a 的值压入堆栈寄存器ecx

通过 call 指令调用函数sum,ret指令实现函数返回

每次调用需将原始的ss sp si di入栈,实现数据的暂存,返回后再将这些数据弹出,函数相当于子程序

 

posted @ 2020-12-14 00:11  wyyhhh  阅读(75)  评论(1编辑  收藏  举报