xorl%eax - IA-32中的指令集架构

时间:2014-05-10 00:08:17

标签: c assembly x86 att instruction-set

我在解释这个练习时遇到了一些困难;

xorl在此汇编代码段中的作用是什么?

C代码:

int i = 0;
if (i>=55)
    i++;
else
    i--;

装配

xorl ____ , %ebx
cmpl ____ , %ebx
Jel  .L2
____ %ebx
.L2:
____ %ebx
.L3:

装配部分发生了什么?

3 个答案:

答案 0 :(得分:14)

可能是:

xorl %ebx, %ebx

这是将x86上的寄存器归零的常用习惯用法。这与C代码中的i = 0相对应。


如果你很好奇,那么为什么?"简短的回答是xor指令的字节数少于mov $0, %ebxThe long answer includes other subtle reasons

我遗漏了剩下的练习,因为没有任何特殊的东西。

答案 1 :(得分:2)

这是与C代码等效的已完成和注释的程序集:

xorl %ebx , %ebx    ; i = 0
cmpl $54, %ebx
jle  .L2            ; if (i <= 54) jump to .L2, otherwise continue with the next instruction (so if i>54... which equals >=55 like in your C code)
addl $2, %ebx         ; >54 (or: >=55)
.L2:
decl %ebx            ; <=54 (or <55, the else-branch of your if) Note: This code also gets executed if i >= 55, hence why we need +2 above so we only get +1 total
.L3:

因此,这些是为所有数字执行的(算术)指令&gt; = 55:

addl $2, %ebx
decl %ebx

因此,对于数字&gt; = 55,这等于递增。对于数字&lt; 55:

执行以下(算术)指令
decl %ebx

我们跳过addl $2, %ebx指令,因此对于数字<55,这等于递减。

如果您不允许在单个空白处键入addl $2,(因为它不仅仅是指令而且还有参数),那么您给出的asm代码中可能存在错误(缺少跳转第4行和第5行之间的.L3)。


另请注意,jel显然是问题中jle的拼写错误。

答案 2 :(得分:-1)

XORL用于将寄存器初始化为零,主要用于计数器。来自ccKep的代码是正确的,只是他增加了一个错误的值,即。 2而不是1.正确的版本是:

xorl %ebx , %ebx     # i = 0
cmpl $54, %ebx      # compare the two
jle  .L2           #if (i <= 54) jump to .L2, otherwise continue with   the next instruction (so if i>54... which equals >=55 like in your C code)

incl %ebx         #i++
jmp .DONE        # jump to exit position

.L2:
decl %ebx      # <=54 (or <55

.DONE: