汇编语言(王爽)第三版 实验十(3)数值显示(转载)

原文链接:https://blog.csdn.net/weixin_41944412/article/details/79951229

  1 assume cs:code
  2 data1 segment
  3  dw 123,12666,1,8,3,38
  4 data1 ends
  5 data segment
  6  db 30 dup (0)                                 ;该段存放转换后的字符串
  7 data ends
  8 code segment
  9  start:mov ax,data1
 10        mov es,ax
 11        mov ax,data
 12        mov ds,ax
 13        mov si,0                                  ;寻址data段用
 14        mov bx,0                                  ;寻址data1段用,现在指向第一个数123
 15        mov cx,6                                  ;循环次数6,共6个word型数据
 16  
 17      s:mov ax,es:[bx]                             ;将需要转换的数据暂存到ax中
 18        push cx                                    ;将循环次数CX暂存:入栈
 19        call dtoc                                  ;将ax中的数据转换为字符串,并存到data段中
 20        pop cx                                     ;将cx恢复
 21        add bx,2                                   ;bx指向下一个数据
 22        loop s                                     ;(cx)=(cx)-1,循环把6个数据转换完成
 23        mov byte ptr ds:[si+1],0                   ;将最后一个字符串后放0,标志结束
 24  
 25        mov dh,8
 26        mov dl,3
 27        mov cl,2
 28        call showstr                               ;将字符串放到显存相关位置
 29  
 30        mov ax,4c00h
 31        int 21h
 32  
 33  dtoc:  push ax                                     ;保护现场
 34         push bx
 35         push cx
 36         push dx
 37         mov bx,0                                  ;后面计数需要
 38  
 39   dto:  mov cx,ax
 40         jcxz ok1                                  ;判断商是否为0,为0时结束转换,跳到ok1
 41         mov dx,0
 42         mov cx,10
 43         div cx                                  
 44         add dx,30h                                 ;dx中是余数,数字+30h转换为对应的ascll码
 45         push dx                                    ;将每一个数字的ascll码入栈              
 46         inc bx                                     ;记录转换数字的位数
 47         jmp short dto                              ;循环把一个数据全转换完成
 48  
 49  
 50    ok1:mov cx,bx                                   ;将循环次数赋给cx
 51     s1:pop dx                                      ;出栈一位数字的ascll码                     
 52        mov ds:[si],dl                              ;将该位数字的8位的ascll码放入data段中
 53        inc si                                      ;si+1,准备传送下一个数字的ascll码
 54        loop s1                                     ;将该数据的各个位的ascll码都传到data段中
 55        mov al,20h                               
 56        mov ds:[si],al                              ;在每个数据后面放一个空格的ascll码,以分开各个数据
 57        inc si                                      ;将si+1,否则下一个数据进入data段时,会把空格的ascll码覆盖
 58  
 59  
 60        pop dx
 61        pop cx
 62        pop bx
 63        pop ax
 64        ret                                          ;返回s,继续下一个数据的ascll码转换
 65   
 66 showstr:push ax
 67         push bx
 68         push cx
 69         push di
 70     push si
 71         push es
 72         mov ax,data
 73         mov ds,ax
 74         mov si,0
 75         mov ax,0b800h
 76         mov es,ax         
 77  
 78  
 79         mov si,0
 80         mov al,160
 81         mul dh
 82         mov bx,ax
 83         mov dh,0
 84         mov al,2
 85         mul dl
 86         add bx,ax
 87  
 88  
 89         mov ah,cl
 90     str:mov cl,ds:[si]
 91         mov ch,0
 92         jcxz ok2
 93         mov ch,ah
 94         mov es:[bx+di],cx
 95         inc si
 96         add di,2
 97         jmp short str
 98     ok2:pop es
 99         pop si
100         pop di
101         pop cx
102         pop bx
103         pop ax
104         ret
105 code ends
106 end start

猜你喜欢

转载自www.cnblogs.com/ancm/p/12024018.html
今日推荐