当前位置: 首页 > news >正文

【汇编】二、预备知识(一只 Assember 的成长史)

嗨~你好呀!

我是一名初二学生,热爱计算机,码龄两年。最近开始学习汇编,希望通过 Blog 的形式记录下自己的学习过程,也和更多人分享。

这篇文章主要讲述学习汇编所需的基础知识。

话不多说~我们开始吧!


目录

二 1. 汇编语言是什么

二 2. 汇编语言的产生及组成

二 3. 存储器、内存(地址空间)及 CPU 对内存的读写

1. 存储器

2. 内存(地址空间)

3. CPU 对内存的读写

二 4. 总线

1. 地址总线

2. 控制总线

3. 数据总线


二 1. 汇编语言是什么

先上概括:

汇编是一种低级语言。它直接和计算机硬件打交道,直接描述和控制了 CPU 的运行。

我们都知道,计算机是听不懂 int main(),cout,cin 等一类的高级语言中的语句的,它们最终都或会被 g++(或 gcc)编译成二进制指令,编译器再把这串二进制指令交给 CPU,让它去执行.......

那,我们知道这个过程中计算机到底做了些什么吗?cout << "Hello Assembly!"; 到底是怎么被计算机理解并执行的?(忽然发现这个问题有点像 “从按下 Enter 键到浏览器把网页显示出来之间都发生了什么”...)

这时候就要汇编上场啦~

汇编可以让我们了解 CPU 的到底做了些什么,有助于我们理解高级语言代码的运行步骤。也可以把汇编和计算机组成原理 “配套学习”,全面地了解计算机的底层原理。

在写高级语言代码的时候,如果真的遇到一些难以理解的问题,用汇编看一看是一个非常好的选择呀!

不过汇编能做的事可不仅仅限于这些......

汇编主要用于底层开发,如操作系统驱动程序、内核、嵌入式等。几乎所有大型系统(包括硬件和软件)的底层都是汇编。

我最初决定学汇编,是因为我在学网络安全,汇编是逆向工程的基础,也是 re 和 pwn 的基础(或者说成为黑客的基础哈哈哈哈哈哈)。

(不过学了一天后,我发现汇编本身就很好玩((


二 2. 汇编语言的产生及组成

Weeeeell。其实汇编的产生原因很简单——计算机能理解二进制指令,但是人类很难理解啊!对人类来说,二进制指令难以记忆、难以调试、极端浪费时间。试想,把你现在正在写的代码全部替换成二进制,其中有一个 0 被错误地写成了 1.......请找到这个 bug。

是不是很可怕😂。如果使用二进制指令的话,或许全球所有设备加起来的存储空间也放不下 ChatGPT 的源代码(bushi。

必须使用二进制指令给整个计算机行业的发展带来了很大的障碍,所以,汇编语言诞生啦!

汇编语言的主体是汇编指令,而汇编指令其实就是二进制指令便于记忆和书写的格式,它和二进制指令是一一对应的。

这也是为什么汇编语言无法跨操作系统,因为每种操作的系统的二进制指令集都是不同的,所以对应的汇编语言也不同。最简单的例子就是 x86 和 arm。

but,虽然汇编指令和二进制指令一一对应,但它毕竟不是二进制指令,所以也需要汇编编译器将汇编代码编译为二进制代码,再交给 CPU 执行——不过这个过程较为 “公开透明”。

汇编语言主要由三部分组成:

· 汇编指令——二进制指令对应的文字形式,计算机执行

· 伪指令——assume 等,由编译器执行,计算机不执行

· 特殊符号—— + - * / 等都算,由编译器识别,计算机不执行


前面说过,汇编相当于 “面向硬件编程”,所以在学习编写汇编程序前,我们需要简单了解一下计算机的重要组成部分。不过不会很复杂,因为我也还没学《组成原理》......😂。

二 3. 存储器、内存(地址空间)及 CPU 对内存的读写

存储器,想必我们都不陌生......寄存器、RAM/ROM、硬盘等都属于存储器的范畴。

CPU 要工作,它先要知道工作内容是什么——这就需要向它提供指令和数据(其实就是一串二进制数字)。

那这些指令和数据存储在哪呢?——存储器。

存储器就像 CPU 的脑子一样,没有存储器,CPU 什么也干不了。

学习汇编,首先需要了解什么是存储器 & 内存(地址空间) & CPU 是如何读写内存的。

1. 存储器

顾名思义,存储器就是用于存储信息的。不同存储器的存取速度和存储容量如下图所示(一般情况下,存取速度和存储容量成反比,即速度越快,容量越小)。

微机原理——扩展存储器设计_拾牙慧者的博客-CSDN博客_存储器扩展设计

一台设备中,装有多个存储器芯片,它们在物理连接上彼此独立。按照读写属性可分为两类:随机存储器(RAM)和只读存储器(ROM)。前者可读可写,但断电后内容丢失;后者只可读不可写,但断电后内容不丢失。

RAM/ROM 存储器从功能和连接上可分为以下几类,在此不过多介绍。

· 随机存储器 RAM

· 装有 BOIS 的 ROM

· 接口卡上的 RAM(CPU 通过接口卡间接地对外部设备进行控制)

因为 CPU 无法直接读取外存储器(需要先读取到内存储器中,CPU 再读取内存储器),所以下文仅介绍内存储器。

2. 内存(地址空间)

诶,这就有一个问题了。

内存储器是彼此独立的,那它们所对的地址空间呢?不同存储器对应的地址空间也是彼此独立的吗?(即:RAM 从 0-1000,ROM 从 0-2000,每个都从 0 开始)

好像并不是诶......?

没错,虽然内存储器是彼此独立的,但它们的地址空间并不彼此独立,而是连续的。

这表明,CPU 在操控内存储器的时候,把它们总的看作一个逻辑存储器,这个逻辑存储器就是内存地址空间。

不同的物理存储器在这个逻辑存储器中占有一段地址空间,CPU 在这段地址空间中读写数据,就相当于在对应的物理存储器中读写数据。

下图是一个内存地址空间的模型,它将各类内存储器都看作一个逻辑存储器,地址连续。

比如:

RAM 在内存地址空间中占有的地址段就是 00000-9999F,在这一段中读写数据,相当于在 RAM 中读写数据。

类似一个个储物柜,每个有不同的编号,存放不同的人的东西。内存(地址空间)也被划为一个个内存单元,每个内存单元有不同的编号,存放不同的指令或数据。

内存单元的编号是连续的,最小编号是 0,最大编号是由地址总线宽度决定的,后面会提到~。

一个内存单元可以存储 8 bits(八个二进制位),也就是 1 Byte(一个字节),设备的内存容量都是以 Byte 为最小单位计算的。如 4 GB 内存 = 4 * 2^10 * 2^10 * 2^10 Bytes,即 4 * 2^10 * 2^10 * 2^10 个内存单元。

3. CPU 对内存的读写

设想,你在储物柜存放物品后,肯定会记住这个储物柜的编号,方便来取物品或放入新的物品。CPU 也一样,它想读写存储器,就必须知道它要读写的内存单元的编号(物理地址)。

同理,你知道你要取物品还是放物品。CPU 也需要知道它是要读还是要写。

同理,你知道要从储物柜中取出什么东西或放入什么东西。CPU 也需要知道它要读或写什么信息。

总结一下,CPU 想要读取存储器,需要和存储器芯片进行以下三类信息的交互:

· 内存单元的地址?(地址信息)

· 读 or 写?(控制信息)

· 读或写的数据?(数据信息)

问题来了,CPU 如何将这些信息传到存储器芯片中?

我们知道,在计算机硬件中一切都是电信号,高电平代表 1,低电平代表 0。所以这些信息最终也会被用电信号表示出来,那当然就要用导线传送啦!(emm 还没学到的初三物理知识突然开始攻击我((

在计算机中,有专门连接 CPU 和芯片们的导线,称为总线(也就是一根根导线的集合)。

总线可以按照逻辑(或用途)分为三类(下文会详细介绍):

· 地址总线(传送地址信息)

· 控制总线(传送控制信息)

· 数据总线(传送控制信息)

比如,CPU 从 3 号内存单元中读取数据的过程如下图所示(注:此处的 “3” 并不是一个规范的内存地址)。

1. CPU 通过地址线将内存单元的地址(3)告诉内存。

2. CPU 通过控制线向内存芯片发出读取内存的命令。

3. 内存将 3 号单元中的数据(8)通过数据线送入 CPU。

至此,内存读取就已经完成啦~

内存写入和读取大同小异,只需要把第 2 步改成 “发出写入内存的命令”,第 3 步改成 “CPU 通过数据线将数据(8)送入 3 号内存单元”。

这部分看起来并不深奥,但对于理解汇编语言也是很重要的哦!


二 4. 总线

上部分提到了“总线”。总线其实就是在 CPU 和各个器件之间传递信息的导线的集合,分为以下三类:

· 地址总线

· 控制总线

· 数据总线

它们的物理构造是相同的,但逻辑(功能)不同。

1. 地址总线

CPU 通过地址总线来指定内存单元。

它如何指定内存单元呢?——按照内存单元在内存地址空间中的地址。

可见,地址总线一共能组合出多少种内存单元地址,CPU 就可以对多少个内存单元进行寻址(因为如果内存单元数大于地址总线可以组合出的数量,CPU 就无法通过地址总线找到那些内存单元了)。

一个 CPU 有 N 根地址线,就说这个 CPU 的地址总线的宽度为 N,根据排列组合可得这样的 CPU 最多可以寻找 2^N 个内存单元(一根线可以表示 0 或 1 两种情况,N 根线就可以表示 2^N 种情况)。

2. 控制总线

上文提到,CPU 进行内存读写时,需要通过控制总线发出读或写的命令,这是 CPU 对其它器件(此处为存储器)的一种控制。

CPU 通过控制总线控制其它器件(如存储器、外设接口卡等)。

控制线的数量决定了 CPU 对器件的控制能力,有多少根控制线,就意味着 CPU 提供了对器件的多少种控制。

3. 数据总线

CPU 与内存或其它器件之间的数据传送是通过数据总线进行的

数据总线越宽,CPU 和器件之间的数据传送速度越快。比如我们经常说的 “64 位”、“32 位” 等,都是指数据总线的宽度。N 根数据总线一次能传送 N 个 bit,也就是 N/8 个 Byte

下图展示了 8 位数据总线和 16 位数据总线之间的区别:

8 位:

16 位:

这部分也不难,但后面学到 CPU 读取、执行指令的工作原理时还会提到,也是一个重要的部分。


 以上就是本文的全部内容啦~感谢你看到这里~

作者只是一名初学者,有任何错误或解释不当之处欢迎指出呀~一起加油!

那,我们下一篇再见咯~

2023-02-25

By Geeker · LStar

相关文章:

【汇编】二、预备知识(一只 Assember 的成长史)

嗨~你好呀&#xff01; 我是一名初二学生&#xff0c;热爱计算机&#xff0c;码龄两年。最近开始学习汇编&#xff0c;希望通过 Blog 的形式记录下自己的学习过程&#xff0c;也和更多人分享。 这篇文章主要讲述学习汇编所需的基础知识。 话不多说~我们开始吧&#xff01; 目…...

Java多线程面试题:描述一下线程安全活跃态问题,竞态条件?

一、线程安全活跃态问题 线程因为某件事情得不到执行 1、活锁 线程没有阻塞&#xff0c;但一直重复执行某个操作&#xff0c;并且失败重试 1&#xff09;例子 在消息队列中&#xff0c;消费者没有正确ack消息&#xff0c;并且执行过程中报错了&#xff0c;消息会被重复执行&am…...

ZZNUOJ_用C语言编写程序实现1193:单科成绩排序(结构体专题)(附完整源码)

题目描述 有一学生成绩表&#xff0c;包括学号、姓名、3门课程成绩。请按要求排序输出&#xff1a;若输入1&#xff0c;则按第1门课成绩降序输出成绩表&#xff0c;若输入为i&#xff08;1<i<3)&#xff0c;则按第i门课成绩降序输出成绩表。 输入 首先输入一个整数n(1<…...

expect 使用方法

Expect是一个免费的 编程工具语言&#xff0c;用来实现自动和交互式任务进行通信&#xff0c;而无需人的干预。 1、传参方法&#xff1a; bash是通过$0 ... $n接收参数 expect是通过set <变量名称> [lindex $argv <param index>], 2、判断语法 if { condition } { …...

Spring AOP详解-Spring官方原版

一、概述 面向方面编程(AOP)补充了面向对象编程(OOP) 提供了另一种思考程序结构的方式。模块化的关键单元 在OOP中是类,而在AOP中,模块化的单位是方面。方面 实现跨越问题(如事务管理)的模块化 多种类型和对象。(这种关切通常被称为“跨领域”关切 Spring 的关键组件之…...

链表习题精选(持续更新中)

第一题给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。请注意&#xff0c;偶数组和奇数组内部…...

【log】操作类日志处理 与 报错类日志处理logback

文章目录一、操作类日志处理【环绕增强】aop环绕增强导包第一步&#xff1a;自定义注解interface第二步&#xff1a;在Controller写一个测试的方法&#xff1a;第三步&#xff1a;编写LogAspect增强类与增强方法日志写入数据库&#xff08;使用mybatis&#xff09;第一步&#…...

百度网盘好友发来的文件手动输入JS选择代码批量保存

基本代码&#xff1a;document.getElementsByClassName(global-clearfix)[3].getElementsByTagName(li)[0].getElementsByTagName(a)[0].click();范围选择函数&#xff1a;这个要手动全部取消选择function sel(a,b){var alidocument.getElementsByClassName(global-clearfix)[3…...

【CS224W】(task6)Google的PageRank算法

note 求解pagerank&#xff1a;用power iteration&#xff08;幂迭代&#xff09;方法求解 rM⋅r\mathbf{r}\mathbf{M} \cdot \mathbf{r}rM⋅r ( MMM 是重要度矩阵)用random uniform teleporation解决dead-ends&#xff08;自己指向自己&#xff09;和spider-traps&#xff08…...

Python安装拓展库及常用的pip命令及其用法

Python安装拓展库 在Python中&#xff0c;库是一些预先编写好的代码和函数&#xff0c;它们可以帮助你解决特定的问题。如果你想要扩展Python库&#xff0c;通常有两种方法&#xff1a;使用现有的第三方库&#xff0c;或者编写自己的库。 1.使用现有的第三方库 Python社区中…...

这9道软件测试面试题,就能刷掉90%的软件测试员

转眼就要到“金三银四”了&#xff0c;没点真本事真技术&#xff0c;没点面试经验&#xff0c;不了解点职场套路&#xff0c;如何过五关斩六将&#xff1f;如何打败面试官&#xff1f;如何拿下那梦寐以求的offer&#xff1f; 如果你的跳槽意向已经很确定&#xff0c;那么请往下…...

【大数据】大数据Hadoop生态圈

文章目录大数据Hadoop生态圈-组件介绍1、HDFS&#xff08;分布式文件系统&#xff09;2、MapReduce&#xff08;分布式计算框架&#xff09;3、Spark&#xff08;分布式计算框架&#xff09;4、Flink&#xff08;分布式计算框架&#xff09;5、Yarn/Mesos&#xff08;分布式资源…...

python读取tif图像+经纬度

python读取tif的包很多&#xff0c;但大都只能读出图像像素值&#xff0c;不能读取到经纬度信息。原因&#xff1a;TIFF 简单理解就是一种图像格式&#xff0c;类似于 jpg、png 等。GeoTIFF 就是在普通 TIFF 文件上增加了地理位置、投影信息、坐标信息等&#xff0c;常用于遥感…...

Kali安装配置vulhub

一、vulhubVulhub是一个基于docker和docker-compose的漏洞环境集合&#xff0c;进入对应目录并执行一条语句即可启动一个全新的漏洞环境&#xff0c;主要利用于漏洞复现。Vulhub的官方地址为www.vulhub.org。二、搭建vulhub靶场2.1 开启kali虚拟机2.2 安装docker先更新一下软件…...

【进击的算法】动态规划——不同维度的背包问题

文章目录前言动态规划的维度二维动规leetcode416、分割等和子集leetcode1049. 最后一块石头的重量 IIleetcode494、目标和三维动规leetcode474. 一和零结语前言 大家好久不见&#xff0c;这次我们一起来学习一下动态规划中怎么确定维度&#xff0c;和对应问题如何解决。 动态…...

udiMagic 导入 Excel to Tally ERP Crack

关于 udiMagic 软件 udiMagic 是一款可帮助您快速轻松地将数据导入 Tally ERP 的应用程序。它由 Shweta Softwares 创建和分发&#xff0c;于2007 年首次推出。 您可以在 USB 闪存驱动器 [旅行许可证] 中携带 udiMagic&#xff0c;并在具有任何 Tally 版本的任何计算机上使用…...

Redis实现分页和多条件模糊查询方案

导言 Redis是一个高效的内存数据库&#xff0c;它支持包括String、List、Set、SortedSet和Hash等数据类型的存储&#xff0c;在Redis中通常根据数据的key查询其value值&#xff0c;Redis没有模糊条件查询&#xff0c;在面对一些需要分页、排序以及条件查询的场景时(如评论&…...

【H5 | CSS | JS】如何实现网页打字机效果?快收下这份超详细指南(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…...

Airbyte,数据集成的未来

Gartner 曾预计&#xff0c;到 2025 年&#xff0c;80% 寻求扩展数字业务的组织将失败。因为他们没有采用现代方法来进行数据和分析治理。数据生态是基础架构生态的最重要一环&#xff0c;数据的处理分发与计算&#xff0c;从始至终贯穿了整个数据流通生态。自从数据集中在数据…...

00.内容安排

内容安排如下01.Linux基本命令0.2 vim编辑器&#xff0c;gcc、gdb、makefile、动/静态库制作使用03.文件 I/O 常用函数、文件读写原理、进程控制快概念、阻塞、非阻塞概念04.文件常用操作函数、目录常用操作函数、重定向05.进程控制fork、exec函数组、进程回收 wait/waitpid06.…...

FreeRTOS任务基础知识

单任务和多任务系统单任务系统单任务系统的编程方式&#xff0c;即裸机的编程方式&#xff0c;这种编程方式的框架一般都是在main&#xff08;&#xff09;函数中使用一个大循环&#xff0c;在循环中顺序的执行相应的函数以处理相应的事务&#xff0c;这个大循环的部分可以视为…...

JDBC-API详解、SQL注入演示、连接池

文章目录JDBC1&#xff0c;JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2&#xff0c;JDBC快速入门2.1 编写代码步骤2.2 具体操作3&#xff0c;JDBC API详解3.1 DriverManager3.2 Connection &#xff08;事务归我管&#xff09;3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…...

C 学习笔记 —— 动态分配内存(malloc)

文章目录分配内存malloccallocrealloc创建数组方式free的重要性举例常见动态分配内存错误忘记检查所请求的内存对NULL指针进行解引用对分配的内存越界访问释放一块内存后&#xff0c;继续使用释放一块内存的一部分是不允许的内存泄漏分配内存 当一个数组声明时&#xff0c;需要…...

RK3588通用布线设计指南

&#xff08;1&#xff09;走线长度应包含过孔和封装。&#xff08;2&#xff09;由于表贴器件的焊盘会导致阻抗降低&#xff0c;为减小阻抗突变的影响&#xff0c;建议在表贴焊盘的正下方按焊盘大小挖去一层参考层。常用的表贴器件有&#xff1a;电容、 ESD、共模抑制电感、连…...

ChatGPT也懂如何设计开发板!?

到底应该如何设计一款开发板&#xff1f;我们问了一下最近风很大的ChatGPT&#xff0c;得出了这样的回答&#xff1a; 或者这样的回答&#xff1a; 显而易见&#xff0c;RK3568开发板是一款功能丰富&#xff0c;性能优异&#xff0c;易于开发的高性能开发板&#xff0c;适用于各…...

去了字节跳动,才知道年薪40W的测试居然有这么多?

今年大环境不好&#xff0c;内卷的厉害&#xff0c;薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的…...

2023前端面试知识点总结

原型 JavaScript中的对象都有一个特殊的 prototype 内置属性&#xff0c;其实就是对其他对象的引用 几乎所有的对象在创建时 prototype 属性都会被赋予一个非空的值&#xff0c;我们可以把这个属性当作一个备用的仓库 当试图引用对象的属性时会出发get操作&#xff0c;第一步时…...

FL StudioV21电脑版水果编曲音乐编辑软件

这是一款功能十分丰富和强大的音乐编辑软件&#xff0c;能够帮助用户进行编曲、剪辑、录音、混音等操作&#xff0c;让用户能够全面地调整音频。FL水果最新版是一款专业级别的音乐编曲软件&#xff0c;集合更多的编曲功能为一身&#xff0c;可以进行录音、编辑、制作、混音、调…...

【数据结构初阶】实现顺序表的简单功能

目录一.线性表和顺序表的概念二.顺序表的实现1.动态顺序表的创建2.初始化顺序表3.打印顺序表4.销毁顺序表5.检查容量6.头插 尾插7.头删 尾删三.使用下标插入删除1.删除指定位置2.向指定位置插入指定数一.线性表和顺序表的概念 线性表是n个具有相同特性的数据元素的有限序列。 线…...

华为OD机试题,用 Java 解【停车场车辆统计】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…...