语法篇--汇编语言先导浅尝

news2025/1/13 15:56:41

一、相关概念

1.机器语言

机器语言(Machine Language)是一种计算机程序语言,由二进制代码(0和1)组成,可被计算机直接执行。机器语言是计算机硬件能够理解和执行的唯一语言。

机器语言通常由一系列的指令组成,每个指令都有其特定的操作码(Opcode)操作数(Operand)。操作码指示计算机要执行的操作类型(例如,加法、乘法、跳转等),而操作数则指示操作所涉及的数据。

2.汇编语言

汇编语言(Assembly Language)是一种计算机程序语言,与机器语言密切相关,但使用更具可读性的文本格式进行编写。汇编语言的指令通常与机器语言指令一一对应,但是用易于理解的文本助记符(Mnemonic)来表示。

与机器语言相比,汇编语言的语法更加高级,因此编写和调试汇编语言程序通常比编写机器语言程序更容易。使用汇编语言编写的程序通常可以更加高效地运行,因为程序员可以更好地控制计算机硬件的细节,但也需要更多的时间和精力。

汇编语言程序需要经过汇编器(Assembler)的转换才能变成机器语言程序。汇编器将汇编语言指令转换为等效的机器语言指令,以便计算机可以理解和执行。由于不同的计算机体系结构可能有不同的指令集和汇编语言语法,因此汇编语言程序不具有可移植性。

关系:

机器语言01---助记符---汇编语言

汇编语言由以下3类组成

1、汇编指令(机器码的助记符)
2、伪指令(由编译器执行)
3、其它符号(由编译器识别)

注意:

指令和数据是应用上的概念。
在内存或磁盘上,指令和数据没有任何区别,都是二
进制信息。

3.进制

进制的本质

进制的本质思想是使用有限数量的符号(数字)来表示无限数量的数字。即查数

进制的运算

运算的本质即查数

加法

 

 乘法

 除法

4.数据宽度

 数据宽度(Data Width)是指计算机处理器能够同时处理的位数(或字节数)。例如,32位计算机处理器可以同时处理32位(4字节)的数据,而64位计算机处理器可以同时处理64位(8字节)的数据。

数据宽度对于计算机处理数据的速度和精度有着重要的影响。较大的数据宽度通常能够提供更高的计算性能和精度,因为更多的数据可以同时被处理,从而减少了处理器需要执行的指令数。同时,更大的数据宽度还可以支持更大的内存地址空间和更高的带宽,从而提高了

5.有符号数和无符号数的理解

 6.位运算的理解

位运算(Bitwise operation)是一种操作二进制位的运算,它直接对二进制数的每一位进行操作,而不考虑它们所代表的数值。位运算通常用于计算机底层的操作和优化,如处理掩码、位域、加密和压缩等。位运算是一种非常基础和有用的运算方式,能够用于计算机底层的优化和实现,也可以用于高级的数据处理和算法设计。

常见的位运算符包括:

按位与(&):两个操作数的对应位都为1时结果为1,否则为0。
按位或(|):两个操作数的对应位都为0时结果为0,否则为1。
按位异或(^):两个操作数的对应位不同时结果为1,否则为0。
按位取反(~):对操作数的每一位取反,0变为1,1变为0。
左移(<<):将操作数的二进制表示向左移动指定位数,右侧用0填充。
右移(>>):将操作数的二进制表示向右移动指定位数,左侧用原始值的符号位填充。

位运算的一个重要应用是使用位掩码(bit mask)进行位操作,以实现对特定位的控制和操作。位掩码是一个用于选定某些位并清除其他位的二进制掩码。

加法:使用异或运算(^)和与运算(&)来实现。首先对两个操作数进行异或运算,然后对两个操作数进行与运算,将结果左移一位,再将异或运算的结果和这个结果相加,直到与运算的结果为0为止

4+5

 减法:使用补码运算来实现。首先将减数取反,然后将它与被减数相加,再将结果取反,就得到了减法的结果。

乘法:使用位移和加法来实现。将乘数分解成若干个二进制位,然后根据每个二进制位上的值来进行位移和加法运算

除法:使用位移、减法和加法来实现。将被除数和除数都转换为二进制形式,然后用被除数减去若干个除数的和,直到被除数小于除数为止。

 

 7.汇编环境说明

 8.通用寄存器

 

 寄存器是计算机内部的一种存储设备,它可以存储和操作一些特定类型的数据。通用寄存器是计算机中用于一般目的的寄存器,通常用来存储整数、地址等数据。通用寄存器在计算机内部使用的频率很高,是指令集中的核心部分。

在计算机中,CPU会将数据从内存中加载到寄存器中进行处理,再将结果写回到内存中。通用寄存器的数量和名称可以因CPU的架构而异,例如x86架构的CPU有8个通用寄存器,分别是eax、ebx、ecx、edx、esi、edi、ebp和esp,每个寄存器的大小为32位。

通用寄存器可以用于存储计算中的中间结果,从而减少内存访问的次数,提高计算速度。此外,通用寄存器还可以用于函数调用、参数传递等方面,提高程序的运行效率。在程序设计时,需要考虑通用寄存器的使用,以最大限度地提高程序的性能。

9.内存

 内存是计算机中用于存储数据和程序指令的物理硬件设备。内存可以被视为计算机的大脑,它是计算机中最重要的组成部分之一。

内存分为随机存储器(RAM)和只读存储器(ROM)两种类型。RAM 是一种易失性内存,它可以读写,并且在计算机关闭电源后数据会被清除。ROM 是一种非易失性内存,只能读取,数据不会被清除。

内存的主要功能是存储数据和程序指令,计算机的中央处理器(CPU)从内存中读取数据和指令,进行运算和处理。内存的大小决定了计算机可以同时存储和处理的数据和指令的数量和复杂度。

在计算机运行程序时,操作系统会将程序和数据加载到内存中。程序的执行需要使用内存,当程序需要更多内存时,操作系统会动态地分配更多内存,直到内存耗尽为止。

内存的速度很快,但容量有限。因此,程序员需要注意内存的使用,避免浪费和内存泄漏,以免影响程序的性能和稳定性。

 内存如何存值

内存是计算机中用来存储数据和程序指令的设备。内存通常由一系列连续的存储单元组成,每个存储单元都有一个唯一的地址,可以用来标识和访问该单元。

内存中的值存储在这些存储单元中。要将一个值存储在内存中,首先需要确定要存储的值的数据类型和大小。根据数据类型和大小,可以确定需要分配多少个存储单元来存储该值。

例如,一个整数通常需要四个字节(32位),因此需要分配四个连续的存储单元来存储它。在存储值之前,需要将值转换为二进制格式,然后按顺序将每个二进制位存储在对应的存储单元中。

当程序需要访问存储在内存中的值时,它需要知道该值存储的地址。程序可以使用变量或指针来跟踪值的地址。通过将地址传递给内存管理单元,程序可以读取或写入存储在该地址处的值。

存储单元

CPU对存储器的读写

在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。、

CPU是通过地址总线来指定存储单元的。地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。

一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N。

这样的CPU最多可T以寻找2的N次方个内存单元。
数据总线的宽度决定了CPU和外界的数据传送速度。

CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一
些不同控制线的集合。
有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。
所以,
控制总线的宽度决定了CRU对外部器件的控制能力。(读或写)

内存地址空间

对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。

10.存储器芯片

二、底层原理

1.计算机的组成

 

2.存储器的层次结构

java->class->jvm(bite code)->os->汇编语言->CPU

3.进程和线程

进程和线程都是操作系统中的基本概念,用于实现多任务处理和并发执行。

进程是一个正在运行的程序的实例。每个进程都拥有自己的内存空间、数据和状态,它们之间相互独立,互不影响。一个进程可以包含多个线程,每个线程都是进程中的一个独立执行流程,可以共享进程的内存空间和资源。

线程是进程中的一个独立执行流程,每个线程拥有自己的栈、程序计数器和寄存器等寄存器状态,但它们共享进程的内存空间和资源,这包括代码、数据、文件、网络连接等。线程可以独立执行,也可以与其他线程协作完成任务。

相比较而言,线程更加轻量级,创建和销毁的代价更小,并且能够更快地切换执行状态,因此,多线程技术在实现并发处理和提高系统性能方面有着重要的作用。但同时,多线程也会引入一些并发问题,如死锁、竞态条件等,需要开发者小心处理。


4.多核CPU

CPU内存的三级缓存分别为L1缓存、L2缓存和L3缓存,它们都是用来加速CPU读写内存的。

L1缓存位于CPU内部,是CPU中最小且最快的缓存,它通常包含指令缓存和数据缓存两部分。L1缓存的大小通常为几十KB,它可以在一个CPU周期内完成一次读写操作,因此,它能够提供非常快的响应速度,但是由于其容量较小,容易产生缓存未命中的情况。

L2缓存位于CPU内部或CPU芯片附近,通常是共享的,多个CPU核心可以共用同一个L2缓存。L2缓存的容量一般为几百KB或几MB,速度比L1缓存慢一些,但比内存快得多,可以在数个CPU周期内完成一次读写操作。

L3缓存位于CPU芯片外部,通常是多个CPU核心共享的,它的容量可以达到数十MB甚至几百MB,速度比内存略快一些,但比L2缓存慢得多。L3缓存的作用是为多个CPU核心提供一个共享的缓存,可以减少CPU之间的竞争,提高整个系统的性能。

三级缓存的层次结构可以通过缓存控制器来实现。在读写数据时,CPU首先会查找L1缓存,如果缓存未命中,则会查找L2缓存,最后才会访问内存。如果L3缓存存在,则L2缓存会先查找L3缓存,如果L3缓存也未命中,则才会访问内存。由于缓存速度比内存快得多,因此尽可能地利用缓存可以大大提高系统的性能。

 CPU的缓存一致性协议是一组规则,用于确保多个CPU的缓存中的数据在多核系统中保持一致。这些协议的主要目的是避免多个CPU访问相同的内存位置时发生数据不一致的情况。

其中最常见的缓存一致性协议是MESI协议,该协议由四个状态表示缓存行的不同状态:

修改(Modified):表示缓存行已被修改,并且与主存中的数据不一致。

独占(Exclusive):表示缓存行已被读入,但未被修改,并且是唯一一个拥有该缓存行的CPU。

共享(Shared):表示缓存行已被读入,但未被修改,并且与其他CPU共享。

无效(Invalid):表示缓存行已被标记为无效,即该缓存行未被读入或已被修改。


当一个CPU想要读取或写入某个内存位置时,它会首先检查缓存行的状态,然后根据状态执行相应的操作。如果缓存行的状态为“共享”,则其他CPU可以读取该缓存行。如果缓存行的状态为“修改”,则其他CPU必须从该CPU中获取最新的数据或者等待该CPU将数据刷新到主存中。

在多核系统中,缓存一致性协议是非常重要的,因为它可以确保所有CPU访问的数据是一致的,避免了不一致的情况。缓存一致性协议也可以提高系统的性能,因为它允许多个CPU同时访问相同的内存位置,而无需等待其他CPU完成操作。

ordering程序的排列组合:

指令是可以重排的

5.JVM内存屏障

JVM内存屏障(Memory Barrier)是一种同步机制,用于确保多线程程序中的内存可见性和有序性。在多线程程序中,由于线程之间的指令重排、缓存一致性等问题,会导致共享变量的值在不同线程之间出现不一致的情况。内存屏障可以解决这些问题,保证程序的正确性和可靠性。

在JVM中,内存屏障分为读屏障和写屏障两种。

读屏障:读屏障用于确保内存可见性,它保证在读操作之前的所有写操作都已经完成,防止出现脏读的情况。在JVM中,读屏障通过volatile关键字来实现。

写屏障:写屏障用于确保内存有序性,它保证写操作的顺序与程序代码的顺序一致,防止出现写操作顺序不一致的情况。在JVM中,写屏障通过synchronized关键字和Lock类来实现。


内存屏障的作用是保证程序的正确性和可靠性,在多线程编程中非常重要。开发者需要注意,在使用内存屏障时要遵循正确的规范和使用方法,否则可能会产生意想不到的错误。同时,在编写多线程程序时也要尽量避免使用共享变量,以减少内存屏障的使用,提高程序的性能和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

湖州银行冲刺A股上市:计划募资约24亿元,资产质量水平较高

3月4日&#xff0c;湖州银行股份有限公司&#xff08;下称“湖州银行”&#xff09;递交招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;湖州银行计划募资23.98亿元&#xff0c;将在扣除发行费用后全部用于补充该行资本金。 湖州银行在招股书中表示…

GO 语言基础语法一 (快速入门 Go 语言)

Go语言基础语法一. golang 标识符&#xff0c;关键字&#xff0c;命名规则二. golang 变量三. golang 常量四. golang 数据类型五. golang 布尔类型六. golang 数字类型七. golang 字符串1. go语言字符串字面量2. go语言字符串连接(1). 使用加号(2). 使用 fmt.Sprintf() 函数(3…

内容算法解读:提高内容摘要与原文的一致性(Faithfulness)

全文摘要&#xff1a;受益于预训练语言模型的发展&#xff0c;应用神经网络模型提取内容摘要的技术也获得了长足进步。但目前还存在一个未被很好解决的问题&#xff1a;神经网络模型提取的摘要不能如实反映原文档的中心思想&#xff0c;没有做到忠实&#xff08;not faithful&a…

simulink PID控制

系列文章目录 文章目录系列文章目录前言一、非线性系统线性化原理二、反馈控制开环控制反馈or闭环控制PID ControllerPID微调案例总结前言 将非线性系统近似线性化PIDblock与微调 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、非线性系统线性化 …

Day907.分区表 -MySQL实战

分区表 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于分区表的内容。 经常被问到这样一个问题&#xff1a; 分区表有什么问题&#xff0c;为什么公司规范不让使用分区表呢&#xff1f; 一、分区表是什么&#xff1f; 为了说明分区表的组织形式&#xff0c;先创建…

Python 数据库如何更新、删除、执行?这里实例告诉你

人生苦短 我用Python 这次继续给大家带来数据库的相关操作 Python 安装包其他数据:点击此处跳转文末名片获取 数据库更新操作 更新操作用于更新数据表的的数据&#xff0c; 以下实例将 EMPLOYEE 表中的 SEX 字段为 M的 AGE 字段递增 1&#xff1a; #!/usr/bin/python # -*- …

ubuntu-9-安装chrony时间同步

使用chrony搭建时间同步服务器 [Linux系列]Chrony时间同步服务器 配置chrony服务&#xff0c;实现服务器时间自动同步 linux上内网环境配置NTP时间同步详解 经验体会&#xff1a;解决Ubuntu 18.04Windows双系统时间不同步的问题 1 时间同步 我们知道一台电脑主机&#xff0c;…

将微信小程序页面转为图片

最近做项目遇到一个需求,那就是要将某个页面转为图片然后传给后端,我仔细找了一圈,发现官方那个Api也就是wx.canvasToTempFilePath生成的图片很有可能为空,太坑了,于是我放弃用它了,选择了用wxml2canvas。 安装wxml2canvas npm init npm install wxml2canvas --save --…

通用游戏地图解决方案设计解析

前言&#xff1a; 在软件开发过程中&#xff0c;我们都希望能设计出一个稳健的&#xff0c;可维护的系统&#xff0c;为了实现这个目的&#xff0c;人们总结出了很多相关的设计原则&#xff0c;比如SOLID原则&#xff0c; KISS原则等等。SOLID每个字母代表了一种设计原则&…

数据是如何在计算机中存储的

我们普通人对于数据存储的认识恐怕大多数都是从自己使用的电脑来的。现在几乎人手一台电脑,而我们的电脑存储着各种各样的文件,比如视频文件、音频文件和Word文档等。这些文件从计算机术语的角度都可以称为数据。 如图1-1所示是Windows 10 “我的电脑”的截图。通过该截图我…

202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多

202302读书笔记|《长安的荔枝》——只要肯努力&#xff0c;办法总比困难多 《长安的荔枝》这本书真是酣畅淋漓啊&#xff0c;读起来一气呵成&#xff0c;以讲故事的口吻叙述&#xff0c;上林署九品小官员——李善德&#xff0c;兢兢业业工作多年&#xff0c;终于借贷买了房&…

mac M1 nvm安装教程,避坑

mac M1 nvm 安装问题 新款的mac搭载了苹果自研的芯片&#xff0c;放弃了intel的x86芯片&#xff0c;那之前的软件难免会存在兼容性问题。 鄙人有幸踩了第一个坑。 在通过nvm 安装不同版本的node 时&#xff0c;出现了问题。 问题一&#xff1a;先说一下 nvm的安装问题&#…

Python02 基础语法

Python02 基础语法 二、基础语法 2.1 注释 概念&#xff1a;对某一部分代码的解释说明&#xff0c;在程序执行的时候不会去进行执行。比如&#xff1a;产品的说明书、电影的旁白。 程序员最讨厌的两件事&#xff1a; 一件是自己写代码被要求加注释 另一件是接手别人代码&…

Cesium三维数据格式以及生产流程详解(glb,osgb,obj,bim,ifc)等

最近收到私信问我在cesium上展示的一些三维数据是如何生产和处理的,这篇文章就给大家一次性讲个透彻。 首先我们来做做分类。市面上能接触到的,常见的,cesium上支持展示的三维数据大致分为以下几种: 1.倾斜摄影(osgb,obj) 2.点云数据(las,pts) 3.手工模型(gltf,…

win10安装oracle

文件放到最后。我的电脑是win11的&#xff0c;因为老师让写下安装笔记&#xff0c;在11上安装的时候没有截屏&#xff0c;所以在虚拟机上重新安装下吧。室友说要把文件夹放到c盘才能打开。我试了下&#xff0c;具体的是要把Oracle11g文件夹放到c盘根目录下。如果解压后不是这个…

修正一些formdesigner的一些bug与操作

之前集成了formdesigner表单设计器&#xff0c;但还是有些问题&#xff0c;所以进行一些bug修复与功能修正 一、之前组件布局的图标不见了 在main.js里增加下面一行 import /components/formdesigner/assets/iconfont/iconfont.js 效果如下&#xff1a; 二、选择列表没有数…

react-draggable实现拖拽详解

react-draggable属性常用属性属性列表事件列表举例首先安装 react-draggable实现移动希望小编写的能够帮助到你&#x1f618;属性 常用属性 属性默认值介绍axisxhandle拖动的方向&#xff0c;可选值 x ,y,bothhandle无指定拖动handle的classposition无handle的位置&#xff0…

习题30 if elif else 语句

people 30#变量people赋值30 cars 40#变量cars赋值40 buses 15#变量buses赋值 if cars > people:#如果出租车比人多print("We should take the cars")#我们坐出租车 elif cars < people:#elif后面必须跟条件&#xff0c;print("We should not take the…

MyBatis框架的入门案例

MyBatis框架的入门案例 资源地址&#xff1a;https://download.csdn.net/download/weixin_41957626/87531373 1.MyBatis的配置 环境&#xff1a;基于maven的结构 1.1目录结构 1.2依赖包 <dependencies><!--mybatis--><dependency><groupId>org.mybatis…

【Vue3 第二十二章】过渡动画

一、基本用法 <Transition> 是一个内置组件&#xff0c;这意味着它在任意别的组件中都可以被使用&#xff0c;无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发&#xff1a; 由 v-if 所触发的切换由 v-…