C 简化汇编指令
我正在尝试使用leal将以下代码转换为一行C 简化汇编指令,c,assembly,att,C,Assembly,Att,我正在尝试使用leal将以下代码转换为一行 movl 4(%esp), %eax sall $2, %eax addl 8(%esp), %eax addl $4, %eax 我的问题分为三个部分: 寄存器前面的“%”是否只是将以下字符串定义为寄存器 整数前面的“$”是否将以下值类型定义为int leal4(%rsi,4,%rdi),%eax是否从上述组件正确转换?(忽略从32位到64位的更改) 编辑:另一个问题。会 unsigned int fun3(unsigned int x, unsi
movl 4(%esp), %eax
sall $2, %eax
addl 8(%esp), %eax
addl $4, %eax
我的问题分为三个部分:
leal4(%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);
}
生成上面的代码?我不熟悉指针。1:如果%yes
2:没有int、float、bool、char或。。。在asm中。你在和机器打交道。这意味着它是一个常数
3:1将(esp-4)中的值移动到eax。esp是堆栈指针,eax是c函数用于返回值的寄存器
2向左换档两次。等于乘以4
3在eax中增加价值(esp-8)
4向eax中的值添加4
x*4+y+4=eax是(esp-4),y是(esp-8)
leal与,4+rsi+4*rdi=eax相同
是的,在某种程度上也是一样的
这取决于编译器,但是的,这是有效的翻译。4*x+y+4您的帖子中没有任何符号。不知道你的意思是什么。我想他写“符号”时是“%”的意思。关于AT&T汇编语法。检查底部的“源”链接。lea加载地址,而不是从内存加载。示例汇编代码从内存加载了两次,因此您需要两条指令才能将数据放入寄存器。一旦数据在寄存器中,您可以将其中一个寄存器缩放4,以获得左移位的等效值(忽略符号位问题),并使用lea的偏移量4。接下来的问题是:在这两种类型的汇编代码之间,是否有一种被认为更有效?