Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 简化汇编指令_C_Assembly_Att - Fatal编程技术网

C 简化汇编指令

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

我正在尝试使用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, 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。接下来的问题是:在这两种类型的汇编代码之间,是否有一种被认为更有效?