我正在尝试使用leal将以下代码转换为单行。
movl 4(%esp), %eax
sall $2, %eax
addl 8(%esp), %eax
addl $4, %eax
我的问题分为3部分:
leal 4(%rsi, 4, %rdi), %eax
是否正确转换? (忽略从32位到64位的变化)编辑:另一个问题。会
unsigned int fun3(unsigned int x, unsigned int y)
{
unsigned int *z = &x;
unsigned int w = 4+y;
return (4*(*z)+w);
}
生成上面的代码?我对指针不太熟悉。
答案 0 :(得分:1)
1:if%yes
2:在asm中没有int或float或bool或char或....你正在处理这台机器。这意味着它是一个常数
3:1将(esp-4)中的值移动到eax。 esp是堆栈指针,eax是c函数用来返回值的寄存器。
2向左移两次。相同乘以4
3将(esp-8)中的值添加到eax中的值
4在eax中添加4值
x * 4 + y + 4 = eax x是(esp -4),y是(esp-8)
leal与4 + rsi + 4 * rdi = eax
相同所以在某种程度上也是如此。
这取决于编译器,但是这是有效的翻译。 4 * X + Y + 4