鱼C论坛

 找回密码
 立即注册
查看: 2761|回复: 10

汇编语言课程设计一

[复制链接]
发表于 2016-3-1 22:24:51 | 显示全部楼层 |阅读模式
10鱼币
啊啊啊,表示楼主受不了,课程设计一已经做了好几天了,但是仍然做不出来,我的问题是:
1.首先人均收入到底是哪个寄存器的值,人均收入如何计算,人均收入如何放置啊
2.为何别人的代码可以直接用div  (总收入/人数),却没有出现除法溢出,而我试下不行啊,他的代码如下:(是狂潮的,我复制下)
  1. assume cs:codesg, ds:data, es:data2

  2. data segment
  3.     db 32 dup(20H)
  4. data ends

  5. data2 segment
  6.     ; 年份
  7.     db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
  8.     db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990'
  9.     db '1991', '1992', '1993', '1994', '1995'
  10.      
  11.     ; 收入
  12.     dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479
  13.     dd 140417,197514, 345980, 590827, 803530, 1183000, 1843000
  14.     dd 2759000, 3753000, 4649000, 5937000
  15.      
  16.     ; 雇员数
  17.     dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793
  18.     dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
  19. data2 ends

  20. codesg segment
  21. start:
  22.     mov ax, data
  23.     mov ds, ax
  24.     mov ax, data2
  25.     mov es, ax
  26.      
  27.     mov cx, 21
  28.     mov bp, 0       ; 年份的首地址
  29.     mov bx, 54H     ; 收入的首地址
  30.     mov di, 0a8H    ; 雇员数的首地址
  31.     mov dh, 4       ; 从第4行开始逐行显示表格
  32.     mov dl, 0       ; 从第0列显示每行信息
  33. s:
  34.     push cx
  35.     push dx
  36.     mov si, 0       ; 字符串的首地址
  37.     ; 复制年份
  38.     mov ax, es:[bp]
  39.     mov [si], ax
  40.     mov ax, es:2[bp]
  41.     mov 2[si], ax
  42.     add si, 9       ; 9列显示年份
  43.      
  44.     ; 复制收入
  45.     mov ax, es:[bx]    ; 收入的低16位
  46.     mov dx, es:2[bx]   ; 收入的高16位
  47.     call dtoc
  48.     add si, 9          ; 9列显示收入
  49.      
  50.     ; 复制雇员数
  51.     mov ax, es:[di]
  52.     mov dx, 0
  53.     call dtoc
  54.     add si, 9          ; 9列显示雇员数
  55.      
  56.     ; 复制人均收入
  57.     mov ax, es:[bx]    ; 收入的低16位
  58.     mov dx, es:2[bx]   ; 收入的高16位
  59.     div word ptr es:[di]
  60.     mov dx, 0
  61.     call dtoc
  62.      
  63.     mov byte ptr 3[si], 0 ; 字符串结束标志设为0
  64.     pop dx
  65.     mov cl, 2             ; 字符显示为绿色
  66.     call show_str
  67.     inc dh                ; 行数+1
  68.     add bp, 4             ; 下一个年份
  69.     add bx, 4             ; 下一个收入
  70.     add di, 2             ; 下一个雇员数
  71.     pop cx
  72.     loop s
  73.      
  74.     mov ax, 4c00H
  75.     int 21H
  76.      
  77. ; 子程序dtoc
  78. dtoc:
  79.     push bx
  80.     push cx
  81.     push si
  82.      
  83.     mov bx, 0
  84. s00:
  85.     mov cx, ax
  86.     jcxz ok
  87.     mov cx, 10
  88.     call divdw
  89.     add cx, 30H       ; 余数转换为ASCII
  90.     push cx           ; 余数入栈
  91.     inc bx            ; 数字位数+1
  92.     jmp short s00
  93. ok:
  94.     mov cx, bx
  95. c2m:
  96.     pop bx
  97.     mov [si], bl
  98.     inc si
  99.     loop c2m
  100.      
  101.     pop si
  102.     pop cx
  103.     pop bx
  104.     ret
  105.      
  106. ; 子程序divdw
  107. divdw:
  108.     push bx
  109.      
  110.     mov bx, ax        ; 低16位L暂时存在bx
  111.     mov ax, dx        ; 高16位H送到ax
  112.     mov dx, 0
  113.     div cx            ; H/N
  114.     push ax           ; int(H/N)入栈
  115.     mov ax, bx
  116.     div cx            ; [rem(H/N)*65536+L]/N
  117.     mov cx, dx        ; 余数送到cx
  118.     pop dx            ; int(H/N)出栈
  119.      
  120.     pop bx
  121.     ret

  122. ; 子程序show_str
  123. show_str:
  124.     push ax
  125.     push bx
  126.     push bp
  127.     push cx
  128.     push si
  129.     push di
  130.     push es
  131.      
  132.     mov bl, cl            ; 字体颜色存在bl中
  133.     mov ax, 0b800H
  134.     mov es, ax            ; 显示缓冲区的段地址存在es
  135.     mov ax, 0a0H
  136.     mul dh
  137.     mov bp, ax            ; 将第n行的首地址存在bp
  138.     mov ax, 2
  139.     mul dl
  140.     mov di, ax            ; 将第n列存在di
  141.     mov si, 0
  142. ctom:
  143.     mov ch, 0
  144.     mov cl, [si]
  145.     jcxz exit
  146.     mov es:[bp][di], cl
  147.     inc di
  148.     mov es:[bp][di], bl
  149.     inc si
  150.     inc di
  151.     jmp short ctom
  152. exit:
  153.     pop es
  154.     pop di
  155.     pop si
  156.     pop cx
  157.     pop bp
  158.     pop bx
  159.     pop ax
  160.     ret
  161. codesg ends

  162. end start
复制代码

为何他的代码直接除,就可以,我试下就不行.,唉,真受不了了,求解啊.
我的代码为何除法溢出了
  1. assume cs:code,ds:data,es:table

  2. data segment

  3.     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

  4.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

  5.     db '1993','1994','1995'

  6.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

  7.     dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000

  8.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

  9.     dw 11542,14430,15257,17800

  10.     dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239

  11.     dw 260,304,333

  12. data ends

  13. table segment

  14.     db 21 dup ('year summ ne ?? ')

  15. table ends
  16. code segment
  17. start:       
  18.                 mov si,0
  19.                 mov di,0
  20.                 mov bx,0
  21.                 mov ax,data
  22.                 mov ds,ax
  23.                 mov ax,table
  24.                 mov es,ax
  25.                 mov cx,21
  26.                 push cx
  27. s5:
  28.                 mov ax,ds:[si]
  29.                 mov es:[di],ax
  30.                 mov ax,ds:[si+2]
  31.                 mov es:[di+2],ax
  32.                 mov ax,ds:[si+84]
  33.                 mov es:[di+5],ax
  34.                 mov dx,ds:[si+86]
  35.                 mov es:[di+7],dx
  36.                 mov cx,ds:[bx+168]
  37.                 mov es:[di+10],cx
  38.                 call chufa
  39.                 mov es:[di+13],ax
  40.                 add di,16
  41.                 add si,4
  42.                 add bx,2
  43.                 pop cx
  44.                 loop s5
  45. ;kaishi

  46.                 mov ax,table
  47.                 mov ds,ax
  48.                 mov ax,0b800h
  49.                 mov es,ax
  50.                 mov di,0
  51.                 mov si,0
  52.                 mov cx,21
  53. s4:       
  54.                 push cx
  55.                 mov ax,ds:[di]
  56.                 mov es:[si],al
  57.                 mov es:[si+2],ah
  58.                 mov ax,ds:[di+2]
  59.                 mov es:[si+4],al
  60.                 mov es:[si+6],ah
  61.                 mov ax,2
  62.                 mov es:[si+1],al
  63.                 mov es:[si+3],al
  64.                 mov es:[si+5],al
  65.                 mov es:[si+7],al              ;year
  66.                 add si,32
  67.                 call dtoc2
  68.                
  69.                 mov ax,ds:[di+5]
  70.                 mov dx,ds:[di+7]              ;sum   income
  71.                 add si,32
  72.                 call dtoc2
  73.                
  74.                 mov ax,ds:[di+10]
  75.                 add si,64                     ;people
  76.                 call dtoc2
  77.                
  78.                 mov ax,ds:[di+13]                ;average
  79.                 call dtoc2
  80.                
  81.                 add di,16
  82.                 add si,32
  83.                 pop cx
  84.                 loop s4
  85.                
  86.                 mov ax,4c00h
  87.                 int 21h

  88. ;除法       
  89. chufa:       
  90.                 push bx
  91.                 push ax
  92.                 mov ax,dx
  93.                 mov dx,0
  94.                 div cx
  95.                 mov bx,ax
  96.                 pop ax
  97.                 div cx
  98.                 mov cx,dx
  99.                 mov dx,bx
  100.                 pop bx
  101.                 ret

  102. ;转换2进制数据,并且变为ascii值
  103. dtoc2:
  104.                 push cx
  105.                 push di
  106.                 push bx
  107.                 push si
  108.                 push dx
  109.                 mov si,0
  110.                 mov di,0
  111.                 mov bx,10
  112.         s:        mov dx,0
  113.                 div bx
  114.                 mov cx,ax
  115.                 jcxz keyi
  116.                 add dx,30h
  117.                 push dx
  118.                 inc di
  119.                 jmp s
  120.         keyi:
  121.                 add dx,30h
  122.                 push dx
  123.                 inc di
  124.                 mov cx,di
  125.         s3:
  126.                 pop dx
  127.                 mov es:[si],dl
  128.                 mov ax,2
  129.                 mov es:[si+1],al
  130.                 add si,2
  131.                 loop s3
  132.                
  133.                 pop dx
  134.                 pop si
  135.                 pop bx
  136.                 pop di
  137.                 pop cx
  138.                 ret
  139. code ends
  140. end start
复制代码
  求解      

最佳答案

查看完整内容

还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改为了0。所以。。。。。不用我说了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-1 22:24:52 From FishC Mobile | 显示全部楼层
还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改为了0。所以。。。。。不用我说了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-1 22:48:10 | 显示全部楼层
那个狂潮这里代码,直接div word ptr es:[di]为何不会除法溢出,十分不解,我试了,为何不行啊   
; 复制人均收入
    mov ax, es:[bx]    ; 收入的低16位
    mov dx, es:2[bx]   ; 收入的高16位
    div word ptr es:[di]
    mov dx, 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-2 11:55:27 From FishC Mobile | 显示全部楼层
没大神吗?,自顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-3 22:14:20 | 显示全部楼层
本帖最后由 缌唸 于 2016-3-3 22:26 编辑

哈哈,楼主解决了,太高兴了,会了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-3 22:47:30 From FishC Mobile | 显示全部楼层
一大堆问题。push cx要放到循环里面。年份显示完后,为什么要调用dtoc2?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-3 22:53:23 From FishC Mobile | 显示全部楼层
看得出你程序思路是先将数据写入表格,再从表格显示到显存。你把数据写入表格就已经出错了,所以后面你从表格读取数据都出错。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
缌唸 + 1 + 1 谢谢你花费时间观看我这错误代码

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-3-4 13:08:34 | 显示全部楼层
聆云 发表于 2016-3-3 22:56
还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改 ...

谢谢,你看我的代码把,我的问题我已经明白了,不过感谢你看我的程序,毕竟放了两天都没人回,逼得我自己搞懂了, 最佳答案就给你吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-4 13:35:50 From FishC Mobile | 显示全部楼层
不客气,能自己解决,收获更大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-4 13:40:02 From FishC Mobile | 显示全部楼层
狂潮的程序有bug....在dtoc那里。用divdw计算后,cx放余数,dx 放商的高16位,ax放商的低16位,然后判断商是否为0时,只判断了商的低16位是否为0,那高16位呢?为什么不判断?难道低16位为0就认为高16位也为0??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-5 14:54:50 | 显示全部楼层
聆云 发表于 2016-3-4 13:40
狂潮的程序有bug....在dtoc那里。用divdw计算后,cx放余数,dx 放商的高16位,ax放商的低16位,然后判断商 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 13:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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