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

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

一、实验目的

  1、理解80*25彩色字符模式显示原理

  2、理解转移指令jmp,loop,jczx的跳转原理,掌握使用其实现分支和循环的方法

  3、理解转移指令call, ret, retf的跳转原理,掌握组合使用call和ret/retf编写汇编子程序的方法,掌握参数传递方式

  4、理解标志寄存器的作用

  5、理解条件转移指令je,ja,jb,jp,jl等的跳转原理,掌握组合使用汇编指令cmp和条件转移指令实现分支和循环的方法

  6、了解在visual studio/Xcode等环境或利用gcc命令行参数反汇编c语言程序的方法,理解编译器生成的反汇编代码

  7、综合应用寻址方式和汇编指令完成应用编程

二、实验准备

  实验前,请复习/学习教材以下内容:

  第9章 转移指令的原理

  第10章 call和ret指令

  第11章 标志寄存器

三、实验结论

  1、实验任务一

  源代码如下:

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

  运行截图如下:

  

 

   首先定义好要显示的文字和文字央视,然后将通过间隔的方式先移动文字再移动样式到指定的区域,一行字又16个所以循环16次,由于又三行数量较少就采用直接复制代码的方式编写下面两行,只需改变位置和样式即可

  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

  运行结果如下

  

 

   将lin3改为

str db 'another try', 0 

  将lin12改为

mov al, 4 

  运行结果如下:

  

 

   问题1:保留寄存器的值便于下次循环使用

   问题2:line30是将cx的内容写入显存

  3、实验任务三

  源代码如下

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

  1)子任务1:

  运行截图如下

  

 

   

 

  

 

   1984放在了str标号的后面

  2)子任务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, 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 ax,0b800h
        mov es,ax
        mov ax,[di]
        mov es:[si],al
        add si,2
        inc di
        loop s2
        
        pop dx
        pop cx
        pop bx
        pop ax

        ret
code ends
end start

  运行结果如下

  

 

   修改数字运行结果如下

  

 

  输出中并未添加样式,所以显示白字

  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

  运行结果如下

  

 

   

 

  问题1:从键盘中输入字符,并比较如果不是#就继续输入

  问题2:将输入的字符输出

  5、实验任务五

  源代码如下:

#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);
}

  反汇编截图如下

  

  

   问题:参数传递是通过eax寄存器来实现的,返回值也是通过eax寄存器来传递的,参数的入栈顺序是先b入栈然后才是a入栈

posted @ 2020-12-12 14:05  Sunnynight  阅读(129)  评论(2)    收藏  举报