. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  求一思考题答案  [待解决] 回复[ 6次 ]   点击[ 569次 ]  
chiwang
[帖 主]   [ 发表时间: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的值是什么?
chiwang
[第1楼]   [ 回复时间:2008-04-06 14:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-05 09:40
http://wncj.vicp.net:81/course/hep/huibianyuyan/05-2-081.htm

书中提到“会被执行65536次(用CX计数)或4294967296次(几乎是死循环,用ECX计数)。”如何解释?
wdm
[第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)次了。
chiwang
[第3楼]   [ 回复时间:2008-04-10 12:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-05 09:40
思考题:假设变量K的值为0,并且在循环体的前面没有写指令“JCXZ next”,这时求出的“和”AX的值是什么?
mouse
[第4楼]   [ 回复时间:2008-04-30 09:09 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
思考题:假设变量K的值为0,并且在循环体的前面没有写指令“JCXZ next”,这时求出的“和”AX的值是什么?
------------------
回复:好像楼主一直让别人思考啊,别人在思考这个问题的时候成长了,楼主你呢?
如果楼主有思考的想法也说来听听~
jnwz159
[第5楼]   [ 回复时间:2008-04-30 22:16 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2008-03-27 16:25
回复:[第3楼]
------------------
应该是65535+65534+65533…………+0吧,原因二楼说的很明白了
chiwang
[第6楼]   [ 回复时间:2008-05-06 10:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-05 09:40
回复:[第5楼] 

ax是16位寄存器65535+65534 时就要溢出,再往后如何加?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved