当前位置:首页 > 汇编语言 - 入门经典教材-230页 汇编入门(7 讲)
ECX的影响外,还要受标志位 ZF的影响。其具体规定 如下:
(1)、(CX)=(CX)-1 或(ECX) =(ECX)-1 ; (不改变 任何标志位)
(2)、如果循环计数器≠0 且ZF=1,则程序转到循环 体的第一条指令,否则,程序将执行该循环指令下面的 指令。
3 、不等或不为零循环指令(Loop While Not Equal or Loop While Not Zero) 不等或不为零循环指令的一般格式: LOOPNE/LOOPNZ 标号
LOOPNEW/LOOPNZW 标号 ;CX 作为循环 计数器,80386+
LOOPNED/LOOPNZD 标号 ;ECX 作为循 环计数器,80386+
这也是一组有条件循环指令,它们与相等或为零循 环指令在循环结束条件上有点不同。其具体规定如下: (1)、(CX)=(CX)-1 或(ECX) =(ECX)-1 ; (不改变任 何标志位)
(2)、如果循环计数器≠0 且ZF=0,则程序转到循环体
的第一条指令,否则,程序将执行该循环指令下面的指令。
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
ADD AX, CX ; 计算过程: K+(K-1)+?+2+1 again:
LOO P again
next: …
思考题:假设变量 K 的值为0 ,并且在循环体的前面没有写指令“JCXZ next”,这时求出 的“和”AX 的值是什么?
5.2.9 转移指令
转移指令是汇编语言程序员经常使用的一组指令。在高级语言中,时常有“尽量不要使 用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无 法编写,要么没有多少功能,所以,在汇编语言中,不但要使用转移指令,而且还要灵活 运用,因为指令系统中有大量的转移指令。
转移指令分无条件转移指令和有条件转移指令两大类。 1 、无条件转移指令(Transfer Unconditionally)
无条件转移指令包括:JMP 、子程序的调用和返回指令、中断的调用和返回指令等。 下面只介绍无条件转移指令JMP(Unconditional Jump) 。 JMP 指令的一般形式: JMP 标号/Reg/Mem
JMP 指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一
个短(short)转移(偏移量在[-128, 127] 范围内),近(near) 转移(偏移量在[-32K, 32K] 范围内)或远
(far)转移(在不同的代码段之间转移)。
短和近转移是段内转移,JMP 指令只把目标指令位置的偏移量赋值指令指针寄存器IP , 从而实现转移功能。但远转移是段间转移,JMP 指令不仅会改变指令指针寄存器IP 的值, 而且还会改变代码段寄存器CS的值。 该转移指令的执行不影响任何标志位。 例如: … ?
JMP next1 ; 向前转移,偏移量之差为负数 ?
JMP next2 ; 向后转移,偏移量之差为正数 next1: ?
next2: …
在目前流行的汇编系统中,当段内转移时,有些软件把该转移指令默认为近转移,从而 使指令的偏移量用一个字来表示,于是生成3 个字节的指令代码,但如果程序员自己清楚转
移的幅度在一个短转移的范围之内,那么,可用前置short的办法来告诉汇编程序,让它产 生2 个字节的指令代码。 比如:如果程序员知道在上例中的标号 next2离“JMP next2”指令的偏移量不会超过127 , 那么,可用下面的转移方式来省掉一个字节的指令代码。 ?
JMP short next2 ; 生成2 个字节的转移指令,从而节省一个字节 ?
next2: ?
2 、条件转移指令(Transfer Conditionally)
条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位 来决定是否需要转移,这就为实现多功能程序提供了必要的手段。微机的指令系统提供了丰 富的条件转移指令来满足各种不同的转移需要,在编程序时,要对它们灵活运用。 条件转移指令又分三大类:基于无符号数的条件转移指令、基于有符号数的条件转移指 令和基于特殊算术标志位的条件转移指令。
、无符号数的条件转移指令(Jumps Based on Unsigned (Logic) Data) 指令的助忆符检测的转移条件功能描述 JE/JZ ZF=1 Jump Equal or Jump Zero
JNE/JNZ ZF=0 Jump Not Equal or Jump Not Zero
JA/JNBE CF=0 and ZF=0 Jump Above or Jump Not Below or Equal JAE/JNB CF=0 Jump Above or Equal or Jump Not Below JB/JNAE CF=1 Jump Below or Jump Not Above or Equal
JBE/JNA CF=1 or AF=1 Jump Below or Equal or Jump Not Above
、有符号数的条件转移指令(Jumps Based on Signed (Arithmetic) Data) 指令的助忆符检测的转移条件功能描述 JE/JZ ZF=1 Jump Equal or Jump Zero
JNE/JNZ ZF=0 Jump Not Equal or Jump Not Zero
JG/JNLE ZF=0 and SF=OF Jump Greater or Jump Not Less or Equal JGE/JNL SF=OF Jump Greater or Equal or Jump Not Less
JL/JNGE SF≠OF Jump Less or Jump Not Greater or Equal
JLE/JNG ZF=1 or SF ≠OF Jump Less or Equal or Jump Not Greater
、特殊算术标志位的条件转移指令(Jumps Based on Special Arithmetic Tests) 指令的助忆符检测的转移条件功能描述 JC CF=1 Jump Carry
JNC CF=0 Jump Not Carry JO OF=1 Jump Overflow
JNO OF=0 Jump Not Overflow
JP/JPE PF=1 Jump Parity or Jump Parity Even
JNP/JPO PF=0 Jump Not Pari ty or Jump Parity Odd JS SF=1 Jump Sign (negative) JNS SF=0 Jump No Sign (positive)
例5.15 编写一程序段,它把寄存器 AX-BX的绝对值存入BX中。 解:
? next: S U B
BX, AX
JN S next N E G BX ?
例5.16 已知一个字节变量 char ,试编写一程序段,把其所存的大写字母变成小写字母。 解: ? cha r
DB 'F' ;变量说明 ? MO V
AL, char CM P AL, 'A'
JB next ; 注意:字符是无符号数,不要使用指令JL CM P AL, 'Z' JA next AD D
char, 20H ; 小写字母比大写字母的ASCII 码大20H next:
?
如果不知道( 或忘了)大小写字母ASCII 码之间的关系,那么,可用数值表达式'a'-'A' 、 'b'-'B' 、?、'z'-'Z'等来代替具体的数值20H 。
例5.17 编写一段程序,完成下面计算公式,其中:变量 X 和Y 都是字类型。 解: ?
X DW ? ;变量说明 Y DW ? ? MO V AX, X
MO BX, AX ;用BX来临时存放计算结果
共分享92篇相关文档