我想了解这个简单C程序的汇编。了解简单C程序的汇编
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
void foobar(char *a){
char c = a[0];
}
int main(){
int fd = open("file.txt", O_RDONLY);
char buf1[100]="\0";
char buf[100];
int aa=0,b=1,c=2,d=3,f=2,g=3;
read(fd,buf1,104);
if(strlen(buf1) > 100){
}else{
strcpy(buf,buf1);
}
//strcpy(buf,buf1);
foobar(buf1);
}
使用gdb反汇编我得到的是可执行文件反汇编。
0x000000000040067d <+0>: push rbp
0x000000000040067e <+1>: mov rbp,rsp
0x0000000000400681 <+4>: mov QWORD PTR [rbp-0x18],rdi
0x0000000000400685 <+8>: mov rax,QWORD PTR [rbp-0x18]
0x0000000000400689 <+12>: movzx eax,BYTE PTR [rax]
0x000000000040068c <+15>: mov BYTE PTR [rbp-0x1],al
0x000000000040068f <+18>: pop rbp
主要拆卸之前foobar的
0x0000000000400784 <+243>: lea rax,[rbp-0xf0]
0x000000000040078b <+250>: mov rdi,rax
0x000000000040078e <+253>: call 0x40067d <foobar>
0x0000000000400793 <+258>: mov rbx,QWORD PTR [rbp-0x18]
0x0000000000400797 <+262>: xor rbx,QWORD PTR fs:0x28
0x00000000004007a0 <+271>: je 0x4007a7 <main+278>
0x0000000000400690 <+19>: ret
现在,我有一个关于Foobar的拆卸问题
0x0000000000400681 <+4>: mov QWORD PTR [rbp-0x18],rdi
0x0000000000400685 <+8>: mov rax,QWORD PTR [rbp-0x18]
岂不指令
mov rax, rdi
会不要他的工作需要上述两条指令。为什么使用额外的内存位置rbp - 0x18
rdi? 它与通过引用相关吗?
编辑: 我想问另外一个问题是,为什么foobar的功能正在访问的东西(rbp - 0x18)
这是不是在Foobar的框架?
我的gcc版本是gcc(Ubuntu的4.8.2-19ubuntu1)4.8.2
编辑: 使用-O1 -O2和-O3优化标志,而编译之后,foobar的装配变化
0x0000000000400670 <+0>: repz ret
,并在使用-O3标志的一些主要的拆卸是
0x0000000000400551 <+81>: rep stos QWORD PTR es:[rdi],rax
0x0000000000400554 <+84>: mov DWORD PTR [rdi],0x0
0x000000000040055a <+90>: mov cl,0x64
0x000000000040055c <+92>: mov edi,r8d
0x000000000040055f <+95>: call 0x4004b0 <[email protected]>
0x0000000000400564 <+100>: mov rdx,QWORD PTR [rsp+0x68]
0x0000000000400569 <+105>: xor rdx,QWORD PTR fs:0x28
0x0000000000400572 <+114>: jne 0x400579 <main+121>
0x0000000000400574 <+116>: add rsp,0x78
0x0000000000400578 <+120>: ret
0x0000000000400579 <+121>: call 0x4004c0 <[email protected]>
我无法找到主要以foobar的任何电话。
你的编译器标志是什么? –
我正在编译使用以下命令。 gcc a.c -o a -g – user2823667
使用一些优化设置,否则代码不会被优化:)例如'-O3'。 – Jester