1.计算机原理实验及实现

时间:2023-01-09 10:27:18

请注意:
原作者:张澍
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

01-计算机原理

寄存器

32、16、64位对比

1.计算机原理实验及实现1.计算机原理实验及实现

基础汇编指令

movl指令:
1.计算机原理实验及实现
1.计算机原理实验及实现

1.寄存器模式:以%开头
2.立即数:以$开头
3.直接寻址:直接访问内存地址数据
4.间接寻址:将寄存器值作为内存地址来访问
5.变址寻址:直接寻址改变寄存器数值

压、弹栈;调用;返回:
1.计算机原理实验及实现
1.计算机原理实验及实现

反汇编

相关寄存器说明:

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;
}

1.计算机原理实验及实现
2.使用 gcc –S –o main.s main.c -m32 生成main.s文件
3.删除main.s中 “ . ”开头的代码
1.计算机原理实验及实现

分析:
18pushl %ebp : 将当前ebp压栈同时esp向下移动4字节
19movl %esp, %ebp : 将ebp指向esp
20subl $4,%esp : esp向下移动一个标号(4字节)
21movl $3,(%esp) : 将立即数3放入esp位置
22call f : 1.push eip;(位置23) 2. movl f eip;(eip指向 f 8)
9pushl %ebp : 同18
10movl %esp, %ebp : 同19
11subl $4,%esp : 同20
12movl 8(%ebp), %eax : ebp变址寻址向上移动两个标号(8字节),将此值(3)放入eax
13movl %eax,%esp : 将eax值放入esp
14call g : 1.push eip;(位置15) 2. movl f eip;(eip指向 g 1)
2pushl %ebp : 同18(位置4)
3movl %esp, %ebp : 同19(位置7)
4movl 8(%ebp), %eax : ebp变址寻址向上移动两个标号(8字节),将此值(8)放入eax
5add $s, %eax : 两值相加(3 + 7 = 10)
6popl %ebp : 将ebp移动到 位置4,esp加一标号(位置6)
7ret : popl %eip (esp加一标号(位置5) eip返回到位置15)
15leave : 1.movl %ebp,%esp;(将esp移动到 位置4) 2.popl %ebp;(将ebp移动到 位置1,esp加一标号(位置3))
16ret : popl %eip (esp加一标号(位置2) eip返回到位置23)
23add $s, %eax : 两值相加(10 + 2 = 12)
24leave : 1.movl %ebp,%esp;(将esp移动到 位置1) 2.popl %ebp;(将ebp移动到 位置0,esp加一标号(位置0))

示意图:
1.计算机原理实验及实现

总结:

计算机计算的原理就是CPU把对应指令以增减操作栈的方式后得出最终结果。