读书笔记:《深入理解计算机系统》 之 第三章 程序的机器级表示

深入理解计算机系统学习笔记(一) 程序的编译过程为了说明程序的编译过程,我们用经典的hello world程序作为例子#include <stdio.h>int main(int argc, char const *argv[]) { printf("hello world!!!\n"); return 0; } 在linux系统中,我们用GCC编译器将源程序文件helloworld.c编译成可执行目标文件hello 阅读详情

第一次作业:了解机器代码中的数据格式以及常用的指令

第二次作业:了解程序中的控制和过程

第三次作业:了解数组,其他数据结构,以及如何在机器级程序中将控制与数据结合起来

 

第一次作业:了解机器代码中的数据格式以及常用的指令

我们常谈程序=数据结构 + 算法 。而汇编语言在我看来就是由数据和操作组成。

首先我们要了解下数据格式,Intel用“字”来表示16位数据类型,所以以此类推,32位数为“双字”,64位数为“四字”。

 

然后,我们了解下数据存储在哪,1个x86-64的CPU包含一组16个存储64位的寄存器,用来存储整数数据和指针。

一般用%rbp 指向当前运行时栈的开始位置,用%rsp 用来指明运行时栈的结束位置。

 

 

 

然后就是操作,在汇编语言中叫做指令,下面谈几个汇编中常用的指令。

首先,操作数,是指出执行一个操作中要使用的源数据值,以及放置结果的目的位置。

 操作数分为三类

一是立即数,用来表示常数值。

二是寄存器,表示某个寄存器的内容。

三是内存引用,它会根据计算出来的地址来访问某个内存位置。而这样的寻址方式在IA-32中又分为两类

一种是针对操作数:有立即寻址,寄存器寻址,存储器操作数寻址三种方式。

另一种是针对寄存器:相对寻址。

 

再然后,就是最常用的数据传送指令。

MOV类是最简单的数据传送指令,把数据从源位置复制到目的位置,不做任何变化。

MOV类主要有四条指令组成,movb,movw,movl和movq,这些指令执行相同的操作,主要区别在于它们的操作数大小不同,也就是后缀b,w,l,q代表的字节数不同。

在传送的时候有一个限制,传送指令的两个操作数都不能指向内存位置,将一个值从一个内存位置复制到另一个位置需要两条指令,第一条指令将源值加载到寄存器中,第二条将寄存器值写入目标的位置。

其他还有一些加载有效地址,移位操作,算术操作等指令。

 

 

第二次作业:了解程序中的控制和过程

在机器程序中,除了以上提到的可以一条一条指令按顺序执行的情况,还有一些控制类型的跳转指令,比如C语言中条件语句,循环语句,分支语句等类型。

机器代码有两种机制来实现有条件的行为。

一种是控制流,即根据条件进行跳转。

一种是数据流,即把所有可能的条件都计算出来,再进行选择。

在控制流中,处理器会猜测分支是否会执行,虽然有90%,但是有时候会猜错,例如最简单的if-else语句,就有50%的几率猜错,所以性能没有数据流好。

而数据流也存在问题,如果一个分支存在错误,则程序就会崩溃。所以数据流的使用有限制。

最后,再谈跳转指令,跳转指令有几种不同的编码,最常用的都是PC相对的,可以根据当前程序的位置来判断跳转位置。

而机器代码中的过程,它是一种抽象,提供了封装代码的方式,然后在程序中不同的地方还可以调用这个函数。一般可以抽象为三个机制:传递控制,传递数据,分配和释放内存。

 

第三次作业:了解数组,其他数据结构,以及如何在机器级程序中将控制与数据结合起来

C语言中的数组,以及结构和联合的内存地址的计算方式,其实就是a+bx+cy这种类型的计算。

在机器级的程序中是如何将控制和数据结合起来的?

首先,我们回顾下指针,指针以一种统一方式,对不同数据结构的元素产生应用。其实它的基本概念也可以映射到机器代码上的一些原则。例如每个指针都对应一个类型,每个指针都有一个值等。

然后,C语言中对数组不进行边界检查,所以很容易出现数组越界,会出现缓冲器溢出,而这种漏洞很容易被针对进行攻击,对于这些攻击,也有栈随机化,栈破坏检测,限制可执行代码区域等机制进行应对,但是并不能百分百防护。

最后,关于如何实现函数要求的空间大小在每次执行时都可能不同的情况,其实就是使用了%rbp作为基指针,然后进行偏移量计算,并最后返回存储地址。

 

 

 

零基础玩转IndexTTS2:5分钟搭建个人语音克隆工具(支持B站同款情感语音) 本文详细介绍了如何零基础使用IndexTTS2快速搭建个人语音克隆工具,支持B站同款情感语音。IndexTTS2作为自回归零样本TTS系统,突破传统技术限制,实现精准时长控制和丰富情感表达。通过HuggingFace在线演示,用户可轻松克隆音色并调节情感参数,适用于自媒体配音、有声书朗读等场景。 阅读详情

相关推荐

【PCL】SolidWorks 三维建模 STL, OBJ 采样生成 PCD 点云数据(附源码)

[PCL自学篇] 一.SolidWorks三维建模STL,OBJ采样生成PCD点云数据新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 这阵子做线结构光视觉检测(轨道)项目的过程中,发现之前的许多知识点在逐渐遗忘,常言好记性

idiot5lie的博客 1万+

《深入理解计算机系统》第三章笔记

本文为《深入理解计算机系统》第三章的笔记,主要介绍x86平台下的机器代码以及人类可读的表示——汇编语言。通过阅读汇编代码,我们能理解编译器的优化能力,并分析代码中隐含的低效率。

Jayu的博客 1479

深入理解「二进制掩码」:从原理到实践

二进制掩码本质上是一个二进制数,用于通过位操作(如与、或、非、异或等)选择性地操作目标数据的某些位。掩码的每一位(bit)可以看作一个“开关”,决定是否对目标数据的对应位进行操作。二进制掩码是位操作的灵魂,掌握它不仅能提升代码效率,还能解锁许多高级编程技巧。从基础的位提取到复杂的子集枚举,掩码的应用无处不在。希望本文的讲解和代码示例能帮助你快速上手,并在实际项目中灵活运用。如果你有更多关于掩码的疑问或应用场景,欢迎在评论区留言交流!

m0_73494933的博客 2432

B-深入理解计算机系统第3版之第3章:程序的机器级表示

C 代码不会被 CPU 直接“看懂”。编译器会把它翻译成一串极小的机器指令:它们只会读写寄存器和内存、做简单运算、改变下一条指令的位置;而条件语句、循环、函数、数组、结构体和安全问题,都是由这些小动作拼出来的。

常驻客栈的博客--嵌入式EtherCAT 200

无源定位之时差估计的精确时差估计算法(ETDE)及MATLAB实现程序

时差估计算法之精确时差估计(ETDE)欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想

伊谢尔伦的林中小路 4254

图像传感器与信号处理——SFR算法/ISO 12233解读

图像传感器与信号处理——SFR算法图像传感器与信号处理——SFR算法1. 前言2. 基于视觉的分辨率测量方法3. 基于边界的SFR算法4. 基于正弦波的SFR算法 图像传感器与信号处理——SFR算法 SFR的全称是Spatial Frequency Response,空间频率响应。介绍SFR算法的参考文献主要是ISO 12233这篇英文文档。和读一般的论文感觉不同,文档读起来更加晦涩难懂,可能是因...

weixin_44580210的博客 1万+

深入理解计算机系统学习笔记

深入理解计算机系统学习笔记 第三章 程序的机器级表示 在本章中,我们将学习一种特别的汇编语言,了解如何将C程序编译成这种形式的机器代码。 3.1 程序代码 假设一个C程序,有两个文件p1.c p2.c linux > gcc -Og -c p p1.c p2.c 命令行gcc指的就是GCC C编译器,实际上上面的命令调用了一整套程序,将源代码转化为可执行代码, 首先,C预处理器拓展源代码,插...

qq_43342544的博客 242

Chapter 5 Gate Drivers and Level Shifters

Gate driver如下图所示, 包括功率管(带保护), Gate driver, Level shifter, Gate Supply 和Dead-time control.

2304_76736886的博客 2233

深入理解计算机系统(CSAPP) 第三章学习笔记

1.程序编码 unix> gcc -o1 -s p1.c //生成汇编文件p1.c,但不做其他进一步的工作 unix> gcc -o1 -c p1.c //生成目标代码文件 p1.o unix> gcc -o1 -o p p1.c p2.c //生成可执行代码文件p,其中不仅包含两个过程的代码...

努力学习的姜饼 1550

学习笔记:TF卡启动荔枝派Nano(全志F1C200S)

荔枝派Nano编译Kernel报错报错内容如下编译烧录 报错内容如下 No controllers found No ethernet found. 从这些报错我真没看从出啥问题,也是在网上找,说是没有找到flash,是因为淘宝买的板子更换了flash,需要在u-boot里面重新适配型号: 板子的型号为xt25f128,但是实际u-boot的配置里面不是需要重新更改: u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts &spi0 { pin

热爱科技,物联,程序开发等 2133

File Load Error for Untitled.ipynb Unhandled error 解决方案

本文主要介绍了File Load Error for Untitled.ipynb Unhandled error 解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

《深入理解计算机系统》(CSAPP)读书笔记 —— 第三章 程序的机器级表示

本章主要介绍了计算机中的机器代码——汇编语言。当我们使用高级语言(C、Java等)编程时,代码会屏蔽机器级的细节,我们无法了解到机器级的代码实现。学习程序的机器级实现,可以让我们了解程序是如何运行的,哪些部分是可以优化的;当程序受到攻击(漏洞)时,都会涉及到程序运行时控制信息的细节(蠕虫病毒就是利用了gets函数的漏洞)。特别是作为一名嵌入式软件开发的从业人员,会经常接触到底层的代码实现。虽然不要求我们使用汇编语言写复杂的程序,但是要求我们要能够阅读和理解编译器产生的汇编代码。

嵌入式与Linux那些事的博客 8327

Python爬虫实战:如何抓取旅游论坛上的帖子、旅行攻略和评论内容

无论是知名的旅游网站,还是地方性的旅游讨论区,用户发布的旅行贴文、攻略和评论往往包含着大量的宝贵信息。本文将详细介绍如何使用Python编写一个爬虫,抓取旅游论坛上的帖子、旅行攻略和评论内容,涵盖从获取页面内容、解析数据到处理动态加载等各个方面的技术。从基本的请求和网页解析,到动态加载页面的处理,再到数据存储和反爬虫技巧,我们详细讲解了抓取旅游论坛数据的全过程。通过本文的介绍,你可以将所学的爬虫技术应用到其他类似的网站抓取任务中,为后续的数据分析、机器学习等任务提供丰富的数据源。在这种情况下,传统的。

2201_76125261的博客 1557

《深入理解计算机系统》读书笔记

《深入理解计算机系统》读书笔记注:《深入理解计算机系统》是我们《系统级编程》课程的参考书。这里主要记载的是在看《深入理解计算机系统》这本书的过程中,遇到的一些以前没有注意到的知识。但是,这本书的稿子是2001年的,有点旧了,而且据说卡内基梅隆大学的讲义每年要更新30%。我会在其中增加一些我们系统级编程课程中的一些新的知识点。第0章 绪论1,不能用x-y第1章 计算机系统漫游1,

天的世界 8635

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《深入理解计算机系统》读书笔记(三)程序的机器级表示

继续阅读《深入理解计算机系统》这本经典书籍,本节是第三章:程序的机器级表示

闵行小鱼塘 553

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《深入理解计算机系统》读书笔记——第三章、程序的机器级表示

一、历史观点 Intel系列处理器的每个后继处理器的设计都是向后兼容的——较早版本上编译的代码可以在较新的处理器上运行。 许多公司(比如AMD)生产出了与Intel处理器兼容的处理器,能够运行完全相同的机器级程序。 二、程序编码 gcc编译器的-Og参数选项告诉编译器使用会生成符合原始C代码整体结构的机器代码的优化等级。使用较高级别优化产生的代码会严重变形,以...

不睡觉的怪叔叔的博客 3257

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

使用arm混合汇编计算两个64位的和_《深入理解计算机系统》读书笔记 —— 第三章 程序的机器级表示...

本章主要介绍了计算机中的机器代码——汇编语言。当我们使用高级语言(C、Java等)编程时,代码会屏蔽机器级的细节,我们无法了解到机器级的代码实现。既然有了高级语言,我们为什么还需要学习汇编语言呢?学习程序的机器级实现,可以帮助我们理解编译器的优化能力,可以让我们了解程序是如何运行的,哪些部分是可以优化的;当程序受到攻击(漏洞)时,都会涉及到程序运行时控制信息的细节,很多程序都会利用系统程序中的漏洞...

weixin_32531655的博客 795

深入理解计算机系统读书笔记

深入理解计算机系统

qq_43430845的博客 1925

读书笔记——《深入理解计算机系统》第三章_程序的机器级表示(一)

    前言:已经大四,没有去找工作,选择了保研,之所以这样选择,有三个原因,一、刚进校时,听说保研都是牛人才能行的事,所以一心努力保研;二、2008年开始,经济危机比较严重,工作不好找,虽然软件专业要找一份工作还是比较容易,但好工作的机会少了很多,再多学习几年,规避下风险;三、三年多的本科学习下来,虽然简历看起来还像回事,但内心很虚,感觉真才实学没多少,都是略懂皮毛,做了太多表面工作,没有特长,

litingli的专栏 4562

读书笔记Pt.3——《深入理解计算机系统》

😎😎读书笔记又更新辣! 阿龙干货铺靓仔快来康康, 造他就完事儿了!

qq_61500888的博客 1750

《深入理解计算机系统:程序的机器级表示》读书笔记(一)`

《深入理解计算机系统:第三章》读书笔记(一) 正如第一章所讲到的那样,了解编译系统是如何工作会给程序员带来如下的益处:优化程序的性能、理解链接时出现的错误、避免安全漏洞 。那么,如果要了解编译系统,我们就必定得先知道程序在机器上是如何表示的,表示的形式有哪些,以及在每种形式之间是如何转化的。 表示形式 机器语言 计算机执行机器代码,用字节序列编码低级的操作,包括处理数据、管理存储器、读写存...

mac终端命令小入门 311

【《深入理解计算机系统》读书笔记(3)】 第3章 程序的机器级表示

《深入理解计算机系统》读书笔记(3) 第3章 程序的机器级表示 本章主要主要介绍了跟汇编有关的相关知识(以x86-64为例子)

小C的博客 1033

无责任书评:《深入理解计算机系统》这本神书到底好在哪儿?

刘大,我想学Java ,你觉得《Java编程思想》适合入门吗?刘哥,《深入理解计算机系统》第三版豆瓣评分都快接近10分了, 我想买一本,你觉得怎么样?刘师傅,学习数据结构...

码农翻身 8988

《深入理解计算机系统》读书笔记04: 程序的机器级表示

作者: andylin02学习章节: 第 3 章 程序的机器级表示关键词: x86-64;汇编语言;寄存器;栈帧;过程调用;条件码;循环;跳转表;缓冲区溢出;Bomb Lab;Attack Lab;GDB。

1206

程序的机器级表示

2017年4月趁着临近毕业时间比较充裕,就买了一本深入理解计算机系统(第三版),这本书的第二版之前浅浅的读过一遍只对里面的编译与链接章节印象深刻,其他章节对我来说完全陌生,我深知这本书的好,于是重新拾起这本书。为了加深自己的记忆就开始写博客记录自己的读书笔记。 第三章 程序的机器级表示 gcc4.8 引入-Og选项,使得生成的代码更符合原始程序的结构。 传送类指令的两个操作数不能指向内存位置。 任何

zyfforlinux 1813

《深入理解计算机系统》第三章-程序的机器级表示

本章将介绍汇编语言和机器语言。

JacquelinEvE的博客 227
上一篇: 从开锁到中年危机的杂谈
下一篇: 读书笔记:《深入理解计算机系统》 之 第六章 存储器层次结构
scanq
博客等级 码龄11年 15粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值