C程序的汇编代码

时间:2017-03-09 05:38:51

标签: c assembly

我有一个具有函数解码的C程序,该函数具有以下语句。

我的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

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

1 个答案:

答案 0 :(得分:3)

如果您按原样编译函数,则在优化级别3中,a <- c('>= 0.99', '0.66', '<= 0.01') 整个函数已经过优化。这是因为没有返回值,并且library(intervals) b <- Intervals(cbind(left = c(0.99, 0.66, -Inf), right = c(Inf, 0.66, 0.01))) b # Object of class Intervals # 3 intervals over R: # [0.99, Inf] # [0.66, 0.66] # [-Inf, 0.01] -O3在函数之后仍然被丢弃。

供参考,代码如下

py

但是,如果您在结尾处添加ty,则生成的代码如下所示。

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

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