[英]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
將整個函數優化掉。 這是因為沒有返回值,並且py
和ty
在函數之后無論如何都被丟棄了。
供參考,代碼如下
.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.