汇编:利用子函数显示以0结尾的字符串

代码如下:

assume ds:data,ss:stack,cs:code

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

stack segment
    dw 8 dup(0)
stack ends

code segment
    start:
    ;设置栈段
    mov ax,stack
    mov ss,ax
    mov sp,10h
    ;设置子函数参数值
    mov dh,1
    mov dl,0
    mov cl,2
    mov ax,data
    mov ds,ax
    mov si,0
    ;调用清屏函数
    call clr_scr
    ;调用字符串显示函数
    call show_str
    ;程序返回
    mov ax,4c00h
    int 21h

    
    ;---------------------------分割线-------------------------------  
    
    
    ;<字符串显示>参数:
    ;(dh)=行号(0~24)
    ;(dl)=列号(0~79)
    ;(cl)=颜色
    ;ds:si指向字符串的首地址
    show_str:    
    ;数据保存
    push ax
    push es
    push bp
    push di    
    ;设置显存段地址为es
    mov ax,0B800h
    mov es,ax  
    ;设置显存偏移地址为[bp+di]
    mov al,160
    mul dh
    mov bp,ax
    mov al,2
    mul dl
    mov di,ax  
    ;颜色属性
    mov dl,cl  
    ;子函数主体
    s:
    mov cl,[si]
    mov ch,0
    jcxz ok
    mov al,[si]
    mov es:[bp+di],al
    mov es:[bp+di+1],dl
    inc si
    add di,2
    jmp short s 
    ;数据恢复,程序返回
    ok:         
    pop di
    pop bp
    pop es
    pop ax 
    ret

    
    ;---------------------------分割线-------------------------------
    
    
    ;清屏操作,无参数和返回值
    clr_scr:    
    push cx
    push si
    push ax
    mov cx,4000
    mov si,0
    mov ax,0B800h
    mov es,ax
    s1:
    mov es:[si],0
    inc si
    loop s1
    pop ax
    pop si
    pop cx
    ret


code ends
end start

运行结果如下:

dbf5c78f6f5a47a5961fa10bc168f0e9.png

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUPREMESYZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值