我有一个 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
这在功能上与您期望的相同。
关于c - 来自 C 程序的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687577/