计算机编译程序的原理


1. 编译, 汇编, 链接

Pasted image 20231103112007

2. 寄存器

Pasted image 20231103113001
x86-64系统中:
Pasted image 20231103113114
Pasted image 20231103113131
Pasted image 20231103113136
Pasted image 20231103113141

3. 内存的表示方式

Pasted image 20231103114034
Pasted image 20231103114100
Pasted image 20231103114126
Pasted image 20231103114131

4. 程序的运行原理

01: 程序运行时内存的状态:

Pasted image 20231114161854
更详细一点的图:
Pasted image 20231114162002

程序运行时,代码片段被储存在虚拟内存的 read only data

02: 代码的执行原理

How the instructions are executed?

  • %rip stores an address of memory,
  • from the address, machine can read a whole instruction once
  • then execute it
  • increase %rip

%rip is also called program counter (PC)

PC逐行执行指令的图例:
Pasted image 20231114170846

小知识点:机器是怎么知道call指令的地址在哪里呢?
注意到二进制代码中的42,代表的是下一条指令的地址加上42,就是跳转的地址
在这个例子中,就是400549+42=40058b,这个就是右边汇编语句对应的地址
之所以会这样,是因为机器执行完400548这条指令后,%rip移动到400549,这时候call指令发挥作用,将%rip+42,移动到需要执行的代码片段

03: 栈区

Pasted image 20231114172148
栈区存的内容:

  • 函数的返回地址
  • 调用函数时所传的(部分)参数
  • 局部变量
    关于函数调用与栈的详细关系,见我的另一篇博客 函数调用的实现

更多文章:
数据在内存中的对齐问题
汇编语句详解(持续更新)
关于位运算必须记住的事
C语言中的类型转换

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值