首页 > 编程语言 >汇编语言简易教程(2): 计算机体系概览

汇编语言简易教程(2): 计算机体系概览

时间:2024-04-10 12:26:19浏览次数:27  
标签:教程 缓存 汇编语言 概览 存储 内存 寄存器 CPU 高速缓存

汇编语言简易教程(2): 计算机体系概览

架构

image

  1. CPU
  2. RAM
  3. BUS
  4. DEVICE
  5. Secondary Storage (SSD / Disk Drive)

通常来说程序被存储在硬盘中, 在实际需要运行时从硬盘加载到内存.

主存通常来说是易失性存储, 所以在断电时, 存储内容会丢失. 二级内存通常是不易失的, 对于断电等行为有一定的抗性.

数据存储大小

image

image

CPU组成

算术逻辑单元 (ALU), 算术以及逻辑运算

寄存器

通用寄存器概览

image

组成

image

一个寄存器可能会有多个名字, 真正影响的是操作位置

左高右低

栈帧寄存器 (RSP)

One of the CPU registers, rsp, is used to point to the current top of the stack. The rspregister should not be used for data or other use

用于存储当前栈顶指针, 不应该用于存储数据或其他使用.

基址寄存器 (RBP)

One of the CPU registers, rbp, is used as a base pointer during function calls. The rbpregister should not be used for data or other uses

用于在函数调用期间存储基址指针, 不应该用于存储数据或其他使用.

指令寄存器 (RIP)

In addition to the GPRs, there is a special register, rip, which is used by the CPU topoint to the next instruction to be executed. Specifically, since the rip points to thenext instruction, that means the instruction being pointed to by rip, and shown in thedebugger, has not yet been executed

用来指向下一条要执行的指令, 需要注意此时尚未开始执行.

标志寄存器 (rFlags)

一个示例: CMPXCHG

标志寄存器 rFlags 用于状态和 CPU 控制信息.

rFlag 寄存器在每条指令后由 CPU 更新,并且不能由程序直接访问。

该寄存器存储有关刚刚执行的指令的状态信息。 rFlag 寄存器中的 64 位中,许多保留供将来使用

常见的标志寄存器

名称 符号表示 bit位 用途
Carry CF 0 用于指示前一个操作是否产生进位
Parity PF 2 用于指示最后一个字节是否有偶数个1
Adjust AF 4 用于支持二进制编码的十进制运算
Zero ZF 6 用于指示先前操作是否导致结果为零 CMPXCHG
Sign SF 7 用于指示前一操作的结果是否在最高有效位中产生 1(在有符号数据的上下文中指示负数)
Direction DF 10 用于指定某些字符串操作的方向(递增或递减)
Overflow OF 11 用于指示之前的操作是否导致溢出

XMM 寄存器

专用寄存器用于支持 64 位和 32 位浮点运算以及单指令多数据 (SIMD) 指令。

SIMD 指令允许将单个指令同时应用于多个数据项。有效地使用,可以显着提高性能。典型应用包括一些图形处理和数字信号处理

根本原因是: 一个像素点的颜色的一个分量是通过8bit来操作的, 如果直接使用通用寄存器来处理的话, 会有比较大的浪费.

可以参考下图:
image

将一个128bit的寄存器, 按照8bit一组的方式分成了16组.

请注意,一些较新的 X86-64 处理器支持 256 位 XMM 寄存器

SP

Cache

通常来说是主存的子集, 位于CPU中

如果一个主存位置被访问, cache中会存储这个值的拷贝.

快速连续发生的对该内存位置的后续访问将从高速缓存位置(CPU 芯片内部)的查找。

内存读取涉及通过总线将地址发送到内存控制器,内存控制器将获取所请求内存位置的值,然后通过总线将其发送回。相比之下,如果某个值在缓存中,则访问该值会快得多

当可以在缓存中找到所请求的数据时,发生缓存命中,而当无法在缓存中找到时,发生缓存未命中。

高速缓存命中是通过从高速缓存读取数据来实现的,这比从主内存读取数据要快。

缓存可以处理的请求越多,系统通常执行的速度就越快。

历代CPU芯片都增加了高速缓存并改进了高速缓存映射策略,以提高整体性能

一个典型的CPU cache架构如下图所示:

image

目前的芯片设计通常包括每个核心一个 L1 高速缓存和一个共享的 L2 高速缓存。

许多较新的 CPU 芯片将有一个额外的 L3 高速缓存.

从图中可以看出,所有内存访问都会经过每一级缓存。

因此,可能存在该值的多个重复副本(CPU 寄存器、L1 缓存、L2 缓存和主内存)。

主存

主存可以被看做是连续的字节.

主存是可以定位的 (如同数组可以通过下标定位一样)

另外需要注意: 其架构是小端序, 这意味着最低有效字节(LSB)存储在最低的内存地址中。最高有效字节 (MSB) 存储在最高内存位置。

image

我们以 5,000,000 (0x004C4B4016) 举例

image

可以参考: 编码序

通常来说在网络传输中使用的是大端序

在内存中运行时是小端序.

程序的内存布局

image

  1. 保留部分对用户程序不可用
  2. 文本段/代码段 是用来存储机器码的位置
  3. 数据段用来存储初始化数据
  4. BSS: 存储未提供初始值的已声明变量的位置。如果在设置之前访问,该值将没有意义。
  5. 堆是存储动态分配的数据的位置(如果需要)。
  6. 堆栈从高内存开始并向下增长

计算机存储结构

存储金字塔

image

典型的存储金字塔如上所示

越在顶端的存储速度越快, 价格越高, 容量越小

在底层的存储通常来说能够在相同的价格上提供数量级的存储容量提升, 以及数量级的慢速.

典型速度

image

  • 寄存器, 大小通常是64bit, 速度在1 ns 以内
  • CPU Cache, 大小一般在MB左右, 访问速度在50-60 ns
  • 主存, 一般在GB数量级, 访问速度在 100 - 150 ns
  • 次级存储/硬盘存储, TB量级, 3 - 15ms

标签:教程,缓存,汇编语言,概览,存储,内存,寄存器,CPU,高速缓存
From: https://www.cnblogs.com/pDJJq/p/18125752/simple-tutorial-of-assembly-language-2-overview-o

相关文章

  • 汇编语言简易教程(4):基本语法
    汇编语言简易教程(4):基本语法以yasm语法为主注释​;​分号之后的所有内容全都是注释,没有实际作用.数值数值必须是10进制/16进制/八进制最终都会被转为16进制的数字,以0x​开头,例如127​->0x7f​当使用8进制的时候:511​->777q​默认基数(基数)为十进制,......
  • 汇编语言简易教程(5):环境构建
    汇编语言简易教程(5):环境构建最近在学习assembly64时,需要对程序进行编写->生成汇编代码->调试->执行.本文聚焦于如果在Windows环境下,尽可能精简并且完整的构建一个汇编环境.基于Windows11,WSLUbuntu22.04,vscode,其他的系统/WSL发行版本.您可以以本文作为......
  • 汇编语言简易教程(6):工具链以及调试器
    汇编语言简易教程(6):工具链以及调试器通常,用于创建程序的编程工具集称为工具链。就本文而言,工具链包括以下内容汇编器Assembler​连接器Linker​加载器Loader​调试器Debugger虽然工具链有很多选项,但本文使用了一组相当标准的开源工具,这些工具可以很好地协同工作并......
  • 汇编语言简易教程(4):基本语法
    汇编语言简易教程(4):基本语法以yasm语法为主注释​;​分号之后的所有内容全都是注释,没有实际作用.数值数值必须是10进制/16进制/八进制最终都会被转为16进制的数字,以0x​开头,例如127​->0x7f​当使用8进制的时候:511​->777q​默认基数(基数)为十进制,......
  • 汇编语言简易教程(5):环境构建
    汇编语言简易教程(5):环境构建最近在学习assembly64时,需要对程序进行编写->生成汇编代码->调试->执行.本文聚焦于如果在Windows环境下,尽可能精简并且完整的构建一个汇编环境.基于Windows11,WSLUbuntu22.04,vscode,其他的系统/WSL发行版本.您可以以本文作为......
  • 汇编语言简易教程(6):工具链以及调试器
    汇编语言简易教程(6):工具链以及调试器通常,用于创建程序的编程工具集称为工具链。就本文而言,工具链包括以下内容汇编器Assembler​连接器Linker​加载器Loader​调试器Debugger虽然工具链有很多选项,但本文使用了一组相当标准的开源工具,这些工具可以很好地协同工作并......
  • WebClient类 详细使用教程
    原文链接:https://blog.csdn.net/nutian/article/details/2913670   https://blog.csdn.net/m0_58015531/article/details/131322801WebClient类如果只想从特定的URI请求文件,则可以使用的最简单.NET基类就是System.Net.WebClient。这个类是非常高层的类,它主要用于执行带有一......
  • Python教程‘r’的使用技巧
    嗨,大家好!今天,我们将探讨Python中一个重要但经常被忽视的小技巧'r'。 在Python中,r是一个前缀,它用于处理原始字符串(rawstrings)。原始字符串与普通字符串不同,它们让你在字符串中使用反斜杠符号\而不必担心它们被解释成转义字符。为什么要使用原始字符串?原始字符串......
  • 博客园美化教程
    博客园美化教程前言之前一直想美化博客园,但一直没有找到比较喜欢的主题。最近找到了一个还比较满意的主题,SimpleMemory,特此分享。正文一、申请js权限首先点击这里--->博客后台-博客园(cnblogs.com),来到博客园后台管理页面,点击设置下滑,在基本设置里找到申请js权......
  • ArcGls10.8保姆式安装教程
    ArcGIS10.8保姆式安装教程ArcGIS是由美国Esri公司开发的一套地理信息系统软件,可进行地理信息数据的采集、管理、分析和发布等操作。ArcGIS10.8是ArcGIS系列的最新版本,具有更加强大的功能和更好的性能。本文将介绍ArcGIS10.8的保姆式安装教程,帮助您快速安装和配置ArcGIS10.......