c - 来自 C 程序的汇编代码

标签 c assembly

我有一个 C 程序,它有一个函数 decod,该函数有以下语句。

我的decode.c脚本:

int decod(int x, int y, int z) {
   int ty = y;
   ty = ty - z;
   int py = ty;
   py = py << 31;
   py = py >> 31;
   ty = ty * x;
   py = py ^ ty;
   }

该程序的汇编代码(由gcc -S decod.c生成)显示如下代码。

    movl    %edi, -20(%rbp)
movl    %esi, -24(%rbp)
movl    %edx, -28(%rbp)
movl    -24(%rbp), %eax
movl    %eax, -8(%rbp)
movl    -28(%rbp), %eax
subl    %eax, -8(%rbp)
movl    -8(%rbp), %eax
movl    %eax, -4(%rbp)
sall    $31, -4(%rbp)
sarl    $31, -4(%rbp)
movl    -8(%rbp), %eax
imull   -20(%rbp), %eax
movl    %eax, -8(%rbp)
movl    -8(%rbp), %eax
xorl    %eax, -4(%rbp)
popq    %rbp
.cfi_def_cfa 7, 8
ret

但是,我希望程序生成一个仅包含以下代码行的程序集文件。

subl    %edx, %esi
movl    %esi, %eax
sall    $31, %eax
sarl    $31, %eax
imull   %edi, %esi
xorl    %esi, %eax
ret

我知道我非常接近编写一个程序来生成上述代码。但是,我不知道为什么脚本会生成不同的汇编代码。任何方向都会有所帮助。

最佳答案

如果按原样编译函数,在优化级别 3 中,-O3 整个函数都被优化掉了。这是因为没有返回值,pyty 在函数之后无论如何都会被丢弃。

引用代码如下

    .globl  decod
    .def    decod;  .scl    2;  .type   32; .endef
    .seh_proc   decod
decod:
    .seh_endprologue
    ret
    .seh_endproc

但是,如果在末尾添加return py;,生成的代码如下。

    .globl  decod
    .def    decod;  .scl    2;  .type   32; .endef
    .seh_proc   decod
decod:
    .seh_endprologue
    subl    %r8d, %edx
    movl    %edx, %eax
    imull   %edx, %ecx
    sall    $31, %eax
    sarl    $31, %eax
    xorl    %ecx, %eax
    ret
    .seh_endproc

这在功能上与您期望的相同。

关于c - 来自 C 程序的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687577/

相关文章:

c - C中带符号数的数组索引

c - Xcode 给出了简单 C 数组的错误总和

c - 程序集 x86 - 调用 C 函数

c - 打印消息内联汇编

c - 如何在C中找到600851475143的最大质因数?

c - 如何解决C语言中的 "Segmentation fault"错误

c++ - gdb:选定框架上的信息局部信息

c++ - 程序集文件 (.s) 抛出错误 : unknown use of instruction mnemonic without a size suffix

xcode - 我怎样才能让 Xcode 调试器进入函数的程序集?