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

请注意:
原作者:张澍
原创作品转载请注明出处
《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中 “ . ”开头的代码
这里写图片描述

分析:
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))

示意图:
这里写图片描述

总结:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值