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

一、相关概念

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类来实现。


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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨平生9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值