【发布时间】:2018-10-24 10:07:48
【问题描述】:
int suma(int* array, int len)
{
asm(" xor %eax, %eax # resultado = 0 \n"
" xor %edx, %edx # i = 0 \n"
"1: add (%rdi,%rdx,4), %eax # res += array[i] \n"
" inc %edx # ++i \n"
" cmp %edx,%esi # i < len? \n"
" jne 1b # repetir \n"
// " ret \n"
);
}
int main()
{
int v[100];
return suma(v, 100);
}
为什么gcc在-O0上的suma()末尾插入了ret,而-O3上却要我自己加?
来自gcc -v:
gcc version 8.2.1 20181011 (Red Hat 8.2.1-4) (GCC)
【问题讨论】:
-
也许它被内联到
main已经有一个 ret 指令。没有看到完整的结果很难猜测。 -
我不确定,但请注意,从技术上讲,您的整个内联程序集并没有真正明确定义,因为您假设某些寄存器保存某些值,这不是一个有效的假设。跨度>
-
我假设是 64 位...,数组在 rdi,len 在 esi。
-
看this。它是内联的,但仍然生成了
suma函数的代码,并且ret没有被删除。您是如何注意到没有带有 -O3 的ret的? -
用 objdump 反汇编
标签: c gcc assembly compiler-optimization inline-assembly