3.数值显示-汇编语言(王爽)-实验10 编写子程序

jcxz跳转后,紧随其后的代码不会执行,要特别注意出栈入栈是否匹配

; e10_3.asm
assume cs:code,ss:stack,ds:data

data segment
    db 16 dup (0)
data ends

stack segment
    db 64 dup (0)
stack ends

code segment
  start:
      mov ax,stack
      mov ss,ax
    mov sp,64

    mov ax,12666 
    mov bx,data
    mov ds,bx
    mov si,0    ; set ds:[si]
    call dtoc

    mov dh,8
    mov dl,3
    mov cl,2
    call show_str
    mov ax,4c00h
    int 21h
  dtoc:
    push ax
    push bx
    push cx
    push dx
    push ds
    push si
    push di   ; to record the digits to output

    mov di,0
    mov bx,10  ; set divisor
  s_dtoc:
    mov dx,0    ; set (dx),(ax)
    div bx      ; [(dx) * 10000h + (ax)] / 10
                    ; result (dx) = remainder, (ax) = quotient
    add dx, 30h
    push dx   ; save the remainder to stack
    inc di
    push cx
    mov cx,ax
    jcxz ok_dtoc    ; to see if quotient (ax) = 0 
    pop cx    ; this wouldn't be excuted when (ax) = 0 
    inc cx      ; (cx) = (cx) - 1 after loop s
    loop s_dtoc

  ok_dtoc:
    pop cx
        mov cx,di
    s1_dtoc:
        pop dx
        mov ds:[si], dl   ; (dx) < 10 + 30H
        inc si
        loop s1_dtoc

      pop di
    pop si
    pop ds
    pop dx
    pop cx
    pop bx
    pop ax
    ret

  show_str: 
    push cx
    push dx 
    push ds
    push si
    push ax
    push es
    push bp
    push di

    mov ax,0b800h
    mov es,ax
    mov al,160
    mul dh
    mov bp,ax
    mov al,2
    mul dl
    mov di,ax

     s: push cx
    mov ch,0
    mov cl,ds:[si]
    jcxz ok
    pop cx

    mov al,ds:[si]
    mov es:[bp+di],al
    mov es:[bp+di+1],cl
    add di,2
    inc si
    inc cx
    loop s

    ok: 
  pop cx
  pop di
    pop bp
    pop es
    pop ax
    pop si
    pop ds
    pop dx
    pop cx
    ret

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值