王爽汇编——实验十

目录

1.显示字符串

2.解决除法溢出的问题

3.数值显示


1.显示字符串

其实这里面主要的问题是要用的寄存器比较多,像ax,cx会被经常用到,所以要用许多寄存器

比如bl代替cl来存储颜色,di与es配对,si与ds配对,ax就随插随用

assume cs:code
data segment
    db 'Welcome to masm !',0
data ends
code segment
start:
    mov dh,8;行
    mov dl,3;列
    mov cl,2;颜色
    
    mov ax,data
    mov ds,ax;找到数据段
    
    mov si,0
    call show_str;进入子程序
    mov ax,4c00h
    int 21h
show_str:
    mov bl,cl;将颜色存入bl
    
    mov ax,0b800h
    mov es,ax;用es显存起始位置
    
    sub di,di;对di赋0
    
    dec dh
    dec dl;减一符合机器的习惯
    
    ;计算显示位置
    mov al,160
    mul dh;ax找到对应行
    add dl,dl;一列元素一列属性,所以要乘2
    mov cl,dl
    mov ch,0
    add ax,cx;行加列
    mov di,ax;将最终开始存储的地方存入di
    
s:  mov cl,ds:[si]
    mov ch,0
    jcxz ok;判断是否为零
    ;输出
    mov ax,ds:[si]
    mov es:[di],ax
    inc di
    inc si
    mov es:[di],bl
    inc di
    jmp short s
ok: ret
code ends
end start

2.解决除法溢出的问题

除法如果被除数为16位

那么DX存高位,AX存低位

结果AX存商,DC存余数

利用好上面这个关系和题目给的公式就可以了

assume cs:code
code segment
start:
    mov ax,4240h
    mov dx,000fh
    mov cx,0ah
    call divdw
    mov ah,4ch
divdw:
    mov bx,ax
    mov ax,dx
    mov dx,0
    div cx

    push ax

    mov ax,bx
    div cx
    
    push ax
    push dx

    pop cx
    pop ax
    pop dx
ret
code ends
end start

先用u指令看一下程序何时结束,直接用g指令到那个地方就可以快速执行完程序了

3.数值显示

这一题会用到很多个段的配合

总共分为如下结构:

初始化数据

        进入写操作,将二进制数据写成十进制字符串

                根据书上给的算法,从个位开始一位一位取出并+30h放入栈中,同时统计长度(jxcz)

                入栈完成之后将其用loop循环一个个返回到开辟的数据段

初始化需要显示的信息

        按照第一题的方法显示出来

assume cs:code

data segment
    db 10 dup (0)
data ends

code segment
    start:
            mov ax,12666
            mov bx,data
            mov ds,bx
            mov si,0
            call dtoc

            mov dh,8
            mov dl,3
            mov cl,2
            call show_str

            mov ax,4c00h
            int 21h
    dtoc:
            push si
            push dx
            push cx
            push bx
            push ax

            mov si,0
            mov bx,10
    change:
            mov dx,0
            div bx

            mov cx,ax
            jcxa last
            add dx,30h
            push dx
            inc si
            jmp short change
    last:
            add dx,30h
            push dx
            inc si

            mov cx,si
            mov si,0
    s:
            pop ds:[si]
            inc si
            loop s

    exit_dtoc:
            pop ax
            pop bx
            pop cx
            pop dx
            pop si

            ret

    show_str:
            push ax
            push es
            push dx
            push bx
            push si
            push di

            mov ax.0b800h
            mov es,ax

            mov al,160
            mul dh
            mov bx,ax

            add dl,dl
            add bx,dl

            mov al,cl
            mov ch,0

    show:
            mov cl,ds:[si]
            jcxz exit_show_str
            mov es:[bx],cl
            inc si
            inc bx
            mov es:[bx+1],al
            jmp short show
    exit_show_str:
            pop di
            pop si
            pop bx
            pop dx
            pop es
            pop ax
code ends
end start

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值