|
主题 : : 关于检测点9.3的问题?? [待解决] |
回复[ 27次 ]
点击[ 1543次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-02-18 11:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-17 15:56 |
利用loop指令,实现在内存2000段中查找第一个值为0的byte, 找到后,将它的偏移地址存储在dx中
assume cs:code
code segment
start:mov ax, 2000h
mov ds, ax
mov bx, 0
s:mov cl, [bx]
mov ch, 0
____________
inc bx
loop s
ok:dec bx
mov dx, bx
mov ax, 4c00h
int 21h
code ends
end start
这个题里空的地方是添inc cx呢还是添dec cx呢?我感觉好象都可以啊!!我做的对不对啊!给个指导谢谢各位!
另外我想问下inc和dec是把内存地址加减1了还是把里面的内容加减1了?还有就是我想问下loop这个指令是不是说执行到这一条上才会cx=cx-1呢?? | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-02-18 13:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
inc 寄存器 这样的格式当然是将寄存器的内容加1了。
还有就是我想问下loop这个指令是不是说执行到这一条上才会cx=cx-1呢??
============
是的。loop相当于 cx=cx-1;cmp cx,0;jnz 标号。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-02-18 13:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
这个题里空的地方是添inc cx呢还是添dec cx呢?我感觉好象都可以啊!!
===============
inc是加1,dec是减1,当然不能都可以了。
楼主的最后一问,才是考虑这这个地方的关键点。考虑一下吧。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-02-18 15:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-17 15:56 |
那这么说应该是inc 1啦!对吧!因为cx内容变成1,然后执行到loop时减1变成0就会往下了对不? | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-04-15 13:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:44
信誉值:0
注册日期:2008-04-11 13:33 |
那这么说应该是inc 1啦!对吧!因为cx内容变成1,然后执行到loop时减1变成0就会往下了对不?
------------------
回复:对了,因为如果在执行loop前cx就等于0的话,loop时减1,cx就会变成0ffh了,这一点很重要哦 | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-04-17 14:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-04-05 19:14 |
ok:dec bx ?????
为什么要减去一呢? | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-04-19 16:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-04-05 19:14 |
|
|
|
|
|
[第7楼]
[ 回复时间:2008-10-03 10:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2008-08-02 09:52 |
真的很疑问。当[bx]值=00时
s:mov cl, [bx]
mov ch, 0
下面空格处添加inc cx
这时CX不就 是1了吗?非0
怎么就会跳到OK:dec bx这一条指令呢 | | |
|
|
|
|
[第8楼]
[ 回复时间:2008-11-12 17:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:3
注册日期:2008-07-24 01:31 |
怎么知道当找到[BX]等于前一位0时恰好能让CX-1等于0的? | | |
|
|
|
|
[第9楼]
[ 回复时间:2008-11-13 15:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-11-06 14:36 |
怎么知道当找到[BX]等于前一位0时恰好能让CX-1等于0的?
------------------
回复:接下来有一个loop s,会自动计算(cx)=(cx)-1,这个时候不就是1-1=0嘛,然后接着到ok:…… | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-11-15 12:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:3
注册日期:2008-07-24 01:31 |
我的表达错了吧,如何找到[BX]等于前一位0的那位数的 | | |
|
|
|
|
[第11楼]
[ 回复时间:2008-12-26 10:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-12-19 02:06 |
前面章节内容
执行loop 标号指令相当于 cx=cx-1
另外5楼
假设在4单元找到0,下面还有条指令inc bx这时候bx=5但应该是4单元找到的,所以dec bx | | |
|
|
|
|
[第12楼]
[ 回复时间:2009-01-09 16:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-20 17:02 |
assume cs:code
code segment
start:mov ax, 2000h
mov ds, ax
mov bx, 0
s:mov cl, [bx] ;如2000:0003内存单元中为0 ,cl=0
mov ch, 0
inc cx ;cx=0001
inc bx ;加1 2000:0004
loop s ;cx=cx-1
ok:dec bx ;上面加了1这里就减1 bx=0003
mov dx, bx ;DS:偏移地址 dx=0003
mov ax, 4c00h
int 21h
code ends
end start
debug 里面看就OK了。 | | |
|
|
|
|
[第13楼]
[ 回复时间:2009-02-19 10:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:11
信誉值:1
注册日期:2008-11-24 20:35 |
开始,不明白看了,楼上的分析后明白了,谢谢各位大虾 | | |
|
|
|
|
[第14楼]
[ 回复时间:2009-02-19 10:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:11
信誉值:1
注册日期:2008-11-24 20:35 |
开始,不明白,看了楼上的分析后明白了,谢谢各位大虾 | | |
|
|
|
|
[第15楼]
[ 回复时间:2009-03-02 07:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:5
注册日期:2008-12-18 16:07 |
|
|
|
|
|
[第16楼]
[ 回复时间:2009-03-15 09:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-14 20:58 |
|
|
|
|
|
[第17楼]
[ 回复时间:2009-08-24 21:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-08-24 21:15 |
|
|
|
|
|
[第18楼]
[ 回复时间:2009-09-17 12:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-10-29 16:30 |
|
|
|
|
|
[第19楼]
[ 回复时间:2009-11-07 17:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-06-29 16:09 |
jcxz offset ok+1
------------------
回复:思路很好,但是如果[BX]中的数据为1时就完了。
cx=1
jcxz=不操作
inc bx
loop=cx-1=0
向下执行
所以此题目的只能是 将 cx+1
inc cl\ inc cx \add cl,1\add cx,1 | | |
|
|
|
|
[第20楼]
[ 回复时间:2009-12-17 23:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-12-17 22:46 |
真的很疑问。当[bx]值=00时
s:mov cl, [bx]
mov ch, 0
下面空格处添加inc cx
这时CX不就 是1了吗?非0
怎么就会跳到OK:dec bx这一条指令呢
------------------
回复:
if((bx)==0)
s: mov ci,[bx]
mov ch,0 ;cx==0
inc cx ;cx==1
inc bx
loop s ;到s处后,先cx-1,发现cx==0所以,结束循环,执行ok:dec bx | | |
|
|
|
|
[第21楼]
[ 回复时间:2010-06-29 23:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-25 22:09 |
真的很疑问。当[bx]值=00时
s:mov cl, [bx]
mov ch, 0
下面空格处添加inc cx
这时CX不就 是1了吗?非0
怎么就会跳到OK:dec bx这一条指令呢
------------------
回复:
if((bx)==0)
s: mov ci,[bx]
mov ch,0 ;cx==0
inc cx ;cx==1
inc bx
loop s ;到s处后,先cx-1,发现cx==0所以,结束循环,执行ok:dec bx
------------------
有标号,不代表一定要有跳转语句跳转到这个标号,顺序执行到标号这行语句也是可以的啊 | | |
|
|
|
|
[第22楼]
[ 回复时间:2011-02-22 21:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-02-22 18:58 |
|
|
|
|
|
[第23楼]
[ 回复时间:2011-03-28 11:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-03-02 16:20 |
Jcxz offset ok+1 还是可以的吧。即使是bx内容为1,它顺序执行下去也是对的吧,如果是0的话,可以实现快速的跳转。 | | |
|
|
|
|
[第24楼]
[ 回复时间:2011-03-28 18:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-07-16 14:51 |
格式因为: jcxz 标号
所以应该为:jcxz ok+1
上级测试通过 | | |
|
|
|
|
[第25楼]
[ 回复时间:2011-05-06 10:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-03 21:02 |
就是就是先开始搞不明白为什么是inc cx再看上面大虾们的分析终于明白了!谢谢呀 | | |
|
|
|
|
[第26楼]
[ 回复时间:2011-07-01 09:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
Jcxz offset ok+1
offset可以这样用吗。我的编译器不支持这样的行为。不知道大家的怎么样。 | | |
|
|
|
|
[第27楼]
[ 回复时间:2011-07-01 09:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
jczx ok+1是不正确的。
假设2000:0 01 02 03 - - - -- - --
执行mov cl,[bx]
mov ch,0 此时 cx=1
jcxz bx+1 不作执行
inc bx
loop s cx-1=0跳出执行 就会导致找不到2000的第一个为零的字节,就程序就退出了。 | | |