9.7 ~ 9.9
《汇编语言(第3版)》9.7 ~ 9.9、《零基础入门学习汇编语言》P45 ~ 46
9.7 jcxz 指令
jcxz 指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为 -128~127。
指令格式:jcxz 标号(如果 (cx)=0,则转移到标号处执行)
jcxz 标号指令操作
- 当 (cx)=0 时,(IP)=(IP)+8 位位移
- 8 位位移 =“标号”处的地址 -jcxz 指令后的第一个字节的地址;
- 8 位位移的范围为 -128~127,用补码表示;
- 8 位位移由编译程序在编译时算出。
- 当 (cx)≠0 时,什么也不做(程序向下执行)。
指令“jcxz 标号”的功能相当于
if((cx)==0)
jmp short 标号;
9.8 loop 指令
loop 指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对 IP 的修改范围都为 -128~127。
指令格式:loop 标号((cx)=(cx)-1,如果 (cx)≠0,转移到标号处执行)
loop 标号指令操作
- (cx)=(cx)-1;
- 如果 (cx)≠0,(IP)=(IP)+8 位位移。
- 8 位位移 =“标号”处的地址 -loop 指令后的第一个字节的地址;
- 8 位位移的范围为 -128~127,用补码表示;
- 8 位位移由编译程序在编译时算出。
- 当 (cx)=0 时,什么也不做(程序向下执行)。
指令“loop 标号”的功能相当于
(cx)--;
if((cx)≠0)
jmp short 标号;
9.9 根据位移进行转移的意义
- jmp short 标号
- jmp near ptr 标号
- jcxz 标号
- loop 标号
它们对 IP 的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。
这样设计,方便了程序段在内存中的浮动装配。
例如
汇编指令 | 机器代码 |
---|---|
mov cx,6 | B9 06 00 |
mov ax,10 | B8 10 00 |
s:add ax,ax | 01 C0 |
loop s | E2 FC |
这段程序装在内存中的不同位置都可正确执行,因为 loop s 在执行时只涉及到 s 的位移(-4,前移 4 个字节,补码表示为 FCH),而不是 s 的地址。
形如“jmp 2000:0100”的转移指令,是在 Debug 中使用的汇编指令,汇编编译器并不认识。如果在源程序中使用,编译时也会报错。