用汇编语言编写C程序

用汇编语言编写C程序,c,gcc,assembly,C,Gcc,Assembly,我正在尝试学习汇编语言,我不确定我是否走上了正确的道路。我有一个汇编语言的程序,我需要转换成C addq %rsi, %rdi addq %rdi, %rdx movq %rdx, %rax ret 我试着自己解决这个问题,我想出了一些类似于 long p1(long x, long y, long z) { x = x + y; z = z + x; long a = z; return a; } 无论我从哪个角度看,我都觉得自己很接近,但当我举杯时,我什么也得不

我正在尝试学习汇编语言,我不确定我是否走上了正确的道路。我有一个汇编语言的程序,我需要转换成C

addq    %rsi, %rdi
addq    %rdi, %rdx
movq    %rdx, %rax
ret
我试着自己解决这个问题,我想出了一些类似于

long p1(long x, long y, long z)
{
 x = x + y;
 z = z + x;
 long a = z;
 return a;
}

无论我从哪个角度看,我都觉得自己很接近,但当我举杯时,我什么也得不到。正在寻找一些指导。。谢谢

您的C代码看起来不错,据我所知,它与您的汇编代码的功能相同

您不必期望编译C代码会得到与示例完全相同的程序集。有许多不同的方法可以将C转换成汇编

例如,如果我使用
gcc-O0
(无优化)编译您的C代码,我将获得更长的汇编,它将所有函数参数和变量存储到堆栈中。这是不必要的(而且速度较慢),但对于调试器来说更容易。如果我使用
gcc-O2
编译,我会得到

    leaq    (%rdi,%rsi), %rax
    addq    %rdx, %rax
    ret

在这里,编译器巧妙地利用了在一条指令中进行加法和移位。

您的C代码看起来不错,据我所知,它与汇编代码的功能相同

您不必期望编译C代码会得到与示例完全相同的程序集。有许多不同的方法可以将C转换成汇编

例如,如果我使用
gcc-O0
(无优化)编译您的C代码,我将获得更长的汇编,它将所有函数参数和变量存储到堆栈中。这是不必要的(而且速度较慢),但对于调试器来说更容易。如果我使用
gcc-O2
编译,我会得到

    leaq    (%rdi,%rsi), %rax
    addq    %rdx, %rax
    ret


在这里,编译器巧妙地利用了在一条指令中进行加法和移位。

换一种方式
gcc-S ur_c.c
将生成要查看的程序集输出。请编辑代码<代码>{应该是
}
。您的代码中是否存在编译错误?这是我一直在尝试的,但程序集输出与问题不匹配。我不认为我走得太远,但也许我走得太远了?不能保证汇编语句的任意序列必须有一个
C
对应项,当编译时,它将生成完全相同的序列。事实上,任何合理的假设都证明这是错误的。相反,你到底想做什么或想弄明白什么?任务是获取汇编代码并编写一个功能相同的C程序。也许我想说得太具体了?换一种方式吧
gcc-S ur_c.c
将生成要查看的程序集输出。请编辑代码<代码>{应该是
}
。您的代码中是否存在编译错误?这是我一直在尝试的,但程序集输出与问题不匹配。我不认为我走得太远,但也许我走得太远了?不能保证汇编语句的任意序列必须有一个
C
对应项,当编译时,它将生成完全相同的序列。事实上,任何合理的假设都证明这是错误的。相反,你到底想做什么或想弄明白什么?任务是获取汇编代码并编写一个功能相同的C程序。也许我想说得太具体了?啊,这就是我困惑的地方。我想象如果我给它正确的C代码,我可以让它反汇编成相同的代码,也就是说,简化它并使它长为a=x+y+z也是一样的;对吗?@Ben:yes,甚至是一行
返回x+y+z非常感谢您的帮助。我希望是这样的,但我很难找到关于assembly/c是否特别符合要求的信息。啊,这就是我困惑的地方。我想象如果我给它正确的C代码,我可以让它反汇编成相同的代码,也就是说,简化它并使它长为a=x+y+z也是一样的;对吗?@Ben:yes,甚至是一行
返回x+y+z非常感谢您的帮助。我希望是这样的,但我很难找到有关assembly/c是否专门列出了这一点的信息。