|
主题 : : 求一思考题答案 [待解决] |
回复[ 6次 ]
点击[ 569次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-04-06 14:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-05 09:40 |
4、循环计数器为零转指令(Jump if CX/ECX is Zero)
在前面的各类循环指令中,不管循环计数器的初值为何,循环体至少会被执行一次。当循环计数器的初值为0时,通常的理解应是循环体被循环0次,即循环体一次也不被执行。其实不然,循环体不是不被执行,而是会被执行65536次(用CX计数)或4294967296次(几乎是死循环,用ECX计数)。
为了解决指令的执行和常规思维之间差异,指令系统又提供了一条与循环计数器有关的指令——循环计数器为零转指令。该指令一般用于循环的开始处,其指令格式如下:
JCXZ 标号 ;当CX=0时,则程序转移标号处执行
JECXZ 标号 ;当ECX=0时,则程序转移标号处执行,80386+
例5.14 编写一段程序,求1+2+…+k(K≥0)之和,并把结果存入AX中。
解:
…
K DB ? ;变量定义
…
XOR AX, AX
MOV CX, K
JCXZ next
again: ADD AX, CX ;计算过程: K+(K-1)+…+2+1
LOOP again
next: …
思考题:假设变量K的值为0,并且在循环体的前面没有写指令“JCXZ next”,这时求出的“和”AX的值是什么? | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-04-06 14:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-05 09:40 |
|
|
|
|
|
[第2楼]
[ 回复时间:2008-04-06 15:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
书中提到“会被执行65536次(用CX计数)或4294967296次(几乎是死循环,用ECX计数)。”如何解释?
=================
这应该是对loop指令来说的。loop指令的执行过程是:
当遇到loop这个指令
1.cx=cx-1(ecx=ecx-1)
2.判断cx(ecx)是不是等于0,如果是,停止跳转,向下运行,否则跳转到标号处执行标号和loop之间的代码。
我们在遇到loop指令之前,必然已经执行了一边标号和loop指令之间的代码了,这就是“程序至少执行一次的说法”了。根据上面介绍的loop之指令运行过程,如果你将cx或ecx赋值0,首先,执行1次程序,遇到loop,然后cx=cx-1=FFFFH=65535(ecx=ecx-1=FFFFFFFFH=4294967295),这样,程序就会在运行65535(或4294967295)次,总共运行的次数就是65535+1=65536(或4294967295+1=4294967296)次了。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-04-10 12:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-05 09:40 |
思考题:假设变量K的值为0,并且在循环体的前面没有写指令“JCXZ next”,这时求出的“和”AX的值是什么? | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-04-30 09:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34 |
思考题:假设变量K的值为0,并且在循环体的前面没有写指令“JCXZ next”,这时求出的“和”AX的值是什么?
------------------
回复:好像楼主一直让别人思考啊,别人在思考这个问题的时候成长了,楼主你呢?
如果楼主有思考的想法也说来听听~ | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-04-30 22:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2008-03-27 16:25 |
回复:[第3楼]
------------------
应该是65535+65534+65533…………+0吧,原因二楼说的很明白了 | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-05-06 10:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-05 09:40 |
回复:[第5楼]
ax是16位寄存器65535+65534 时就要溢出,再往后如何加? | | |