簡體   English   中英

C程序的匯編代碼

[英]Assembly Code from C program

我有一個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

這在功能上與您期望的完全相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM