鱼C论坛

 找回密码
 立即注册
查看: 1965|回复: 2

[汇编作业] 实验十 3 数值显示 我回来了

[复制链接]
发表于 2015-5-2 23:04:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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,[si]  ;读数据
                  add si,2
                  mov dx,[si]
                  add si,2     ;si 指向下一个数据
   
         s0:  call divdw

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

                 mov byte ptr [di],0 ; 因为每组数字都以零开头,补个零结尾,这样要显示的数字实际开始位置为,ds:[32]
                 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,[si]
             mov ch,0
             jcxz w3       ;cx为零时 跳到s1
              
        
                                   
                  mov es:[bx+di],cl
                  mov es:[bx+di+1],al
                  
                  inc si
                  add di,2
                  
                  
                  jmp short show_str11 
                  
                  
                  
        w3:  ret          


code ends

end start</p>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-27 05:25:51 | 显示全部楼层
就是来顶 支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-27 05:27:09 | 显示全部楼层
就是来顶 支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 15:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表