汇编JLE jmp指令示例

bob*_*obo 14 x86 assembly mnemonics

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

这就是他们所拥有的:

JL标签
"It"如果小于或不大于或等于,则跳跃.

我的问题是什么是在这句话?说我有一个变量ebx,我想跳到标签there:,如果ebx<= 10.

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

Cod*_*aos 15

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

CMP ebx,10
JLE there
Run Code Online (Sandbox Code Playgroud)
  • CMP对应于计算操作数的差异,更新标志和丢弃结果.通常用于更大/更小的检查
  • TEST对应于计算操作数的二进制AND,更新标志并丢弃结果.通常用于等式检查.

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

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

  • 在此示例中,当10小于或等于ebx时,JLE会跳转吗?还是在ebx小于或等于10时会跳转? (2认同)
  • @AndersonGreen:英特尔选择了助记符,因此“cmp x,y”/“jcc”与“x &lt;= y”对齐。https://www.felixcloutier.com/x86/jcc。最容易提醒自己的是“jb”与“jc”是相同的指令,如果CF=1则跳转。(这是 AT&amp;T 语法中最糟糕的部分之一:“cmp”的反向操作数意味着 jcc 助记符的语义含义与源中的操作数顺序相反。) (2认同)

GJ.*_*GJ. 10

JLE 指令实际上一次测试两个标志:

  • 零旗(ZF)
  • 携带旗帜(CF)

如果Carry和Zero标志为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
Run Code Online (Sandbox Code Playgroud)