[汇编]《汇编语言》第四版实验10-1显示字符串

  • Post author:
  • Post category:其他


assume cs:code,ds:data

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

code segment
    start:          mov     dh,24 ;行数
                    mov     dl,0  ;列数
                    mov     cl,2  ;颜色
                    mov     ax,data
                    mov     ds,ax
                    mov     si,0
                    call    show_str
                    
                    mov     ax,4c00h
                    int     21h
    ; 功能:在指定位置用指定颜色显示一个用0结尾的字符串
    ; 参数:(dh)=行号(0~24) (dl)=列号(0~79)
    ;      (cl)=颜色,ds:[si]指向字符串的首地址
    ; 返回值:无
    show_str:       push    ax         ;保存外界寄存器
                    push    es
                    push    bx
                    push    cx

                    mov     ax,0B800h  ;es = 显存首地址
                    mov     es,ax
    change:         mov     al,dh      ;计算偏移值(bx = dh*A0h+dl*2),然后每次在此基础上+2即可
                    mov     ah,0A0h
                    mul     ah
                    mov     bx,ax
                    mov     al,dl
                    mov     ah,2
                    mul     ah
                    add     bx,ax

                    mov     ah,cl       ;保存颜色到ah
    s:              mov     cl,ds:[si]  ;判断是否到达结尾0
                    mov     ch,0
                    jcxz    ok
                    mov     al,ds:[si]  ;保存字符到al
                    mov     es:[bx],ax  ;将ax移动至es:[bx]显存区
                    inc     si          ;移动字符串下标
                    add     bx,2        ;更新偏移值
                    jmp     s           ;循环
    ok:             pop     cx          ;恢复外界寄存器值
                    pop     bx
                    pop     es
                    pop     ax
                    ret
code ends
end start

在这里插入图片描述

因为dosbox最后多输出了一行,所以0行会无法显示,24行会显示为倒数第二行。



版权声明:本文为CRAJA原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。