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

1.实验任务1

编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。
assume cs:codesg, ds:datasg, ss:stacksg

datasg segment
        db 'welcome to masm!'
        db 2h,24h,71h          ;三行字符串显示颜色
datasg ends

stacksg segment
        db 16 dup (0)
stacksg ends

codesg segment
start:
        mov ax,datasg
        mov ds,ax
        mov ax,stacksg
        mov ss,ax
        mov sp,16             ;栈顶偏移
        mov ax,0B872h
        mov cx,3              ;显示3行,循环3次
        mov bx,0              ;控制偏移,获取颜色
      s:mov es,ax             ;附加段寄存器显示缓冲区地址
        push ax
        push cx
        mov si,0              ;偏移读取字符
        mov di,0              ;偏移存储读取到的字符
        mov cx,16             ;循环16次读取字符串
     s0:mov al,[si]            ;暂存读到的字符,一个字符8位
        mov es:[di],al          ;读到的字符显示放在缓冲区
        inc si               ;si++
        add di,2              ;偶数偏移存放字符
        loop s0
        mov al,[bx+si]          ;获取第一个颜色
        mov cx,16
        mov di,1              ;偏移存储颜色属性
     s1:mov es:[di],al
        add di,2              ;奇数偏移存储颜色属性
        loop s1              ;第一行颜色内容位置显示完成
        pop cx
        pop ax               ;取出初始缓冲区
        add ax,000ah
        inc bx                ;取下一个颜色
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start

 

2.实验任务2

编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。
assume cs:code, ds:data
data segment
    str db 'another try', 0
data ends

code segment
start:  
    mov ax, data
    mov ds, ax

    mov si, offset str
    mov al, 4
    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

 (1)line19-22,line36-39的目的是暂存对应寄存器内容以便于子程序运行完后恢复

(2)line30的功能是将字符数据和对应属性存储到显存中

 

3.实验任务3

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

 

 

对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
        mov si,0
        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
        mov dh,2
        mov bx,0b800H
        mov es,bx
        mov es:[si],dx
        inc si
        inc si
        inc di
        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实现输入读取的以#结尾的字符串

 

5.实验任务5

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

 

 在高级语言中,参数传递在汇编语言中通过mov指令向寄存器赋值,入栈顺序按照高级语言从右向左的顺序;

通过call指令调用sum函数,返回值同样通过mov指令存入寄存器。

posted @ 2020-12-16 11:36  突进的小母猪  阅读(130)  评论(3)    收藏  举报