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

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


 1. 实验任务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,0B872h
        mov es,ax

        mov cx,3               
        mov bx,0              
s:
        push cx
        mov cx,16              
        mov si,0
        mov di,0              
s0:
        mov al,ds:[di]           
        mov ah,ds:[bx+16]                    
        mov es:[si],ax
        add si,2
        inc di
        loop s0

        pop cx
        mov ax,es
        add ax,00ah              
        mov es,ax 
        inc bx
        loop s

        mov ax,4c00h
        int 21h

code ends

end start

  运行截图:

  思路分析:

  主要把握住两个方面:放什么数据到显存里?放到显存空间的什么位置?

  放什么很清楚了:welcome to masm!但是要注意到底色和字体颜色,通过教材189页的属性字节格式可以推出黑底绿字为:02H、绿底红字为:24H、白底蓝字为:71H。以上数据存入data段备用。

  放到那里也好分析,25行的靠中三行为11、12、13行,所以根据显存空间表可以查到11行的十进制偏移地址为1760~1919。接下来确定列,输入数据一共占了32字节,所以起始位置十进制偏移地址为1824(十六进制720)。所以可以确定写入的起始段地址为B8720。

  剩下部分就是借用双重循环将数据扫描式写入显存空间。


 2. 实验任务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

  运行截图:

   分析:

  • 目的是用栈暂存寄存器状态,因为子程序内部改动了bx和cx的值,最后子程序结束时将寄存器复原,以免出现意外情况。
  • 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, 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

  运行截图:

 

   源程序代码:

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

        ret
code ends
end start

 

 


 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

  运行截图:

   分析:

  • line12-19实现的功能是:循环读入并保存键盘输入字符,直到遇到”#“跳转。
  • line21-27实现的功能是:next将字符串长度告知cx,s2将输入字符串原样输出。

 5. 实验任务5

此部分书写内容:

  • 总结对这个简单的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);
}

   反汇编查看:

   分析:Line、Line8两行使用mov指令将变量存入寄存器,从我的反汇编中暂未观察到变量寄存器入栈的语句,,之后使用call与ret进入sum函数求和后通过有关寄存器返回求和值。

posted @ 2020-12-10 20:05  max)  阅读(189)  评论(3)    收藏  举报