yearn2005 发表于 2013-5-24 05:17:35

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

先把 源程序贴上,好长啊 。 问题放到自己的沙发上,这样看起来会清晰点。
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:
             mov es:,ax
               mov ax,ds:
             mov es:,ax
                      
               mov ax,ds:
               mov es:,ax
               mov dx,ds:
               mov es:,dx
               
         mov bx,ds:
               mov es:,bx
               
               div word ptr bx
               mov es:,ax
               add si,4
               add di,16
             
               loop s
               
               mov ax,4c00h
               int 21h
               
codesg ends
end start

yearn2005 发表于 2013-5-24 05:55:21

调试了很久没通过,看源代码自己怎么也没找出毛病在哪。
F:\a>debug s7.exe省略 加载部分
AX=0010BX=0003CX=0015DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13E9ES=13F7SS=13E9CS=140CIP=0038   NV UP EI PL NZ NA PO NC
140C:0038 F7F3          DIV   BX
-t

AX=0005BX=0003CX=0015DX=0001SP=0000BP=0000SI=0000DI=0000这里都对的 CX=15H
DS=13E9ES=13F7SS=13E9CS=140CIP=003A   NV UP EI PL NZ NA PO NC
140C:003A 26            ES:
140C:003B 89450D      MOV   ,AX                         ES:000D=3F3F
-u
140C:003A 26            ES:
140C:003B 89450D      MOV   ,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:000031 39 37 35 31 39 37 36-31 39 37 37 31 39 37 38   1975197619771978
13E9:001031 39 37 39 31 39 38 30-31 39 38 31 31 39 38 32   1979198019811982
13E9:002031 39 38 33 31 39 38 34-31 39 38 35 31 39 38 36   1983198419851986
13E9:003031 39 38 37 31 39 38 38-31 39 38 39 31 39 39 30   1987198819891990
13E9:004031 39 39 31 31 39 39 32-31 39 39 33 31 39 39 34   1991199219931994
13E9:005031 39 39 35 10 00 00 00-16 00 00 00 7E 01 00 00   1995........~...
13E9:00604C 05 00 00 56 09 00 00-40 1F 00 00 80 3E 00 00   L...V...@....>..
13E9:0070A6 5F 00 00 91 C3 00 00-C7 7C 01 00 81 24 02 00   ._.......|...$..
-d es:00
13F7:000031 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
13F7:001031 39 37 36 20 16 00 00-00 20 09 00 20 02 00 20   1976 .... .. ..
13F7:002031 39 37 37 20 7E 01 00-00 20 1C 00 20 0D 00 20   1977 ~... .. ..
13F7:003031 39 37 38 20 4C 05 00-00 20 82 00 20 0A 00 20   1978 L... .. ..
13F7:004031 39 37 39 20 56 09 00-00 20 DC 01 20 05 00 20   1979 V... .. ..
13F7:005031 39 38 30 20 40 1F 00-00 20 E9 03 20 07 00 20   1980 @... .. ..
13F7:006031 39 38 31 20 80 3E 00-00 20 D2 08 20 07 00 20   1981 .>.. .. ..
13F7:007031 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:00604C 05 00 00 56 09 00 00-40 1F 00 00 80 3E 00 00   L...V...@....>..
13E9:0070A6 5F 00 00 91 C3 00 00-C7 7C 01 00 81 24 02 00   ._.......|...$..
13E9:00808A 03 03 00 7C 47 05 00-EB 03 09 00 CA 42 0C 00   ....|G.......B..
13E9:009018 0D 12 00 38 1F 1C 00-58 19 2A 00 28 44 39 00   ....8...X.*.(D9.
13E9:00A028 F0 46 00 68 97 5A 00-03 00 07 00 09 00 0D 00   (.F.h.Z.........
13E9:00B01C 00 26 00 82 00 DC 00-DC 01 0A 03 E9 03 A2 05   ..&.............
13E9:00C0D2 08 E9 0A C5 0F 03 16-22 20 BC 2C 5E 38 99 3B   ........" .,^8.;
13E9:00D088 45 00 00                                       .E..

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

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



-


bafengao 发表于 2013-5-24 05:56:07

强烈支持楼主ing……

yearn2005 发表于 2013-5-24 06:16:26

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

yearn2005 发表于 2013-5-24 06:23:27

本帖最后由 yearn2005 于 2013-5-24 06:27 编辑

汗 3#的怎么早啊 ,我还以为大清早就我个把野猫不睡觉等早饭呢。。。。:P吃完早饭去睡觉。晚上来看解惑的。
估计小甲鱼老湿还在梦中数头发把?苍老师的头发。。。。。。。。。。。。。

-_旧梦失辞_/r° 发表于 2013-5-24 07:08:44

无回帖,不论坛,这才是人道。

y2kfdjk 发表于 2013-5-24 08:57:10

强烈支持楼主ing……

沉默的风采 发表于 2013-5-24 11:30:55

楼主加油,鱼C加油!我们都看好你哦!

穷山恶水出刁民 发表于 2013-5-24 14:12:38

把你的代码逐行注释一遍,应该可以发现问题

yearn2005 发表于 2013-5-24 14:40:52

本帖最后由 yearn2005 于 2013-5-24 15:17 编辑

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





yearn2005 发表于 2013-5-24 15:48:14

终于找都个低级错误 WD段按4个字节去寻址了
               mov bx,ds:[bp+0a8h]       BP原来是用DI的下面的代码中是ADD DI,4 造成被除数装载错误。增加新的寄存器变量BP
               mov es:,bx
               
               div bx
               mov es:,ax
               add bp,2                         BP自增2 错误解决
               add si,4
               add di,16

               

yearn2005 发表于 2013-5-24 16:13:21

本帖最后由 yearn2005 于 2013-5-24 16:15 编辑

-d ds:0040
13E9:004031 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:00604C 05 00 00 56 09 00 00-40 1F 00 00 80 3E 00 00   L...V...@....>..
13E9:0070A6 5F 00 00 91 C3 00 00-C7 7C 01 00 81 24 02 00   ._.......|...$..
13E9:00808A 03 03 00 7C 47 05 00-EB 03 09 00 CA 42 0C 00   ....|G.......B..
13E9:009018 0D 12 00 38 1F 1C 00-58 19 2A 00 28 44 39 00   ....8...X.*.(D9.
13E9:00A028 F0 46 00 68 97 5A 00-03 00 07 00 09 00 0D 00   (.F.h.Z.........
13E9:00B01C 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:内存定位按0054H得到的数值却是正确的00 00 00 16.

页: [1]
查看完整版本: 呼叫甲鱼老鸟程序猿。。实验7