我在解释这个练习时遇到了一些困难;
xorl在此汇编代码段中的作用是什么?
C代码:
int i = 0;
if (i>=55)
i++;
else
i--;
装配
xorl ____ , %ebx
cmpl ____ , %ebx
Jel .L2
____ %ebx
.L2:
____ %ebx
.L3:
装配部分发生了什么?
答案 0 :(得分:14)
可能是:
xorl %ebx, %ebx
这是将x86上的寄存器归零的常用习惯用法。这与C代码中的i = 0
相对应。
如果你很好奇,那么为什么?"简短的回答是xor
指令的字节数少于mov $0, %ebx
。 The 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: