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

实验任务1

(1)源程序:

assume cs:code, ds:data
data segment
        db 'welcome to masm!'
data ends

code segment
start:
        mov ax, data
        mov ds, ax
        mov ax, 0b800H
        mov es, ax
        mov si, 0
        mov di, 1824
        mov cx, 16
s:      mov al, [si]
        mov es:[di], al
        mov al, 2h
        mov es:[di+1], al
        inc si
        add di, 2
        loop s
    
        mov cx, 16
        mov si, 0
        add di, 128
s1:    mov al, [si]
        mov es:[di], al
        mov al, 24h
        mov es:[di+1], al
        inc si
        add di, 2
        loop s1

        mov cx, 16
        mov si, 0
        add di, 128
s2:    mov al, [si]
        mov es:[di], al
        mov al, 71h
        mov es:[di+1], al
        inc si
        add di, 2
        loop s2
    

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

任务1实现的关键在于找到打印的位置,为了放在中间,首先确定是11,12,13这三行,然后再取列的中间位置,将字符和颜色等属性赋值进去即可。关于显示字符的颜色,背景色等只需在指定的位置进行标记即可。

(2)运行结果截图:

 

实验任务2

(1)源代码:

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

(2)运行结果截图:

 代码修改后的运行结果:

 问题一:

为了保存bx,cx,si,di的值,因为随后在s的循环中这些寄存器都会被使用,值会发生改变,而用栈将这些值保存起来,在循环结束后可以使这些值复原,从而提高了寄存器的利用效率。

问题二:

line30的作用是将每次需要输入的字符以及其颜色配置信息赋值到指定的位置,从而使其在屏幕上显示。

 

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

(1)源代码:

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

(2)运行测试截图;

line12-19使用了int 21h的1号功能,不断的读入从键盘输入的字符,并通过比较判断是否出现#,出现#则继续后面的程序。
line21-27使用了int 21h的2号功能,从数据段不断的输出字符到屏幕上。

 

实验任务5:

反汇编截图:

 

从汇编的角度,参数先传递给相关的寄存器,这里是eax和ecx寄存器,返回值是是通过得到相加后结果的eax由ret指令返回。
本程序中参数的入栈顺序是从后往前;函数调用都会先用栈报错相关的参数,在函数结束时再用push进行复原操作。

 

实验总结:

(1)通过本次的上机实验,我理解了80×25彩色字符模式显示原理,并能够编写汇编指令在指定的位置显示字符并设置显示的形式;

(2)对于jmp, je, jcxz等跳转指定可以熟练使用,并可以用这些指定设计简单的逻辑程序;

(3)掌握了call, ret等指令的用法,并可以编写简单的函数进行调用;

(4)了解了在visual studio环境反汇编c语言程序的方法,并简单分析编译器反汇编生成的代码;

(5)对于高级语言反汇编参数传递,返回值的返回,参数入栈顺序等过程有了一定的了解。

posted @ 2020-12-12 16:03  gank007  阅读(82)  评论(2)    收藏  举报