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


    一、实验目的

    1. 理解80×25彩色字符模式显示原理

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

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

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

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

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

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

     

    二、实验准备

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

    第9章 转移指令的原理

    第10章 call和ret指令

    第11章 标志寄存器

     

    三、实验内容

    1. 实验任务1 教材「实验9 根据材料编程」(P187-189)

    编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。

    代码如下:

    assume cs:code, ds:data
    data segment
        db 'welcome to masm!'
        db 2,36,113
    data ends
    
    code segment
    start:  
    	mov ax, data
    	mov ds, ax
    	
                    mov ax,0b800h
                    mov es,ax
                    mov di,0720h
                    mov cx,3
                    mov bx,0
                    mov si,0
    
    s0:            push cx
                    mov cx,16
                    mov si,0
    
    s1:            mov al,ds:[si]
                    mov ah,ds:[bx+16]
                    mov es:[di],ax
                    inc si
                    add di,2
                    loop s1
                 
                    inc bx 
                    pop cx
                    add di,128
                    loop s0
    
                    mov ah,4ch
                    int 21h
    
    code ends
    end start
    

     运行截图:

    2. 实验任务2

    编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。

    使用任意文本编辑器,录入汇编源程序task2.asm

    代码如下:

    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

    对源程序修改后的运行结果截图:

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

    答:保存各寄存器的值,防止在子程序中被修改。

    line30的功能是什么?

    答:将字符与颜色信息写入显存。

    3. 实验任务3

    使用任意文本编辑器,录入汇编源程序task3.asm。

    程序代码:

    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
    

     反汇编:

     

    使用g命令运行,并查看结果:

     子任务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
    

     结果截图:

     4. 实验任务4
    使用任意文本编辑器,录入汇编源程序task4.asm。
     代码:

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

      设置断点:

     反汇编:

     

  • 相关阅读:
    webpack初识
    Vue+ElementUi项目实现表格-单行拖拽
    promise/async与await 的执行顺序梳理
    MDN社区
    angularjs中的异步操作
    javascript中的字符串和数组的互转
    angularjs的练习题
    angularjs基础知识
    开发的两种方式
    ASP.NET中的HttpClient发送请求
  • 原文地址:https://www.cnblogs.com/wyf-blogs/p/14146620.html
Copyright © 2020-2023  润新知