4.2 跳转命令

jmp / jz 命令。jmp 命令为无条件跳转命令,直接跳转到标签处,用法如下:

  1. jmp Label
  2. ...
  3. ...
  4. Label:
  5. print "jump here"

jz 命令为条件跳转命令,先取出栈顶元素,判断其是否为 0 ,若为 0 ,则跳转至标签处,若不为 0 ,则转到下一条命令,用法如下:

  1. push 0
  2. jz Label
  3. print "top is not zero"
  4. Label:
  5. print "top is zero"

Pcode 虚拟机会将所有以 “ xxx: ” 开始的行记录在其标签表中,在 jmp / jz 命令运行时,虚拟机会根据命令后的标签名在标签表中查找对应的地址,如果查不到标签名,虚拟机会出错终止。

jmp 命令运行后 eip 的变化如下,运行后栈保持不变。images/jjmp_01.pngimages/jjmp_02.png图4.4 jmp命令

jz 命令运行后 eip 和栈的变化如下,注意无论是否发生跳转,栈顶的元素都将出栈。images/jjz_01.pngimages/jjz_02.png图4.5 jz 命令执行过程(栈顶为 0 时)images/jjz_03.pngimages/jjz_04.png图4.6 jz 命令(栈顶不为 0 时)