gcc堆栈优化?

2 c x86 assembly gcc disassembly

我刚刚在C中编写了一个代码示例,并尝试将其拆解.以下是代码示例.

void start() {
    char phone[100];
    strcmp(phone, "12312312313");

    char name[100];
    strcmp(name, "eQuiNoX");

    char contact[100];
    strcmp(contact, "PM twitter.com/eQuiNoX__");
}
Run Code Online (Sandbox Code Playgroud)

当我反汇编启动功能时,我得到以下内容: -

08048414 <start>:
 8048414: 55                    push   ebp
 8048415: 89 e5                 mov    ebp,esp
 8048417: 81 ec 58 01 00 00     sub    esp,0x158
 804841d: c9                    leave  
 804841e: c3                    ret   
Run Code Online (Sandbox Code Playgroud)
  1. 我没有启用任何类型的优化.有人可以解释为什么我158从esp中减去而不是将值推入堆栈并调用strcmp方法的汇编代码?是因为它不依赖于任何用户输入吗?
  2. 另外,有没有什么方法可以生成extended assembly(我不确定这是不是正确的术语,我只是希望看到用于将值推入堆栈和调用strcmp函数的汇编代码).有什么办法可以吗?
  3. 这种行为是特定于处理器体系结构还是gcc版本或两者兼有?

der*_*ert 10

首先,它strcmp是一个标准的库函数,因此gcc可以自由地了解它的工作原理.事实上,它确实; 它很少会产生库调用.您可以尝试-fno-builtin禁用.

其次,您要与单位化值进行比较.这是,我相信未定义的行为.因此编译器可以做任何事情,包括生成随机代码.

您可以尝试-S选择gcc获取更详细的反汇编(或者更确切地说,缺少汇编); 或者,如果使用-g(调试)编译,objdump -S将显示源以及汇编代码.

这是我编译的一个例子gcc -fno-builtin -g -O0 test.c -c,然后转储objdump -S test.o:

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
#include <string.h>

int main() {
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 83 ec 10             sub    $0x10,%rsp
    const char foo[] = "foo";
   8:   8b 05 00 00 00 00       mov    0x0(%rip),%eax        # e <main+0xe>
   e:   89 45 f0                mov    %eax,-0x10(%rbp)
    return strcmp(foo, "bar");
  11:   48 8d 45 f0             lea    -0x10(%rbp),%rax
  15:   be 00 00 00 00          mov    $0x0,%esi
  1a:   48 89 c7                mov    %rax,%rdi
  1d:   e8 00 00 00 00          callq  22 <main+0x22>
}
  22:   c9                      leaveq 
  23:   c3                      retq   
Run Code Online (Sandbox Code Playgroud)

  • 将`-r`选项添加到`objdump`以进行重定位.否则`call`指令会显得非常误导. (3认同)
  • @Micheal,没有花太多周期,我认为`__pure__`告诉编译器该函数没有效果,但是它的返回值.因为代码不使用它,所以调用就会被丢弃. (2认同)