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)
158从esp中减去而不是将值推入堆栈并调用strcmp方法的汇编代码?是因为它不依赖于任何用户输入吗?extended assembly(我不确定这是不是正确的术语,我只是希望看到用于将值推入堆栈和调用strcmp函数的汇编代码).有什么办法可以吗?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)