鱼C论坛

 找回密码
 立即注册
查看: 2735|回复: 5

求助啊,课程设计一

[复制链接]
发表于 2016-8-14 20:04:37 | 显示全部楼层 |阅读模式

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

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

x
代码:
  1. assume cs:codesg,ds:datasg,ss:stacksg,es:table
  2. table 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.         ;以上是表示21年的21个字符串(0 - 53h) 84
  7.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  8.     dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
  9.         ;以上是表示21年公司总收入的21个dword型数据(54h - A7h)84
  10.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  11.     dw 11542,14430,15257,17800
  12.         ;以上是表示21年公司雇员人数的21个word 型数据(A8h - D1h)
  13.         dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
  14.     dw 260,304,333;(D2h -FBh )
  15. table ends
  16. datasg segment
  17.         dw 21 dup(0)
  18. datasg ends

  19. stacksg segment
  20.         dw 20 dup(0)
  21. stacksg ends
  22. codesg segment;实验要求:将datasg段中的数据输出
  23.         start:        mov ax,datasg
  24.                                 mov ds,ax
  25.                                
  26.                                 mov ax,table
  27.                                 mov es,ax
  28.                                
  29.                                 mov ax,stacksg
  30.                                 mov ss,ax
  31.                                 mov sp,40
  32.                                 ;初始化各段
  33.                                
  34.                                
  35.                                 mov si,0

  36.                                 mov cx,21
  37.                                 push cx
  38.                                
  39.                                 mov dh,1
  40.                                 mov dl,1;输出属性
  41.                                 mov cl,2
  42.                                 mov si,0
  43.                                 mov di,0
  44.                                 mov bx,0
  45.                                
  46. _out_put:        mov ax,es:[bx] ;年份
  47.                                 mov [si],ax
  48.                                 mov ax,es:[bx].2
  49.                                 mov [si+2],ax
  50.                                
  51.                                 mov ax,es:[bx+54h];收入
  52.                                 mov dx,es:[bx+56h]
  53.                                 add si,6
  54.                                 call dtoc
  55.                                
  56.                                 mov ax,es:[di+0A8h];人数
  57.                                 add si,2
  58.                                 call dtoc
  59.                                
  60.                                 mov ax,es:[di+0D2h]
  61.                                 add si,2
  62.                                 call dtoc
  63.                                 inc si
  64.                                 mov byte ptr [si],0
  65.                                 mov si,0;索引字符串首地址
  66.                                
  67.                                 call show_str
  68.                                
  69.                                 inc dh;下一行
  70.                                 add bx,4
  71.                                 add di,2
  72.                                 pop cx
  73.                                
  74.                                 loop _out_put
  75.                                
  76.                                 mov ax,4c00h
  77.                                 int 21h
  78. show_str:                ;将指定字符串 (以0结尾)输出到屏幕
  79.                                         ;参数:        1.输出字符串的行        (dh 0-24)
  80.                                         ;                        2.输出字符串的列        (dl  0-79)
  81.                                         ;                        3.输出字符串的颜色(cl)
  82.                                         ;                        4.字符串起始地址si
  83.                                         ;返回值:        无
  84.                                         push ax
  85.                                         push es
  86.                                         push si
  87.                                         push bx
  88.                                         push dx
  89.                                         push cx
  90.                                         mov ax,0b800h ;载入显存地址
  91.                                         mov es,ax
  92.                                        
  93.                                         mov bl,dl
  94.                                         mov bh,0
  95.                                         mov ax,160;行*160+列
  96.                                         mul dh
  97.                                         add bx,ax;指向显存首次显示地址
  98.                                        
  99. show_react:        mov cl,[si]
  100.                                         mov ch,0
  101.                                         jcxz show_return
  102.                                         mov es:[bx],cl
  103.                                         pop cx
  104.                                         mov es:[bx+1],cl
  105.                                         push cx
  106.                                         inc si
  107.                                         add bx,2
  108.                                         jmp short show_react

  109. show_return:        pop cx
  110.                                         pop dx
  111.                                         pop bx
  112.                                         pop si
  113.                                         pop es
  114.                                         pop ax
  115.                                         ret
  116.                                        
  117. divdw:        ;功能:进行不会溢出的除法运算,被除数为dword 型,除数为word型,结果为dword型。
  118.                                 ;参数: 1.(ax) = dword 型数据的低16位
  119.                                 ;                 2.(dx) = dword 型数据的高16位
  120.                                 ;                 3.(cx) = 除数
  121.                                 ;返回值:        (dx) = 结果的高16位,(ax) = 结果的低16位
  122.                                 ;                        (cx) = 余数
  123.                                
  124.                                 ;X:被除数,范围:[0 - FFFFFFFF]
  125.                                 ;N:除数,范围:[0,FFFF]
  126.                                 ;H:X高16位,范围:[0,FFFF]
  127.                                 ;L:X低16位,范围:[0,FFFF]
  128.                                 ;int(): 描述性运算符,取商。
  129.                                 ;rem();描述性运算符,取余数。
  130.                                 ;公式:X/N = int (H/N)*65536 + [rem(H/N)*65536+L]/N
  131.                                 push bx
  132.                                 push ax
  133.                                
  134.                                 mov ax,dx
  135.                                 mov dx,0
  136.                                 div cx;ax为商,dx为余数,dx作为二次除法的高位
  137.                                 mov bx,ax
  138.                                 pop ax
  139.                                 div cx
  140.                                 mov cx,dx
  141.                                 mov dx,bx
  142.                                 pop bx
  143.                                 ret
  144. dtoc:                ;功能: 将 word 型数据转变为10进制数的字符串,字符串以0为结尾符
  145.                                         ;参数:(ax)=dword 型数据的低16位
  146.                                         ;                 (dx)=dword 型数据的高16位
  147.                                         ;                ds:si指向字符串的首地址
  148.                                         ;返回: 无
  149.                                         ;思路:除10求余+30h
  150.                                         push di
  151.                                         push ax
  152.                                         push cx
  153.                                         push dx
  154.                                         push si
  155.                                         mov di,0
  156.                                         mov cx,10d
  157. dtoc_div:               
  158.                                         call divdw
  159.                                         mov cx,ax
  160.                                         jcxz dtoc_ok
  161.                                         add dx,30h
  162.                                         push dx;字符入栈
  163.                                         inc di
  164.                                         jmp short dtoc_div
  165. dtoc_ok:               
  166.                                         add dx,30h
  167.                                         push dx
  168.                                         mov cx,di
  169.                                        
  170. dtoc_loop:        pop [si]
  171.                                         inc si
  172.                                         loop dtoc_loop
  173.                                 ;        mov byte ptr [si],0
  174.                                         pop si
  175.                                         pop dx
  176.                                         pop cx
  177.                                         pop ax
  178.                                         pop di
  179.                                         ret
  180.                                        
  181. codesg ends
  182. end start

  183.                                        
  184.                                        

  185.                                
复制代码



Debug调试: 5CDTV7T[ZTM32P]C7POX.png

不知道哪里出问题了,看了一天了,哪位大神帮下呗。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-14 20:06:48 | 显示全部楼层
头很晕,希望有人帮下,顶。。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-15 16:36:00 | 显示全部楼层
你用哪个版本的编译器?
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-15 19:56:48 | 显示全部楼层
大约看了一下,有逻辑错误
                              
        _out_put:                       mov ax,es:[bx] ;年份
                                mov [si],ax
                                mov ax,es:[bx].2
                                mov [si+2],ax
                                
                                mov ax,es:[bx+54h];收入
                                mov dx,es:[bx+56h]
                               add si,6
                                                            
                                call dtoc
                                
                                mov ax,es:[di+0A8h];人数
                                add si,2
                                call dtoc
                                
                                mov ax,es:[di+0D2h]
                                add si,2
                                call dtoc
                                inc si
                                mov byte ptr [si],0
                                mov si,0;索引字符串首地址
                                
                                call show_str
                                
                                inc dh;下一行
                                add bx,4
                                add di,2
                                pop cx          你在循环里 只做POP  会有问题吧
                                
                                loop _out_put



=======================================================
divdw:        ;功能:进行不会溢出的除法运算,被除数为dword 型,除数为word型,结果为dword型。
                                ;参数: 1.(ax) = dword 型数据的低16位
                                ;                 2.(dx) = dword 型数据的高16位
                                ;                 3.(cx) = 除数
                                ;返回值:        (dx) = 结果的高16位,(ax) = 结果的低16位
                                ;                        (cx) = 余数
                                
                                ;X:被除数,范围:[0 - FFFFFFFF]
                                ;N:除数,范围:[0,FFFF]
                                ;H:X高16位,范围:[0,FFFF]
                                ;L:X低16位,范围:[0,FFFF]
                                ;int(): 描述性运算符,取商。
                                ;rem();描述性运算符,取余数。
                                ;公式:X/N = int (H/N)*65536 + [rem(H/N)*65536+L]/N
                                push bx
                                push ax
                                
                                mov ax,dx
                                mov dx,0
                                div cx;ax为商,dx为余数,dx作为二次除法的高位
                                mov bx,ax
                                pop ax
                                div cx
                                mov cx,dx
                                mov dx,bx       [rem(H/N)*65536+L]/N的商去哪啦
                                pop bx
                                ret
====================================================

还有你的 push 太多,应该溢出了

建议 先把框架写好,功能简单到复杂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-15 20:18:50 | 显示全部楼层
                    divdw:        ;功能:进行不会溢出的除法运算,被除数为dword 型,除数为word型,结果为dword型。
                                ;参数: 1.(ax) = dword 型数据的低16位
                                ;                 2.(dx) = dword 型数据的高16位
                                ;                 3.(cx) = 除数
                                ;返回值:        (dx) = 结果的高16位,(ax) = 结果的低16位
                                ;                        (cx) = 余数
                                
                                ;X:被除数,范围:[0 - FFFFFFFF]
                                ;N:除数,范围:[0,FFFF]
                                ;H:X高16位,范围:[0,FFFF]
                                ;L:X低16位,范围:[0,FFFF]
                                ;int(): 描述性运算符,取商。
                                ;rem();描述性运算符,取余数。
                                ;公式:X/N = int (H/N)*65536 + [rem(H/N)*65536+L]/N
                                push bx
                                push ax
                                
                                mov ax,dx
                                mov dx,0
                                div cx;ax为商,dx为余数,dx作为二次除法的高位
                                mov bx,ax
                                pop ax
                                div cx
                                mov cx,dx
                                mov dx,bx      
                                pop bx
                                ret
====================================================

这个逻辑没有问题,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-15 20:41:09 | 显示全部楼层
谢谢了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 01:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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