鱼C论坛

 找回密码
 立即注册
查看: 2302|回复: 11

呼叫甲鱼老鸟程序猿。。实验7

[复制链接]
发表于 2013-5-24 05:17:35 | 显示全部楼层 |阅读模式

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

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

x
先把 源程序贴上,好长啊 。 问题放到自己的沙发上,这样看起来会清晰点。
assume cs:codesg,ds:datasg,es:tablesg
datasg segment
         db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
                 db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
                 db '1993','1994','1995'                                                
                 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
         dd 345980,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
                 dw 11452,14430,15257,17800                                               
datasg ends

tablesg segment
         db 21 dup ('year summ ne ?? ')                                             
tablesg ends

codesg segment

  start:         
         mov ax,datasg
                 mov ds,ax
                 mov si,0
                 
                 mov ax,tablesg
                 mov es,ax
                 mov di,0
                 
                 mov bx,0
                 mov cx,21
                 
    s:   mov ax,ds:[si]
             mov es:[di],ax
                 mov ax,ds:[si+2]
             mov es:[di+2],ax
                        
                 mov ax,ds:[si+54h]
                 mov es:[di+5],ax
                 mov dx,ds:[si+56h]
                 mov es:[di+7],dx
                 
         mov bx,ds:[si+0a8h]
                 mov es:[di+10],bx
                 
                 div word ptr bx
                 mov es:[di+13],ax
                 add si,4
                 add di,16
             
                 loop s
                 
                 mov ax,4c00h
                 int 21h
                 
codesg ends
end start

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

使用道具 举报

 楼主| 发表于 2013-5-24 05:55:21 | 显示全部楼层
调试了很久没通过,看源代码自己怎么也没找出毛病在哪。
F:\a>debug s7.exe  省略 加载部分
AX=0010  BX=0003  CX=0015  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=13E9  ES=13F7  SS=13E9  CS=140C  IP=0038   NV UP EI PL NZ NA PO NC
140C:0038 F7F3          DIV     BX
-t

AX=0005  BX=0003  CX=0015  DX=0001  SP=0000  BP=0000  SI=0000  DI=0000  这里都对的 CX=15H
DS=13E9  ES=13F7  SS=13E9  CS=140C  IP=003A   NV UP EI PL NZ NA PO NC
140C:003A 26            ES:
140C:003B 89450D        MOV     [DI+0D],AX                         ES:000D=3F3F
-u
140C:003A 26            ES:
140C:003B 89450D        MOV     [DI+0D],AX
140C:003E 83C604        ADD     SI,+04
140C:0041 83C710        ADD     DI,+10
140C:0044 E2D0          LOOP    0016                                                                LOOP=16? 设置CX=21=15H才对啊
140C:0046 B8004C        MOV     AX,4C00
140C:0049 CD21          INT     21

运行G 140c:0046后 直接被弹出DEBUG,只好再次DEBUG s7.exe.手动运行,T+ 回车,N次。钢琴有这么好弹就好了 。。。。
-d ds:00
13E9:0000  31 39 37 35 31 39 37 36-31 39 37 37 31 39 37 38   1975197619771978
13E9:0010  31 39 37 39 31 39 38 30-31 39 38 31 31 39 38 32   1979198019811982
13E9:0020  31 39 38 33 31 39 38 34-31 39 38 35 31 39 38 36   1983198419851986
13E9:0030  31 39 38 37 31 39 38 38-31 39 38 39 31 39 39 30   1987198819891990
13E9:0040  31 39 39 31 31 39 39 32-31 39 39 33 31 39 39 34   1991199219931994
13E9:0050  31 39 39 35 10 00 00 00-16 00 00 00 7E 01 00 00   1995........~...
13E9:0060  4C 05 00 00 56 09 00 00-40 1F 00 00 80 3E 00 00   L...V...@....>..
13E9:0070  A6 5F 00 00 91 C3 00 00-C7 7C 01 00 81 24 02 00   ._.......|...$..
-d es:00
13F7:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
13F7:0010  31 39 37 36 20 16 00 00-00 20 09 00 20 02 00 20   1976 .... .. ..
13F7:0020  31 39 37 37 20 7E 01 00-00 20 1C 00 20 0D 00 20   1977 ~... .. ..
13F7:0030  31 39 37 38 20 4C 05 00-00 20 82 00 20 0A 00 20   1978 L... .. ..
13F7:0040  31 39 37 39 20 56 09 00-00 20 DC 01 20 05 00 20   1979 V... .. ..
13F7:0050  31 39 38 30 20 40 1F 00-00 20 E9 03 20 07 00 20   1980 @... .. ..
13F7:0060  31 39 38 31 20 80 3E 00-00 20 D2 08 20 07 00 20   1981 .>.. .. ..
13F7:0070  31 39 38 32 20 A6 5F 00-00 20 C5 0F 20 06 00 20   1982 ._.. .. ..
第2个问题 。

-d ds:0054
13E9:0050                      10 00 00 00-16 00 00 00 7E 01 00 00       ........~...
13E9:0060  4C 05 00 00 56 09 00 00-40 1F 00 00 80 3E 00 00   L...V...@....>..
13E9:0070  A6 5F 00 00 91 C3 00 00-C7 7C 01 00 81 24 02 00   ._.......|...$..
13E9:0080  8A 03 03 00 7C 47 05 00-EB 03 09 00 CA 42 0C 00   ....|G.......B..
13E9:0090  18 0D 12 00 38 1F 1C 00-58 19 2A 00 28 44 39 00   ....8...X.*.(D9.
13E9:00A0  28 F0 46 00 68 97 5A 00-03 00 07 00 09 00 0D 00   (.F.h.Z.........
13E9:00B0  1C 00 26 00 82 00 DC 00-DC 01 0A 03 E9 03 A2 05   ..&.............
13E9:00C0  D2 08 E9 0A C5 0F 03 16-22 20 BC 2C 5E 38 99 3B   ........" .,^8.;
13E9:00D0  88 45 00 00                                       .E..

该段中的00 00 00-16 对应的位置是ds偏移地址的55H啊 没想明白这个绿色的10

DB段中0-53H   ,DD段应该是54H起始位置 ,源代码中DB DD段中间有个换行符,10难道是换行符?



-


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

使用道具 举报

发表于 2013-5-24 05:56:07 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-24 06:16:26 | 显示全部楼层
一晚上搞下来 吃不消了,对照王爽老师的答案 。
mov ax,[bx].84
        mov es:[si].5,ax
        mov dx,[bx].86
        mov es:[si].7,dx
        div word ptr ds:[di].168
        mov es:[si].13,ax
        
        mov ax,[di].168          这里错的吧? DW中本来就是字型数据 他 ADD DI,2  ????
        mov es:[si].10,ax
        add di,2
        add bx,4
        add si,16
        loop s            《-----他滴。
我滴----》mov    ax,ds:[si+54h]                  DS数据段
                 mov es:[di+5],ax
                 mov dx,ds:[si+56h]
                 mov es:[di+7],dx               ES table段
                 
         mov     bx,ds:[si+0a8h]
                 mov es:[di+10],bx
                 
                 div word ptr bx
                 mov es:[di+13],ax   【AX】中的商 送入es:[di+13]  一次就搞定的没错把?不过DX中的余数不知道怎么处理,题目没要求。
                 add si,4
                 add di,16

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

使用道具 举报

 楼主| 发表于 2013-5-24 06:23:27 | 显示全部楼层
本帖最后由 yearn2005 于 2013-5-24 06:27 编辑

汗 3#的怎么早啊 ,我还以为大清早就我个把野猫不睡觉等早饭呢。。。。:P吃完早饭去睡觉。晚上来看解惑的。
估计小甲鱼老湿还在梦中数头发把?  苍老师的头发。。。。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-24 07:08:44 | 显示全部楼层
无回帖,不论坛,这才是人道。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-24 08:57:10 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-24 11:30:55 | 显示全部楼层
楼主加油,鱼C加油!我们都看好你哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-24 14:12:38 | 显示全部楼层
把你的代码逐行注释一遍,应该可以发现问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-24 14:40:52 | 显示全部楼层
本帖最后由 yearn2005 于 2013-5-24 15:17 编辑

找到 程序跳出的原因了   mov ax,ds:[si+54h]     
                                       mov es:[di+5],ax                                                                           
                                       mov es:[di+7],dx   
                                       mov dx,ds:[si+56h]       以上 被除数高位进DX 低位进AX
                 
                                        mov bx,ds:[si+0a8h]    除数进BX  ,书本32位除法只有一个范例。所以这段是参考课本把被除数赋值                                                    给了BX,课本在32除法代码  (DIV BX)并不指定数据类型
                                         mov es:[di+10],bx                                         div word ptr bx                   指定类型WORD 不行。
                                         mov es:[di+13],ax
这2行代码删除后 程序能正常运行到结束
改成          div bx                                                          未指定类型也不行
                 mov es:[di+13],ax
还是不行
除数 指定BX寄存器的话 默认就是被除数32位,除数是16位,没错的吧?课本和视频并没解释范例里 为什么没有指定数据类型
书本和视频对DIV指令都介绍的不多啊,有没有老鸟上来解释下 DIV的详细运用规则。





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

使用道具 举报

 楼主| 发表于 2013-5-24 15:48:14 | 显示全部楼层
终于找都个低级错误 WD段按4个字节去寻址了
                 mov bx,ds:[bp+0a8h]       BP  原来是用DI的  下面的代码中是ADD DI,4 造成被除数装载错误。增加新的寄存器变量BP
                 mov es:[di+10],bx
                 
                 div bx
                 mov es:[di+13],ax
                 add bp,2                         BP自增2 错误解决
                 add si,4
                 add di,16

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

使用道具 举报

 楼主| 发表于 2013-5-24 16:13:21 | 显示全部楼层
本帖最后由 yearn2005 于 2013-5-24 16:15 编辑

-d ds:0040
13E9:0040  31 39 39 31 31 39 39 32-31 39 39 33 31 39 39 34   1991199219931994
13E9:0050 31 39 39 35 10 00 00 00-16 00 00 00 7E 01 00 00   1995........~...
13E9:0060  4C 05 00 00 56 09 00 00-40 1F 00 00 80 3E 00 00   L...V...@....>..
13E9:0070  A6 5F 00 00 91 C3 00 00-C7 7C 01 00 81 24 02 00   ._.......|...$..
13E9:0080  8A 03 03 00 7C 47 05 00-EB 03 09 00 CA 42 0C 00   ....|G.......B..
13E9:0090  18 0D 12 00 38 1F 1C 00-58 19 2A 00 28 44 39 00   ....8...X.*.(D9.
13E9:00A0  28 F0 46 00 68 97 5A 00-03 00 07 00 09 00 0D 00   (.F.h.Z.........
13E9:00B0  1C 00 26 00 82 00 DC 00-DC 01 0A 03 E9 03 A2 05   ..&.............


蓝色字段31 39 39 35是字符串1991        占用 DS:0050-0053 内存段
00 00 00-16                                            占用DS:0055-0058 内存段  
中间夹的 那个10 按ASC码是回车符  占用了    DS:0054的内存
这里真的是搞不明白了。
实验7中 年收入段的 第一个DD 00 00 00 16是按 DS:0054H定位的,而且实验下来也都正常啊。
谁能解释下 这 DS:0054h 上的10是什么意思,为什么程序mov ax,ds:[si+54h]内存定位按0054H得到的数值却是正确的00 00 00 16.

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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