简化装配说明

时间:2014-05-14 05:52:53

标签: c assembly att

我正在尝试使用leal将以下代码转换为单行。

movl 4(%esp), %eax
sall $2, %eax
addl 8(%esp), %eax
addl $4, %eax

我的问题分为3部分:

  1. 寄存器前面的'%'是否只是将以下字符串定义为寄存器?
  2. 整数前面的'$'是否将以下值类型定义为int?
  3. 上述程序集的leal 4(%rsi, 4, %rdi), %eax是否正确转换? (忽略从32位到64位的变化)
  4. 编辑:另一个问题。会

    unsigned int fun3(unsigned int x, unsigned int y)
    {
        unsigned int *z = &x;
        unsigned int w = 4+y;        
        return (4*(*z)+w);             
    }
    

    生成上面的代码?我对指针不太熟悉。

1 个答案:

答案 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