CSAPP笔记——第三章程序的机器级表示

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang

🔥专栏:CSAPP笔记||书籍网课笔记 

🔥温馨提示:划到文末发现专栏彩蛋

🔥本篇概览:程序的机器级表示全过程解析


目录

code file

源代码文件与汇编语言之间的转化

Intelx86-64的处理器包含了16个寄存器

Caller-saved/Callee-saved Register

register

Instructions

Pointer Arithmetic

Nested Array 

Structures

Data Alignment

Union

BUffer Overflow

Stack Randomization

Stack Corruption Detection


code file

gcc指的是gcc编译器,将源代码翻译成汇编语言。-Og 指的是编译选项,这里是指生成与原始代码整体结构相同的机器语言代码,实际总还会使用 -Og1,-Og2来优化程序 ,只是优化后的代码会与源代码严重变形,-o prog便是生成的可执行文件的文件名 

下面来看看

源代码文件与汇编语言之间的转化

     

其中:

这里的以"."开头的行,都是指导汇编器与链接器工作的伪指令。也就是说我们可以完全忽略这些行

删除无关代码后,剩下的汇编代码就是与源文件C代码相关的了,如下——、、

Intelx86-64的处理器包含了16个寄存器

 

Caller-saved/Callee-saved Register

调用者保存寄存器与被调用者保存寄存器

(保存上下文,恢复原有上下文信息)

其中的addq后面的q表示数据大小,英特尔处理器里面有如下机器位长:

详细解释

下面逐步解释

如图,将函数的参数分别放在如下寄存器里

x->%rdi    y->%rsi    dest->%rdx

call mult表示调用函数mult2

将乘法的结果放在寄存器%rax里面,

movq  %rax  ,(%rbx)

之后,该寄存器里面的值放入内存中,该内存的地址为寄存器%rbx里面的值

最后函数返回

register

这里的寄存器用途

Instructions

指令分为操作码、操作数,操作数又有几种类型,分别如下:

指令在内存中就是以0101的序列存储的。该序列也就分为操作码与操作数。

指令执行的源地址、目的地址

以实际例子说明汇编语句与计算机系统的结构对应情况

首先这里的函数参数,地址xp保存在%rdi寄存器里,参数y保存在%rsi寄存器里面。

 首先CPU将读取地址存在于%rdi寄存器里面的内存处的值放入寄存器%rax里面。

之后再将存在于寄存器%rsi里面的参数y放入内存(%rdi)中,也就是说,该内存处的值被赋予了y。

所以变量都只是内存或者寄存器的代称,我们实际是在操作机器,而C语言中的指针就是内存所对应的地址。

下面是程序运行时的内存分布

有效地址和虚拟地址的关系是什么?

有效地址可以说是虚拟地址的一种具体表现形式。而有效地址到物理地址的转化就是虚拟地址到物理地址的转化。

Pointer Arithmetic

注意这里的伸缩长度与原来的数据类型有关。

从下图可看出,指针就是地址的抽象表示

Nested Array 

Structures

声明与访问

都是起始地址加上偏移地址来获取有效地址

Data Alignment

地址对齐优化(起始地址为4的整数倍,编译器会在前面加上空字节长度)

地址对齐的原则是任何K字节的基本对象地址必须是K的整数倍

比如说,short类型的数据对象起始地址必须是2的整数倍

复杂的地址对齐示例

Union

结构体和联合体的内存分布区别

注意联合体的数据类型的特点是所有字段在同一存储空间。一次只能访问一个字段,即联合体里面的字段是互斥的,以最大的字段占用的存储空间为准

BUffer Overflow

程序运行时栈

Stack Randomization

栈随机化是指程序的栈的地址每次运行都会随机地变化。

如图上面的程序的本地变量每次运行时地址打印处理都会变化

在linux中。栈随机化已经成为了标准行为。

他是地址空间随机化行为的一种,简称ASLR。

采用ASLR,每次运行时程序的不同部分都会被加载到内存的不同区域

Stack Corruption Detection

栈破坏检测

暂时跳过

📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤ 分享👥 留言💬thanks!!!
📚愿大家都能学有所得,功不唐捐!



💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏推荐

🌈🌈计算机科学入门系列                     关注走一波💕💕

🌈🌈CSAPP深入理解计算机原理        关注走一波💕💕

🌈🌈微服务项目之黑马头条                 关注走一波💕💕

🌈🌈redis深度项目之黑马点评            关注走一波💕💕

🌈🌈Java面试八股文系列专栏            关注走一波💕💕

🌈🌈算法leetcode+剑指offer              关注走一波💕💕


总栏

🌈🌈​​​​​​JAVA后端技术栈                          关注走一波💕💕  

🌈🌈JAVA面试八股文​​​​​​                          关注走一波💕💕  

🌈🌈JAVA项目(含源码深度剖析)    关注走一波💕💕  

🌈🌈计算机四件套                               关注走一波💕💕  

🌈🌈算法                                        ​​​​​​     ​关注走一波💕💕  

🌈🌈必知必会工具集                           关注走一波💕💕

🌈🌈书籍网课笔记汇总                       关注走一波💕💕  

🌈🌈考试复习资料                              关注走一波💕💕  

🌈🌈C/C++技术栈                              关注走一波💕💕  

🌈🌈GO技术栈                                   关注走一波💕💕  


分栏

🌈🌈JAVA后端技术栈

🌈🌈spring                                      关注走一波💕💕         ​

🌈🌈redis                                        关注走一波💕💕

🌈🌈MySQL                               ​​​     关注走一波💕💕 

🌈🌈mybatis        ​​​​​​​        ​​​​​​​        ​​​​     ​​​​      关注走一波💕💕

🌈🌈mybatisplus                           关注走一波💕💕

🌈🌈MQ          ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        关注走一波💕💕

🌈🌈微服务                                     关注走一波💕💕

🌈🌈设计模式                                 关注走一波💕💕

🌈🌈分布式锁                                 关注走一波💕💕


🌈🌈JAVA八股文​​​​​​​​​​​​​​​​​​​​​JAVA面试八股文(redis、MySQL、框架、微服务、MQ、JVM、设计模式、并发编程、JAVA集合、常见技术场景)                                                          关注走一波💕💕    

                                                             


🌈🌈JAVA项目(含源码深度剖析)

🌈🌈黑马头条(微服务)             关注走一波💕💕

🌈🌈黑马点评(redis)               关注走一波💕💕


🌈🌈计算机四件套

🌈🌈计算机基础                           关注走一波💕💕

🌈🌈计算机基础                           关注走一波💕💕

🌈🌈计算机网络                           关注走一波💕💕

🌈🌈数据结构与算法                    关注走一波💕💕


🌈🌈算法

🌈🌈leetcode                              关注走一波💕💕

🌈🌈剑指offer                             关注走一波💕💕


🌈🌈必知必会工具集                   关注走一波💕💕


🌈🌈书籍网课笔记汇总

🌈🌈CSAPP笔记                        关注走一波💕💕

🌈🌈计算机科学速成课               关注走一波💕💕

🌈🌈CS自学指南                        关注走一波💕💕

🌈🌈读书笔记与每日记录           关注走一波💕💕


🌈🌈考试复习资料​​​​​​​                      关注走一波💕💕


🌈🌈C/C++技术栈                      关注走一波💕💕                           


🌈🌈GO技术栈                          关注走一波💕💕                                                    


📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值