haiouda 发表于 2015-5-2 23:04:02

实验十 3 数值显示 我回来了

本帖最后由 haiouda 于 2015-5-2 23:34 编辑

<p>assume cs:code ,ss:stack, ds:data

data segment
dd 123,12666,1,8,3,38

dw 11 dup(0)
data ends

stack segment
dw 16 dup(0)
stack ends


code segment

start: mov ax,data
               mov ds,ax
               
         mov ax,stack
               mov ss,ax
               mov sp,33
               
               
               
               mov si,0   
         mov di,31   
                                                
               call dtoc   ;转换并存入内存指定位置
               
               
         W1: call show_str;显示
               
               
               
                        
         
               mov ax,4c00h
               int 21h
               
   dtoc: mov cx,6          ;共有6个数据
   w0:push cx      ;外层循环,每次对一个数据进行操作
          mov ax,;读数据
                  add si,2
                  mov dx,
                  add si,2   ;si 指向下一个数据
   
         s0:call divdw

                      mov ds:,ax    ;保护被除数低16位
                        
                        
                      push cx   ; 余数入栈(从低位到高位顺序入栈)
                        mov ax,ds:
                      inc ax;这个内存单元用来记录入栈次数即数值长度
                        mov ds:,ax
                        
                        mov ax,ds:
                        inc cx    ;
                        or cx,ax   ;商和余数同时为零,即此数据被分解完毕
                      loop s0   ;余数为零,代表这个数已经按从低到高入栈完毕
               
                      mov cx,ds: ;数值长度给cx用于循环次数
                        mov word ptr ds:,0
               
               
                  pop ax      ;数据个个位倒序出栈
                      mov ,al
                        inc di
                        dec cx      ;每串数都以零开头,所以第一个数(0)不加30h,同时cx减少一次循环
               
               s1: pop ax
                      add al,30h;每位改成ASICII码
                      mov ,al               
                      inc di
                      loop s1
                        
            
         
               pop cx
         loop w0      

               mov byte ptr ,0 ; 因为每组数字都以零开头,补个零结尾,这样要显示的数字实际开始位置为,ds:
               ret
               
               
               
divdw:push bx
         push ax      ;除法子程序(ax被除数低16位 dx被除数高16位 cx余数)
      
               mov cx,10
         
                mov ax,dx
                  mov dx,0
                  div cx      ;高16位作除法
                  
                  mov bx,ax    ;ax高16位的商,dx余数
         
                  
                  pop ax      
                  div cx          ;低16位作除法
                  
                  
                  mov cx,dx
                  mov dx,bx
            
               pop bx
             ret
               
               
show_str: mov ax,0b800h   ;显示字符串
          mov es,ax            
          mov ax,0
                  
                  mov al,8    ;显示位置,第九行                  
                  mov cl,2    ; 第三例
                  
                  mov bx,0
                  mov bl,160
                  mul bl
                  mov bx,0
                  add bx,ax
                  mov ax,0
                  mov al,2   
                  
                  mul cl
                  add bx,ax   ;bx为首字偏移值
                  
                  
                   mov ch,2      ; 颜色为绿色
                  
                  mov al,ch   ;颜色放al中保存
                  mov di,0                  
                  mov cx,6
                  mov si,32
                  
                  
      w2:   push cx
            call show_str11
                  pop cx
                  inc si   ;指向下一个字符
                  add di,2;显示二个数字之间加个空格,di必须为2的倍数
                  loop w2
                  
                  ret
               
                  
                  
                  
show_str11:
         mov cl,
             mov ch,0
             jcxz w3       ;cx为零时 跳到s1
            
      
                                 
                  mov es:,cl
                  mov es:,al
                  
                  inc si
                  add di,2
                  
                  
                  jmp short show_str11
                  
                  
                  
      w3:ret         


code ends

end start</p>

vanentu 发表于 2015-5-27 05:25:51

就是来顶 支持

vanentu 发表于 2015-5-27 05:27:09

就是来顶 支持
页: [1]
查看完整版本: 实验十 3 数值显示 我回来了