- [qiangzi] ;(因为bx+1,要等于0,所以第2个字节要为0) 这话好像有点错误吧,是不是第2,3个字节为0啊 01/21 19:23
- [ryan1779] 是啊,后来发现写 mov [bx+2],cx 就好了 08/11 22:36
- [tinyparticle] 第(2)中有错误,mov [bx+2],0b83h此条指令中的0b83h是博主debug中的默认段地 07/31 18:22
- [ryan1779] 感谢ls几位的热心解答,总于搞出来了。 mov ax,0a8h[bx],bx出错了,又多用了个寄存 07/28 10:58
- [younggay] 上面的地址计算看明白了,是手动计算的,没什么问题。呵呵 不过,我跟踪了一下,你的程序在寻址想内 07/27 10:11
- [younggay] mov ax,0a8h[bx] =================== 怎么是0a8H的起始 07/27 09:53
- [younggay] 除法溢出,说明做运算的两个数据可能有点问题。你单步跟踪,看看到底是哪里出现溢出,看一下此时的两个数据 07/27 09:45
- [tinyparticle] mov ax,0a8h[bx] mov es:0ah[bx],ax 这里好像 07/26 20:04
- [游客] 程序第一行的assume写错了,编译出错,修改后程序运行正确。 07/20 09:37
- [ryan1779] 现在的理解是,16字节内的(包括16字节,算一个段,10H),超出16字节,但不超出32字节的,也算 07/19 15:52
[2009-07-25 13:08] 实验7
assume cs:codesg
data 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 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
codesg segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov di,0
mov cx,21
s0:mov bp,cx
mov si,0
mov cx,2
s:mov ax,[di]
mov es:[bx][si],ax
mov ax,54h[di]
mov es:5h[bx][si],ax
add si,2
add di,2
loop s
mov ax,0a8h[bx]
mov es:0ah[bx],ax
mov dx,es:7h[bx]
mov ax,es:5h[bx]
div word ptr es:0ah[bx]
mov es:0dh[bx],ax
add bx,16
mov cx,bp
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
------------------------------------------------------
------------------------------------------------------
在debug里是这样的
AX=0068 BX=0040 CX=0012 DX=0004 SP=0000 BP=0012 SI=0004 DI=0010
DS=0B82 ES=0B90 SS=0B82 CS=0BA5 IP=004B NV UP EI PL NZ NA PO NC
0BA5:004B E2C6 LOOP 0013
-d es:0
0B90:0000 31 39 37 35 20 10 00 00-00 20 02 00 20 08 00 20 1975 .... .. ..
0B90:0010 31 39 37 36 20 16 00 00-00 20 0C 00 20 01 00 20 1976 .... .. ..
0B90:0020 31 39 37 37 20 7E 01 00-00 20 39 00 20 06 00 20 1977 ~... 9. ..
0B90:0030 31 39 37 38 20 4C 05 00-00 20 0D 00 20 68 00 20 1978 L... .. h.
0B90:0040 79 65 61 72 20 73 75 6D-6D 20 6E 65 20 3F 3F 20 year summ ne ??
0B90:0050 79 65 61 72 20 73 75 6D-6D 20 6E 65 20 3F 3F 20 year summ ne ??
0B90:0060 79 65 61 72 20 73 75 6D-6D 20 6E 65 20 3F 3F 20 year summ ne ??
0B90:0070 79 65 61 72 20 73 75 6D-6D 20 6E 65 20 3F 3F 20 year summ ne ??
-
可是搞到后面提示我说溢出了。我现在都不知道这样做是不是符合题意~!!
[ tinyparticle 发表于 2009-07-26 20:04 ]
mov ax,0a8h[bx]
mov es:0ah[bx],ax
这里好像[bx]指向有问题,后面有条指令add bx,16,数据段中的偏移地址更改后,指向会出现错误
[ younggay 发表于 2009-07-27 09:45 ]
除法溢出,说明做运算的两个数据可能有点问题。你单步跟踪,看看到底是哪里出现溢出,看一下此时的两个数据是不是弄错了,书上给出的数据应该不会溢出的。
查找问题的时候,要尽可能的细节,从面上来看有时候很难看到问题所在。
现在是锻炼你debug单步调试的好机会,我相信博主会自己界定出问题出在什么地方的。
[ younggay 发表于 2009-07-27 09:53 ]
mov ax,0a8h[bx]
===================
怎么是0a8H的起始偏移啊?!定位错了吧?你debug看看这里给ax的数据是你data段中的数据么?!
[ younggay 发表于 2009-07-27 10:11 ]
上面的地址计算看明白了,是手动计算的,没什么问题。呵呵
不过,我跟踪了一下,你的程序在寻址想内存中写入数据的时候,公司雇员好像有问题,你可以debug下T命令跟踪一下,看一下每次你写入内存中的数据是不是都正确?然后你可以看一下你的div指令的时候,除数和被除数的数据是否都是正确的数据,我跟踪了一下,发现从数据有问题。你耐心debug下看一下。
[ ryan1779 发表于 2009-07-28 10:58 ]
感谢ls几位的热心解答,总于搞出来了。
mov ax,0a8h[bx],bx出错了,又多用了个寄存器就把问题解决了。
看来学汇编一定要仔细啊。