汇编语言(王爽)实验十(3)

答案在最后面
有两个答案,建议直接看第二个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


assume cs:code

data segment
        db 10 dup(0)
data ends

code segment
        start:mov ax,1266
        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 AX
                PUSH BX
                PUSH CX
                PUSH SI
                PUSH DX
              
        
             
                MOV DX,0
                s:
                        
						
                        mov dx,0
                        MOV BX,10
                        div BX	;ax/bx ,商存在ax中,余数存在dx中
						
                        add dX,30H ;由题意得要+30H
                        mov [si],dX ;把该值存到内存data segment
        
                        mov cx,ax 
                        jcxz k	;用cx判断是否跳出此循环
                
                        inc si  ;循环加一

                        inc cx	;该步骤非常具有启发性
								;因为loop需要让cx-1,所以如果cx此时是1的时候
								;它就会直接返回了,而不是继续执行多一次循环
								;注意,我们在这个步骤需要的是从jcxz处跳出循环
                loop s
        
                k:
                POP DX
                POP SI
                POP CX
                POP BX
                POP AX
                
        ret


		
		
        SHOW_STR:
                PUSH DX
                PUSH CX
                PUSH DS
                PUSH SI

                MOV AX,0B800H
                MOV ES,AX	;0B800H是用于控制向屏幕输出的一段内存
							;一共25*80*2个字

                MOV AL,160	;每行160个字
                MUL DH
                MOV BX,AX
                MOV AL,2	;每个单元2个字
                MUL DL
                ADD BX,AX
                MOV AL,CL

                SKIR:
                

                MOV CX,[SI]
                JCXZ OK
                MOV DX,[SI]
                MOV ES:[BX],DX		;第一个字放内容
                MOV ES:[BX+1],AL	;第二个字放颜色属性
                INC SI
                ADD BX,2

                
                LOOP SKIR


                OK:
                POP SI
                POP DS
                POP CX
                POP DX
        RET





code ends
end start

写到此处,可以将数字逆序输出,如果需要正序输出,再写一个子程序即可

——————————分割线————————————
补充

一个更好的做法


assume cs:code

data segment
        db 10 dup(0)
data ends

code segment
        start:mov ax,1266
        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 dx

        push cx

        push ax

        push si

        push bx

        mov bx,0

s1:     mov cx,10d
        mov dx,0
        div cx        
        mov cx,ax
        jcxz s2
        add dx,30h
        push dx	;先存入栈,为的是最后正序输出
        inc bx
        jmp short s1 ;使用jmp就不会存在loop减一的问题

s2:     add dx,30h
        push dx
        inc bx     ;再进行一次栈操作(补充当"商为零而余数不为零"时的情况)
        mov cx,bx	;此时cx中就保存了ds:00中的非零数字个数
        mov si,0
		
s3:     pop ax
        mov [si],al	;从栈中取出来,这时就成为正序了
        inc si
        loop s3
		
okay:   pop bx
        pop si
        pop ax
        pop cx
        pop dx
        ret   ;数值显示的子程序定义结束
	
        SHOW_STR:
                PUSH DX
                PUSH CX
                PUSH DS
                PUSH SI

                MOV AX,0B800H
                MOV ES,AX	;0B800H是用于控制向屏幕输出的一段内存
							;一共25*80*2个字

                MOV AL,160	;每行160个字
                MUL DH
                MOV BX,AX
                MOV AL,2	;每个单元2个字
                MUL DL
                ADD BX,AX
                MOV AL,CL

                SKIR:
                

                MOV CX,[SI]
                JCXZ OK
                MOV DX,[SI]
                MOV ES:[BX],DX		;第一个字放内容
                MOV ES:[BX+1],AL	;第二个字放颜色属性
                INC SI
                ADD BX,2

                
                LOOP SKIR


                OK:
                POP SI
                POP DS
                POP CX
                POP DX
        RET


code ends
end start


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值