鱼C论坛

 找回密码
 立即注册
查看: 2703|回复: 1

王爽汇编课程设计1show_str函数用中断(int10h)实现

[复制链接]
发表于 2018-1-8 10:29:05 | 显示全部楼层 |阅读模式

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

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

x
源代码如下,求各位大佬改错,我真的找不出来啦



assume cs:code
data segment
  db'1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
  db'1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
  dd 16,22,382,1356,2390,8000,16000,24486,50065,94794,140417,1957514,345980
  dd 590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800
data ends

table segment
  db 21 dup('year summ ne ??',0)
table ends

stack segment
  db 30 dup(0)
stack ends

code segment
start:mov ax,data
      mov ds,ax
      mov ax,table
      mov es,ax     
      mov ax,stack
      mov ss,ax
      mov sp,30

      mov bx,0
      mov si,0
      mov di,0
      mov cx,21
   s: mov ax,[bx]
      mov es:[di],ax
      mov ax,[bx+2]
      mov es:[di+2],ax ;存放年份
   
      mov ax,54h[bx]
      mov dx,56h[bx]
      add di,5
      call dtoc      ;调用dtoc子程序将总收入转变为十进制数的字符串并存放在表格相应位置

      add di,5
      mov ax,0a8h[si]
      mov dx,0       ;原数据为16位
      call dtoc      ;调用dtoc子程序将雇员数转变为十进制数的字符串并存放在表格相应位置

      mov ax,54h[bx]
      mov dx,56h[bx]
      push cx
      mov cx,0a8h[si]
      call divdw ;得到人均收入,(dx)=高16位,(ax)=低16位
      add di,3
      call dtoc  ;调用dtoc子程序将人均收入转变为十进制数的字符串并存放在表格相应位置
      pop cx
      
      add bx,4
      add si,2
      add di,16 ;改变table表中下一条记录的起始位置,每条记录长度16字节
      loop s  
      
      
      
  
    call show_str  
   
   

      mov ax,4c00h
      int 21h



   dtoc:
         ;将给定的数字以十进制字符串的形式存放在table表中
      push dx
      push cx
      push ax
      push di
   
      mov bx,0 ;bx用来存放取余的次数即字符串的位数
      s1:
          mov cx,10
          call divdw ;为避免除法运算中出现除法溢出
          add cx,30h
          push cx    ;余数入栈
          inc bx
          push ax
          or ax,dx   ;因子程序返回的商为32位,为证明商是否为0,不能单纯判断低16位的值                                 是否为0,dx中高16位的数也要做为判断依剧
          mov cx,ax ;上步运算结果若为0,表示得到的商为0,取余过程结束
          pop ax ;若执行or ax,dx之后,ax中的值不为0就要继续取余,所以还原ax   
          jcxz s2
               
          jmp short s1
      s2:
          mov cx,bx
      s3:
          pop ax ;将1前面取余的数出栈
          mov es:[di],al
          inc di
          loop s3
       okay:
          pop bx
          pop di
          pop ax
          pop cx
          pop dx
          ret

   divdw: ;参数:被除数ax存放低16位,cx存放高16位,cx存放除数
           ;返回:结果ax存放低16位,dx存放高16位,cx存放余数  
          push bx
          push ax ;低16位入栈
          mov ax,dx
          mov dx,0
          div cx ;16位除法,ax存放商,dx放余数
          mov bx,ax
          pop ax
          div cx
          mov cx,dx
          mov dx,bx
          pop bx
          ret
show_str:
         mov bh,0
         mov bl,00000010b
         mov cx,21
mov dh,3
   show_s1:
         
          push cx
          mov cx,16
          mov dl,6
   show_s2:
          push cx
          mov ah,2;置光标
          int 10h
         
          mov ah,9
          mov ax,table
          mov ds,ax
          mov si,0
          mov al,[si]
          mov cx,1
          int 10h
          inc si
          pop cx
        loop show_s2
          pop cx
          inc dh
        loop show_s1
          ret
  code ends
  end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-11 21:04:52 | 显示全部楼层
运行出现什么问题,总是得告诉我们一下吧。
我编译了你的程序,每次出现不同的情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 13:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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