请注意:
原作者:张澍
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
01-计算机原理
寄存器
32、16、64位对比
基础汇编指令
movl指令:
1.寄存器模式:以%开头
2.立即数:以$开头
3.直接寻址:直接访问内存地址数据
4.间接寻址:将寄存器值作为内存地址来访问
5.变址寻址:直接寻址改变寄存器数值
压、弹栈;调用;返回:
反汇编
相关寄存器说明:
EIP:自动指向下一指令
EBP/ESP : 栈顶、栈底
EAS:暂存一些数值
反汇编一个C程序
步骤:
1.编写main.c文件
int g(int x)
{
return x + 7;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(3) + 2;
}
2.使用 gcc –S –o main.s main.c -m32 生成main.s文件
3.删除main.s中 “ . ”开头的代码
分析: 18
pushl %ebp : 将当前ebp压栈同时esp向下移动4字节 19
movl %esp, %ebp : 将ebp指向esp 20
subl $4,%esp : esp向下移动一个标号(4字节) 21
movl $3,(%esp) : 将立即数3放入esp位置 22
call f : 1.push eip;(位置23
) 2. movl f eip;(eip指向 f 8
) 9
pushl %ebp : 同18
10
movl %esp, %ebp : 同19
11
subl $4,%esp : 同20
12
movl 8(%ebp), %eax : ebp变址寻址向上移动两个标号(8字节),将此值(3)放入eax 13
movl %eax,%esp : 将eax值放入esp 14
call g : 1.push eip;(位置15
) 2. movl f eip;(eip指向 g 1
) 2
pushl %ebp : 同18
(位置4
) 3
movl %esp, %ebp : 同19
(位置7
) 4
movl 8(%ebp), %eax : ebp变址寻址向上移动两个标号(8字节),将此值(8)放入eax 5
add $s, %eax : 两值相加(3 + 7 = 10) 6
popl %ebp : 将ebp移动到 位置4
,esp加一标号(位置6
) 7
ret : popl %eip (esp加一标号(位置5
) eip返回到位置15
) 15
leave : 1.movl %ebp,%esp;(将esp移动到 位置4
) 2.popl %ebp;(将ebp移动到 位置1
,esp加一标号(位置3
)) 16
ret : popl %eip (esp加一标号(位置2
) eip返回到位置23
) 23
add $s, %eax : 两值相加(10 + 2 = 12) 24
leave : 1.movl %ebp,%esp;(将esp移动到 位置1
) 2.popl %ebp;(将ebp移动到 位置0
,esp加一标号(位置0
))
示意图:
总结:
计算机计算的原理就是CPU把对应指令以增减操作栈的方式后得出最终结果。