汇编语言 第三版 王爽 实验10 显示字符串 show_str 独立完成

assume cs:code

data segment
    db 'Welcome to masm!',0
data ends

stack segment
    db 32 dup ('0')
stack ends

code segment
    start:  mov dh, 8
            mov dl, 3
            mov cl, 2       ;可以把2修改成82h,观看闪烁效果 

            mov ax, data
            mov ds, ax
            mov si, 0       ;初始化数据段

            mov ax, stack
            mov ss, ax
            mov sp, 32      ;初始化栈段

            call show_str

            mov ah, 1
            int 21h         ;获得键盘输入,使得屏幕可以显示打印的字符串
                            ;按任意键结束程序,有点像命令行的pause命令

            mov ax, 4c00h
            int 21h

show_str:   push cx
            push dx

            mov ax, 0b800h  
            mov es, ax      ;用es存储显存段地址
            sub dh, 1       ; 8 - 1 = 7
            mov al, dh      ;给al
            mov bl, 10      ;10行数据 为一个显示行
            mul bl          ;显示地址b800:第十行第0列,al乘10在ax中
            mov bl, 16      ;还得乘以16,一行16个字节
            mul bl
            mov bp, ax      ;ax中的行首地址暂存到bp中

            sub dl, 1       ;3 - 1 = 2
            mov al, dl      ;al中值为2
            mov dl, 2       
            mul dl          ; 2 * 2 积在ax中,列位置

            add ax, bp      ;83行偏移地址 在ax中
            mov di, ax      ;显示偏移地址放到di中
            mov bp, 0       ;不再使用,清空bp
            mov bl, cl      ;字体颜色放起来

            ; mov di, 0464h ;160 * 78行; 测试代码

    show:   mov al, ds:[si]
            mov ah, 0
            mov cx, ax      ;每个数据 放到cx中,jcxz会控制循环结束
            mov byte ptr es:[di], al        ;显示字符
            mov byte ptr es:[di + 1], bl    ;显示颜色
            ;也可以这样
            ;mov ah, bl
            ;mov word ptr es:[di]
            ;后面di应该加1了
            jcxz ok
            add di, 2       ;显存每次走两个字节
            inc si          ;数据每次走一个字节
            loop show

        ok: pop dx
            pop cx
            ret

code ends
end start
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值