前几天上信息安全课,简单的把课上内容复习下.主要讲单个函数编译后生成汇编代码地址 与 函数在main函数中调用后生成汇编地址的区别
int accum = 0;
int sum(int x, int y)
{
int t = x + y;
accum += t;
return t;
}
code.c文件代码如上所示,
输入命令gcc -o1 -c code.c
生成code.o文件,再输入命令objdump -d code.o进行查看(我的生成默认的1 objdump -d 1)
00000000 <sum>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub $0x10,%esp
6: 8b 45 0c mov 0xc(%ebp),%eax
9: 8b 55 08 mov 0x8(%ebp),%edx
c: 01 d0 add %edx,%eax
e: 89 45 fc mov %eax,-0x4(%ebp)
11: a1 00 00 00 00 mov 0x0,%eax
16: 03 45 fc add -0x4(%ebp),%eax
19: a3 00 00 00 00 mov %eax,0x0
1e: 8b 45 fc mov -0x4(%ebp),%eax
21: c9 leave
22: c3 ret
main.c
int main()
{
return sum(1, 3);
}
输入命令gcc -o1 -o obj code.o main.c
生成汇编代码如下
080483b4 <sum>:
80483b4: 55 push %ebp
80483b5: 89 e5 mov %esp,%ebp
80483b7: 83 ec 10 sub $0x10,%esp
80483ba: 8b 45 0c mov 0xc(%ebp),%eax
80483bd: 8b 55 08 mov 0x8(%ebp),%edx
80483c0: 01 d0 add %edx,%eax
80483c2: 89 45 fc mov %eax,-0x4(%ebp)
80483c5: a1 18 a0 04 08 mov 0x804a018,%eax
80483ca: 03 45 fc add -0x4(%ebp),%eax
80483cd: a3 18 a0 04 08 mov %eax,0x804a018
80483d2: 8b 45 fc mov -0x4(%ebp),%eax
80483d5: c9 leave
80483d6: c3 ret
80483d7: 90 nop
080483d8 <main>:
80483d8: 55 push %ebp
80483d9: 89 e5 mov %esp,%ebp
80483db: 83 e4 f0 and $0xfffffff0,%esp
80483de: 83 ec 10 sub $0x10,%esp
80483e1: c7 44 24 04 03 00 00 movl $0x3,0x4(%esp)
80483e8: 00
80483e9: c7 04 24 01 00 00 00 movl $0x1,(%esp)
80483f0: e8 bf ff ff ff call 80483b4 <sum>
80483f5: c9 leave
80483f6: c3 ret
由此可见汇编代码地址的变化,特别在地址0x80483f0 时地用地址为0x80483b4是sum函数的第一条指令的地址,,暂时分析到这,待续....
对于x86处理器上的Linux,正文段从ox08048000单元开始,栈底则在oxc0000000之下开始,堆底和栈顶之间未用的虚拟空间很大(保护模式下,不能直接访问物理内存,全部是虚拟内存),在这个例子中ox80483f0可见是sum函数的汇编指令在正文段中的地址