云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 汇编语言 - 入门经典教材-230页 汇编入门(7 讲)

汇编语言 - 入门经典教材-230页 汇编入门(7 讲)

  • 62 次阅读
  • 3 次下载
  • 2026/4/25 7:32:03

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来临时存放计算结果

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

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+ 这也是一组有条件循环指令,它们与相等或为零循 环指令在循环结束条件

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com