17

你如何使用跳转指令系列?

这就是他们所拥有的:


如果小于或不大于或等于, JL 标签 “It”会跳转。

我的问题是句话是什么?假设我有一个变量ebx,我想跳转到标签there:if ebxis <= 10

具体来说,我对使用x86跳转系列指令感兴趣

4

4 回答 4

17

跳转本身检查 EFL 寄存器中的标志。这些通常使用 TEST 或 CMP 设置(或作为许多其他指令的副作用)。

CMP ebx,10
JLE there
  • CMP对应于计算操作数的差异,更新标志并丢弃结果。通常用于更大/更小的检查
  • TEST 对应于计算操作数的二进制与,更新标志并丢弃结果。通常用于相等性检查。

参见:CMP 上的汇编语言艺术

作为旁注:您应该获得英特尔参考手册。特别是两部分“英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷:指令集参考”,其中描述了所有 x86 指令。

于 2010-12-29T19:50:31.963 回答
12

JLE指令进行两个测试:

  • 有符号标志( SF) !=溢出标志( OF)
  • 标志 ( ZF) == 1

如果零标志为 1 且有符号标志和溢出标志不相等,则将执行短相对跳转

也许只是一个词CMP指令是如何工作的。CMP指令类似于SUB(减法),但执行后目标寄存器不会更新。因此,以下代码将执行与CMP ebx, 10相同的结果。CMP 和 SUB 指令影响标志:进位、奇偶校验、辅助、零、符号和溢出标志。

push   ebx            //store ebx value to stack
sub    ebx, 10
pop    ebx            //restore ebx value from stack
于 2010-12-29T20:54:19.953 回答
4

x86 程序集使用表示比较结果的位标志系统。条件跳转指令在决定是否执行跳转时使用这些标志。

在您的情况下,您将使用以下两个说明:

cmp ebx, 10     ; compare EBX and 10
jle label       ; jump if EBX is "less than or equal" to 10
…
label:
…
于 2010-12-29T19:52:31.433 回答
2

JB - 使用无符号数(跳到下方)<

JL - 使用带符号的数字

mov bx,0     // BX := 0
cmp bx,FF    // 0 < -1 or 0 < 255 (Jump Flag and Sign Flag will change)
jl  butter   // if you use JL jump will not occurs, cus 0 > -1
jb  butter   // if you use JB jump will occurs, cus 0 < 255
于 2010-12-30T01:39:27.773 回答