|
主题 : : 试验5:第五题的问题? [待解决] |
回复[ 8次 ]
点击[ 721次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-01-20 10:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-12-31 09:39 |
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:mov ax,a
mov es,ax
mov ax,c
mov ds,ax
mov bx,0
mov cx,8
s1:mov ax,es:[bx]
add [bx],ax
add bx,2
loop s1
mov ax,b
mov es,ax
mov ds,ax
mov bx,0
mov cx,8
s2:mov ax,es:[bx]
add [bx],ax
add bx,2
loop s2
mov ax,4c00h
int 21h
code ends
end start
这是我的实验答案,但用debug 跟踪,用u命令查看是如下结果,
-u
13EE:0000 B8EC13 MOV AX,13EC
13EE:0003 8ED8 MOV DS,AX
13EE:0005 B8ED13 MOV AX,13ED
13EE:0008 8EC0 MOV ES,AX
13EE:000A BB0000 MOV BX,0000
13EE:000D B90800 MOV CX,0008
13EE:0010 8B07 MOV AX,[BX]
13EE:0012 26 ES:
13EE:0013 0107 ADD [BX],AX
13EE:0015 43 INC BX
13EE:0016 E2F8 LOOP 0010
13EE:0018 B8EB13 MOV AX,13EB
13EE:001B 8ED8 MOV DS,AX
13EE:001D B8ED13 MOV AX,13ED
-
无法继续。。。。。用g命令:
-g 1d
AX=13EB BX=0008 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13EB ES=13ED SS=13EB CS=13EE IP=001D NV UP EI PL NZ NA PO NC
13EE:001D B8ED13 MOV AX,13ED
-g 1e
Program terminated normally
这是为什么呢? | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-01-20 11:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
看了一下,楼主的程序好像有点问题。
mov ax,b
mov es,ax
mov ds,ax
mov bx,0
mov cx,8
s2:mov ax,es:[bx]
add [bx],ax
add bx,2
loop s2
-------------------------
是不是同一个位置的数据自加,并不是加到c段中。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-01-20 12:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
建议楼主跟踪的时候一步步的来,G命令一下过去,很难找出问题啊。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-02-27 23:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-02-24 19:41 |
楼主,声明的是db哦,,不是dw。。。b每次加1......ax。。是字。题目是字节。。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-03-04 02:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:1
注册日期:2008-03-01 17:14 |
mov ax,b
mov es,ax
mov ds,ax
把B同时送了附加段和数据段 | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-03-04 15:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:32
信誉值:0
注册日期:2008-01-15 12:22 |
从这章前几个题的实验我们可以知道,cpu再给段分配内存空间的时候是以16的倍数分配的。虽然上面的程序段中都只申请了8个字节,但是a段首地址和b段的首地址相差应该是16字节。同样b和c段的首地址之差也应该是16字节。我觉得这个程序利用前几道题我们得出的结论,在得到一个段首地址的情况下去定位其他段应该是个不错的方法。也省去了段地址的多次设定。
楼主可以试试~ | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-05-15 15:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-15 15:02 |
你这个好像是某个人做的课后题答案吧。好像很多都有错误的。就像这个。不知道是手误还是故意的。
mov ax,b
mov es,ax
mov ds,ax '//这里传到段地址就错了。底下用的add [bx],ax 那就是用ds数据段当做c段来存放结果。之类又把b段传到ds中。= =。真郁闷
mov bx,0
mov cx,8
s2:mov ax,es:[bx] | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-05-15 15:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-15 15:02 |
好像题目上边写着是用db来定义字节的。单个字节。底下是add bx,2 = =+。而且在这章好像没提到db 只有dw。
总体感觉。很乱很乱。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-05-22 23:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-18 14:45 |
根据LZ的答案改了一下
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:mov ax,a
mov es,ax
mov ax,c
mov ds,ax
mov bx,0
mov cx,4
s1:mov ax,es:[bx]
add [bx],ax
add bx,2
loop s1
mov ax,b
mov es,ax
mov bx,0
mov cx,4
s2:mov ax,es:[bx]
add [bx],ax
add bx,2
loop s2
mov ax,4c00h
int 21h
code ends
end start
编译后------------------------------------------------------
Message:
You will be access debug mode! If you want to quit debug mode,
please press key 'q'(or 'Q') and press key 'Enter'.
-u cs:0 32
29A2:0000 B89F29 MOV AX,299F
29A2:0003 8EC0 MOV ES,AX
29A2:0005 B8A129 MOV AX,29A1
29A2:0008 8ED8 MOV DS,AX
29A2:000A BB0000 MOV BX,0000
29A2:000D B90400 MOV CX,0004
29A2:0010 26 ES:
29A2:0011 8B07 MOV AX,[BX]
29A2:0013 0107 ADD [BX],AX
29A2:0015 83C302 ADD BX,+02
29A2:0018 E2F6 LOOP 0010
29A2:001A B8A029 MOV AX,29A0
29A2:001D 8EC0 MOV ES,AX
29A2:001F BB0000 MOV BX,0000
29A2:0022 B90400 MOV CX,0004
29A2:0025 26 ES:
29A2:0026 8B07 MOV AX,[BX]
29A2:0028 0107 ADD [BX],AX
29A2:002A 83C302 ADD BX,+02
29A2:002D E2F6 LOOP 0025
29A2:002F B8004C MOV AX,4C00
29A2:0032 CD21 INT 21
-g 002f
AX=0807 BX=0008 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=29A1 ES=29A0 SS=299F CS=29A2 IP=002F NV UP EI PL NZ NA PO NC
29A2:002F B8004C MOV AX,4C00
-d ds:0 f(C段的结果)
29A1:0000 02 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00 ................
-d es:0 f
29A0:0000 01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00 ................
---------------------------------------------------------------------------------
关于循环中 add bx,2
db 申请的1个字节的空间,所以大家都会考虑循环中bx+2,
但是当29A2:0026 8B07 MOV AX,[BX]时,是把0201送到了ax中(ax占16位),
所以29A2:0013 0107 ADD [BX],AX后,C段内容应如下
-d ds:0 f
29A1:0000 01 02 00 00 00 00 00 00-00 00 00 00 00 00 00 00
这也是mov cx,4的原因 | | |
|