首页 > 编程语言 > 详细

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

时间:2020-12-18 10:03:40      阅读:39      评论:0      收藏:0      [点我收藏+]

四、实验结论

1. 实验任务1

此部分书写内容:
  • 源程序(辅以必要注释,或单独以文字简要说明实现思路)
  • 运行结果截图

源程序:

assume cs:code, ds:data
data segment
    db 77h,65h,6ch,63h,6fh,6dh,65h,20h,74h,6fh,20h,6dh,61h,73h,6dh,21h    ;ASCII码
    db 2h,24h,71h    ;颜色
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,0b872h    ;显示器中心区域的显存地址
    mov es,ax

    mov cx,16    ;16个字符循环16次
    mov di,0        ;data段中字符的偏移地址
    mov si,0        ;代表行数的偏移地址
    mov bx,16    ;data段中颜色的偏移地址
s:    mov al,ds:[di]    ;字符存入寄存器低位
    mov ah,ds:[bx]    ;第一行颜色属性存入高位
    mov es:[si],ax    ;第一行写入显存地址
    mov ah,ds:[bx+1]    ;第二行颜色属性存入高位
    mov es:[si+00a0h],ax    ;第二行写入显存地址
    mov ah,ds:[bx+2]    ;第三行颜色属性存入高位
    mov es:[si+0140h],ax    ;第三行写入显存地址
    inc di          ;下一个字符
    add si,2        ;显存地址移动
    loop s

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

运行:

技术分享图片

技术分享图片

 

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

运行结果:

技术分享图片

修改后:

技术分享图片

line19-22, line36-39,这组对称使用的push、pop,这样用的目的是什么?
push将寄存器中数据存入栈中保存跳转前的状态,pop将栈中寄存器数据取出恢复跳转前的状态
line30的功能是什么?
将cx中保存的字符颜色属性信息复制到显存地址区域

 

3. 实验任务3

此部分书写内容:
  • 附上子任务1的反汇编截图
  • 附上子任务2修改、完善后的完整汇编源代码,及,运行测试截图
子任务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 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整数结果为2020时:

技术分享图片

 

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实现的功能是?
循环接收键入字符并保存至数据段,直到读入“#”跳转至next程序
line21-27实现的功能是?
将已保存的字符个数作为循环次数进行循环读取数据段,从第一个字符开始依次输出
 

5. 实验任务5

此部分书写内容:

总结对这个简单的c代码反汇编后,你对反汇编出来的汇编指令分析的内容总结。可以包括但不限于以下内容的总结:

比如,高级语言中参数传递,从汇编的角度是如何传递的,返回值是如何返回的;多个参数的入栈顺序是什么样的;函数调用栈,等等。
结果截图:
技术分享图片

技术分享图片

 

参数传递时将值存入寄存器后push入栈,之后通过call命令跳转调用sum函数,通过访问[x]和[y]的实现相加,保存在eax寄存器中。调用函数时,参数从右向左入栈。

 

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

原文:https://www.cnblogs.com/litmu/p/14121671.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!