呼叫甲鱼老鸟程序猿。。实验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
调试了很久没通过,看源代码自己怎么也没找出毛病在哪。
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难道是换行符?
-
强烈支持楼主ing…… 一晚上搞下来 吃不消了,对照王爽老师的答案 。
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:27 编辑
汗 3#的怎么早啊 ,我还以为大清早就我个把野猫不睡觉等早饭呢。。。。:P吃完早饭去睡觉。晚上来看解惑的。
估计小甲鱼老湿还在梦中数头发把?苍老师的头发。。。。。。。。。。。。。
无回帖,不论坛,这才是人道。 强烈支持楼主ing…… 楼主加油,鱼C加油!我们都看好你哦! 把你的代码逐行注释一遍,应该可以发现问题 本帖最后由 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的详细运用规则。
终于找都个低级错误 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: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]