2017-03-09 124 views
1

我有一個C程序,它具有函數解碼功能並具有以下語句。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 

我知道我很接近寫一個程序,它將生成上面提到的代碼。但是,我無能爲力,爲什麼腳本生成不同的彙編代碼。任何方向都會有幫助。

+0

該函數不會返回任何東西。 – Arash

+0

如果您希望它產生* that *代碼,爲什麼要用C代替assembly? –

+0

以獲得明智的asm代碼,打開優化。另一方面,要有合理的優化代碼,提供不會完全優化的代碼(因爲它不返回任何內容,所以完全沒用) – Tommylee2k

回答

3

如果按原樣編譯函數,則在優化級別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 

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