9.7 ~ 9.9

2020-04-16
2020-04-16
2 min read
Hits

  《汇编语言(第3版)》9.7 ~ 9.9、《零基础入门学习汇编语言》P45 ~ 46

9.7 jcxz 指令

  jcxz 指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为 -128~127。

  指令格式:jcxz 标号(如果 (cx)=0,则转移到标号处执行)

  jcxz 标号指令操作

  1. 当 (cx)=0 时,(IP)=(IP)+8 位位移
    1. 8 位位移 =“标号”处的地址 -jcxz 指令后的第一个字节的地址;
    2. 8 位位移的范围为 -128~127,用补码表示;
    3. 8 位位移由编译程序在编译时算出。
  2. 当 (cx)≠0 时,什么也不做(程序向下执行)。

  指令“jcxz 标号”的功能相当于

if((cx)==0)
	jmp short 标号;

9.8 loop 指令

  loop 指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对 IP 的修改范围都为 -128~127。

  指令格式:loop 标号((cx)=(cx)-1,如果 (cx)≠0,转移到标号处执行)

  loop 标号指令操作

  1. (cx)=(cx)-1;
  2. 如果 (cx)≠0,(IP)=(IP)+8 位位移。
    1. 8 位位移 =“标号”处的地址 -loop 指令后的第一个字节的地址;
    2. 8 位位移的范围为 -128~127,用补码表示;
    3. 8 位位移由编译程序在编译时算出。
  3. 当 (cx)=0 时,什么也不做(程序向下执行)。

  指令“loop 标号”的功能相当于

(cx)--;
if((cx)≠0)
	jmp short 标号;

9.9 根据位移进行转移的意义

  1. jmp short 标号
  2. jmp near ptr 标号
  3. jcxz 标号
  4. loop 标号

  它们对 IP 的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。

  这样设计,方便了程序段在内存中的浮动装配。

  例如

汇编指令机器代码
mov cx,6B9 06 00
mov ax,10B8 10 00
s:add ax,ax01 C0
loop sE2 FC

  这段程序装在内存中的不同位置都可正确执行,因为 loop s 在执行时只涉及到 s 的位移(-4,前移 4 个字节,补码表示为 FCH),而不是 s 的地址。

形如“jmp 2000:0100”的转移指令,是在 Debug 中使用的汇编指令,汇编编译器并不认识。如果在源程序中使用,编译时也会报错。

Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.
Previous 10.1 ~ 10.7