我刚刚用 C 编写了一个代码示例并尝试对其进行反汇编。以下是代码示例。
void start() {
char phone[100];
strcmp(phone, "12312312313");
char name[100];
strcmp(name, "eQuiNoX");
char contact[100];
strcmp(contact, "PM twitter.com/eQuiNoX__");
}
当我反汇编 start 函数时,我得到以下信息:-
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
- 我没有启用任何类型的优化。有人可以解释为什么我从 esp 中减去
158
而不是将值压入堆栈并调用strcmp
方法的汇编代码吗?是因为它不依赖于任何用户输入吗? - 此外,有什么方法可以生成
扩展程序集
(我不确定这是不是正确的术语,我只是希望看到用于将值压入堆栈并调用strcmp 函数)。我有什么办法可以做到这一点吗? - 这种行为是否特定于处理器架构或 gcc 版本或两者?
最佳答案
首先,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
关于c - gcc 堆栈优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4694280/