王爽《汇编语言》实验十10.3数值显示

assume cs:code
data1 segment
 dw 123,12666,1,8,3,38
data1 ends
data segment
 db 30 dup (0)                                    ;该段存放转换后的字符串
data ends
code segment
 start:mov ax,data1
       mov es,ax
       mov ax,data
       mov ds,ax
       mov si,0                                       ;寻址data段用
       mov bx,0                                       ;寻址data1段用,现在指向第一个数123
       mov cx,6                                  ;循环次数6,共6个word型数据

     s:mov ax,es:[bx]                           ;将需要转换的数据暂存到ax中
       push cx                                      ;将循环次数CX暂存:入栈
       call dtoc                                      ;将ax中的数据转换为字符串,并存到data段中
       pop cx                                       ;将cx恢复
       add bx,2                                    ;bx指向下一个数据
       loop s                                          ;(cx)=(cx)-1,循环把6个数据转换完成
       mov byte ptr ds:[si+1],0               ;将最后一个字符串后放0,标志结束

       mov dh,8
       mov dl,3
       mov cl,2
       call showstr                                     ;将字符串放到显存相关位置

       mov ax,4c00h
       int 21h

 dtoc:push ax                                     ;保护现场
        push bx
        push cx
        push dx

        mov bx,0                                    ;后面计数需要

  dto:mov cx,ax
        jcxz ok1                                  ;判断商是否为0,为0时结束转换,跳到ok1(将字符串放到data段)
        mov dx,0
        mov cx,10
        div cx                                  
        add dx,30h                            ;dx中是余数,数字+30h转换为对应的ascll码
        push dx                               ;将每一个数字的ascll码入栈              
        inc bx                                     ;记录转换数字的位数
        jmp short dto                           ;循环把一个数据全转换完成


   ok1:mov cx,bx                               ;将循环次数赋给cx
    s1:pop dx                                      ;出栈一位数字的ascll码                     
       mov ds:[si],dl                           ;将该位数字的8位的ascll码放入data段中
       inc si                                        ;si+1,准备传送下一个数字的ascll码
       loop s1                                     ;将该数据的各个位的ascll码都传到data段中
       mov al,20h                               
       mov ds:[si],al                              ;在每个数据后面放一个空格的ascll码,以分开各个数据
       inc si                                           ;将si+1,否则下一个数据进入data段时,会把空格的ascll码覆盖


       pop dx
       pop cx
       pop bx
       pop ax
       ret                                            返回s,继续下一个数据的ascll码转换
   
showstr:push ax
        push bx
        push cx
        push di
push si
        push es
        mov ax,data
        mov ds,ax
        mov si,0
        mov ax,0b800h
        mov es,ax         


        mov si,0
        mov al,160
        mul dh
        mov bx,ax
        mov dh,0
        mov al,2
        mul dl
        add bx,ax


        mov ah,cl
    str:mov cl,ds:[si]
        mov ch,0
        jcxz ok2
        mov ch,ah
        mov es:[bx+di],cx
        inc si
        add di,2
        jmp short str
    ok2:pop es
        pop si
        pop di
        pop cx
        pop bx
        pop ax
        ret
code ends
end start     

猜你喜欢

转载自blog.csdn.net/weixin_41944412/article/details/79951229
今日推荐