鱼C论坛

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

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

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

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

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

x
本帖最后由 haiouda 于 2015-5-2 23:34 编辑
  1. <p>assume cs:code ,ss:stack, ds:data

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

  4. dw 11 dup(0)
  5. data ends

  6. stack segment
  7. dw 16 dup(0)
  8. stack ends


  9. code segment  

  10.   start: mov ax,data
  11.                  mov ds,ax
  12.                  
  13.          mov ax,stack
  14.                  mov ss,ax
  15.                  mov sp,33
  16.                  
  17.                  
  18.                  
  19.                  mov si,0   
  20.          mov di,31   
  21.                                                 
  22.                  call dtoc   ;转换并存入内存指定位置
  23.                  
  24.                  
  25.          W1: call show_str  ;显示
  26.                
  27.                
  28.                  
  29.                           
  30.          
  31.                  mov ax,4c00h
  32.                  int 21h
  33.                  
  34.    dtoc: mov cx,6          ;共有6个数据
  35.      w0:  push cx      ;外层循环,每次对一个数据进行操作
  36.           mov ax,[si]  ;读数据
  37.                   add si,2
  38.                   mov dx,[si]
  39.                   add si,2     ;si 指向下一个数据
  40.    
  41.          s0:  call divdw

  42.                       mov ds:[26],ax    ;保护被除数低16位
  43.                         
  44.                           
  45.                       push cx   ; 余数入栈(从低位到高位顺序入栈)
  46.                           mov ax,ds:[24]
  47.                       inc ax  ;这个内存单元用来记录入栈次数即数值长度
  48.                           mov ds:[24],ax
  49.                           
  50.                           mov ax,ds:[26]
  51.                           inc cx    ;
  52.                           or cx,ax   ;商和余数同时为零,即此数据被分解完毕
  53.                       loop s0   ;余数为零,代表这个数已经按从低到高入栈完毕
  54.                  
  55.                       mov cx,ds:[24] ;数值长度给cx用于循环次数
  56.                           mov word ptr ds:[24],0
  57.                  
  58.                  
  59.                   pop ax      ;数据个个位倒序出栈
  60.                       mov [di],al
  61.                           inc di
  62.                           dec cx      ;每串数都以零开头,所以第一个数(0)不加30h,同时cx减少一次循环
  63.                
  64.                s1: pop ax
  65.                       add al,30h  ;每位改成ASICII码
  66.                       mov [di],al                 
  67.                       inc di
  68.                       loop s1  
  69.                         
  70.             
  71.          
  72.                  pop cx  
  73.          loop w0        

  74.                  mov byte ptr [di],0 ; 因为每组数字都以零开头,补个零结尾,这样要显示的数字实际开始位置为,ds:[32]
  75.                  ret
  76.                  
  77.                  
  78.                  
  79. divdw:  push bx
  80.          push ax        ;除法子程序(ax被除数低16位 dx被除数高16位 cx余数)
  81.       
  82.                  mov cx,10
  83.          
  84.                 mov ax,dx
  85.                   mov dx,0
  86.                   div cx        ;高16位作除法
  87.                   
  88.                   mov bx,ax    ;ax高16位的商,dx余数
  89.          
  90.                   
  91.                   pop ax        
  92.                   div cx          ;低16位作除法
  93.                   
  94.                   
  95.                   mov cx,dx
  96.                   mov dx,bx
  97.             
  98.                  pop bx
  99.              ret
  100.                  
  101.                  
  102. show_str: mov ax,0b800h   ;显示字符串
  103.           mov es,ax              
  104.           mov ax,0
  105.                   
  106.                   mov al,8    ;显示位置,第九行                  
  107.                   mov cl,2    ; 第三例
  108.                   
  109.                   mov bx,0
  110.                   mov bl,160
  111.                   mul bl
  112.                   mov bx,0
  113.                   add bx,ax
  114.                   mov ax,0
  115.                   mov al,2   
  116.                   
  117.                   mul cl
  118.                   add bx,ax     ;bx为首字偏移值
  119.                   
  120.                   
  121.                    mov ch,2      ; 颜色为绿色
  122.                   
  123.                   mov al,ch     ;颜色放al中保存
  124.                   mov di,0                  
  125.                   mov cx,6
  126.                   mov si,32
  127.                   
  128.                   
  129.         w2:   push cx
  130.               call show_str11
  131.                   pop cx
  132.                   inc si     ;指向下一个字符
  133.                   add di,2  ;显示二个数字之间加个空格,di必须为2的倍数
  134.                   loop w2
  135.                   
  136.                   ret
  137.                  
  138.                   
  139.                   
  140.                   
  141. show_str11:  
  142.          mov cl,[si]
  143.              mov ch,0
  144.              jcxz w3       ;cx为零时 跳到s1
  145.               
  146.         
  147.                                    
  148.                   mov es:[bx+di],cl
  149.                   mov es:[bx+di+1],al
  150.                   
  151.                   inc si
  152.                   add di,2
  153.                   
  154.                   
  155.                   jmp short show_str11
  156.                   
  157.                   
  158.                   
  159.         w3:  ret         


  160. code ends

  161. 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-5-20 01:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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