gcc -E helloworld.c -o helloworld.i
gcc -S helloworld.c -o helloworld.s
gcc -C helloworld.c -o helloworld.o
gcc helloworld.c -o helloworld
显示二进制中数据 helloworld.dump
objdump -d helloworld > helloworld.dump
网友答案: 1.call指令要执行的代码在哪里?也就是被调用函数的第一条指令所在的内存地址 2.被调用函数执行完成后,返回那个位置继续执行?
针对第一个问题,在gcc编译完成后,函数对应的指令序列所在的位置就已经确定了(我暂时理解为代码已经加载到内存中),应为这个是编译阶段需要考虑的事情。
至于第二个问题,在执行完call指令的同时,需要将call指令下面一条指令的地址保存到栈内存中。同事更新%rsp寄存器指向的位置,然后就可以开始执行被调用函数指令序列,执行完毕后,由ret执行从rsp中获取到栈顶地址returnaddres,然后跳转到call的下一条指令继续执行。