想你想你 发表于 2018-1-8 10:29:05

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

源代码如下,求各位大佬改错,我真的找不出来啦{:5_100:}



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,
      mov es:,ax
      mov ax,
      mov es:,ax ;存放年份
   
      mov ax,54h
      mov dx,56h
      add di,5
      call dtoc      ;调用dtoc子程序将总收入转变为十进制数的字符串并存放在表格相应位置

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

      mov ax,54h
      mov dx,56h
      push cx
      mov cx,0a8h
      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:,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,
          mov cx,1
          int 10h
          inc si
          pop cx
      loop show_s2
          pop cx
          inc dh
      loop show_s1
          ret
code ends
end start

兰陵月 发表于 2018-1-11 21:04:52

运行出现什么问题,总是得告诉我们一下吧。
我编译了你的程序,每次出现不同的情况。
页: [1]
查看完整版本: 王爽汇编课程设计1show_str函数用中断(int10h)实现