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

实验任务1

源代码

stack segment
    dw 8 dup(0) ;存放cx
stack ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,0b800h
    mov es,ax        ;显存段地址
    mov ax,stack
    mov ss,ax
    mov sp,16

    mov bx,16        ;颜色段起始地址
    mov di,24
    mov cx,3
s:    push cx
    mov cx,16
    mov bp,ds:[di]    ;设置显存起始地址
    mov si,0        ;输出句子的首地址

s0:    mov al,ds:[si]
    mov ah,ds:[bx]    ;设置颜色
    mov es:[bp],ax
    add bp,2        ;下一个字单元
    inc si
    loop s0
    
    pop cx
    add bx,1
    add di,2
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start

运行结果:

 

 实验任务2

 源代码

assume cs:code, ds:data
data segment
    str db 'another try', 0
data ends

code segment
start:  
    mov ax, data
    mov ds, ax
            ;10
    mov si, offset str
    mov al, 4
    call printStr

    mov ah, 4ch
    int 21h

printStr:
    push bx
    push cx        ;20
    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        ;30
    mov es:[di], cx
    inc si
    add di, 2
    jmp s

over:   pop di
    pop si
    pop cx
    pop bx
    ret        ;40

code ends
end start

 

运行截图:

 

 

 

 问题1:将bx,cx,si,di的数据放到栈中因为在主程序中我们需要这些寄存器,放在栈中程序结束后我们可以将数据还原到各个栈中。

问题2:line30设置输出字符的颜色。

实验任务3

源代码

assume cs:code, ds:data
data segment
        x dw 2020
        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 ax, data
        mov ds, ax

        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        ;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

源代码

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:line12-19 保存输入以#结尾的字符。

问题2:line21-27 逐个输出保存在ds寄存器中的字符。

实验任务5

数据从高地址单元向低地址单元生成;

函数返回值一般放在寄存器中,是为了支持中断;

参数进栈的方式,采用从源地址向目的(堆栈区)地址进行字节传送的方式入栈;

 

posted @ 2020-12-17 22:23  不见鹿  阅读(59)  评论(1)    收藏  举报