• 汇编语言入门(一)


    基础知识

    汇编语言是直接在硬件之上工作的编程语言,首先先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。

    机器语言【概念理解就好】

    1. 机器语言是机器指令的结合,机器指令展开来讲就是一台机器可以正确执行的命令。
    2. 如指令:01000000,汇编语言表示形式:PUSH AX
    3. 计算机能读懂的只有机器指令。

    汇编语言的产生

    • 汇编语言的主体是汇编指令。
    • 汇编指令和机器指令的区别在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式。
    • 即汇编指令是机器指令的助记符,同机器指令一一对应。
    • 如操作:寄存器【寄存器简单的将是CPU中可以存储数据的器件,一个CPU中有多个寄存器】BX的内容送到AX中,汇编指令:MOV AX,BX

    汇编语言的组成

    1. 主要由三类组成:汇编指令【机器码的助记符】、伪指令【由编译器执行】、其他符号【由编译器执行】。
    2. 汇编语言的核心是汇编指令,它决定了汇编语言的特性。
    3. 每一种CPU都有自己的汇编指令集。
      在这里插入图片描述

    存储器

    • CPU是计算机的核心部件,它控制整个计算机的运行并进行运算,要想让一个CPU工作,就必须向它提供指令【怎么做】和数据。
    • 指令和数据在存储器中存放,也就是平时说的内存。
    • 在一台PC机中内存的作用仅次于CPU
    • 离开了内存,性能再好的CPU也无法工作。
    • 磁盘不同于内存,磁盘上的数据和程序如果不读到内存中,就无法被CPU使用。

    指令和数据

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

    存储单元

    • 存储器被划分为若干个存储单元【不一定是内存】,每个存储单元从0开始顺序编号。
    • 对于大容量的存储器,一般还用到一下单位来计算容量【B表示byte】:1KB = 1024B【2的10次方】,1MB =1024KB1GB = 1024MB1TB = 1024GB
    • 磁盘的容量单位同内存一样,实际上以上单位是微机中常用的计量单位。
    • 存储单元从0开始顺序编号。
    • 一个存储单元【一个字节】可以存储8个bit,即八位2进制数。【1Byte = 8bit】

    CPU对存储器的读和写

    1. CPU想要进行数据的读和写,必须和外部器件【标准的来说是芯片】进行三类信息的交互:存储单元的地址【地址信息】、器件的选择,读或写命令【控制信息】、读或写的数据【数据信息】。
    2. CPU通过导线将地址、数据和控制信息传到存储芯片中。
    3. 在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。
    4. 其中总线逻辑上分为地址总线、数据总线、控制总线。
      在这里插入图片描述
    5. 每一个CPU芯片都有许多管脚,这些管脚和总线相连。也就是说,这些管脚引出总线。

    地址总线

    • CPU通过地址总线来指定存储单元的。
    • 地址总线能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。
    • 一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N,这样的CPU最多可以寻找2的N次方个内存单元。【1Byte = 8bit】
    • 地址总线的宽度决定了CPU的寻址能力。

    数据总线

    1. CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。
    2. 数据总线的宽度决定了CPU和外界的数据传送速度。

    控制总线

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

    主板

    1. 在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件。
    2. 这些器件通过总线相连。

    接口卡

    • 计算机系统中,所有可用程序控制其互相工作的设备,必须受到CPU的控制
    • CPU对外部设备不能直接控制,如显示器、音箱、打印机等,直接控制这些设备进行工作的是插在扩展插槽上的接口卡。

    各存储类芯片

    1. 从读写属性上来看,分为随机存储器【RAM】和只读存储器【ROM】。
    2. 从功能和连接上分类:随机存储器RAM、装有BIOS的ROM、接口卡上的RAM。
    3. BIOS:基本输入输出系统,是由主板和各类接口卡【如显卡、网卡等】厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出,在主板和某些接口卡上插有存储相应BIOS的ROM。
      在这里插入图片描述
    4. 上述这些存储器在物理上是独立的器件,但是他们有以下两点相同:都和CPU的总线相连、CPU对他们进行读或写的时候都通过控制线发出内存读写命令。

    内存地址空间

    1. 概述:一个·CPU的地址线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。
    2. 不同的计算机系统的内存地址空间分配情况是不同的。
    3. 最终运行程序的是CPU,我们用汇编编程的时候,必须要从CPU的角度考虑问题。
    4. 对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制,这个逻辑存储器即是我们所说的内存地址空间。

    寄存器(CPU工作原理)

    概述

    • 一个典型的CPU是由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
    • 区别:内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板其他器件的联系。
    • 8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

    通用寄存器

    1. 8086CPU所有的寄存器都是16位的,可以存放两个字节。
    2. AX、BX、CX、DX通常用来存放一般性数据,被称为通用寄存器。8086上一代CPU中的寄存器都是8位的,为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
    3. AX为例的逻辑结构:
      在这里插入图片描述
    4. 16位寄存器所能存储的数据最大值为216-1 。
    5. AX可以分为AH【高八位】和AL【低八位】,BX、CX、DX同理。、
    6. AHAL寄存器是可以独立使用的8位寄存器。

    字在寄存器中的存储

    • 8086 CPU所有的寄存器是16位,可以存放2个字节【一个字】。
    • 一字节由8 bit 组成,可以存在8位寄存器中。
    • 字【word】是两字节,16位。
      在这里插入图片描述
    • 为了区分不同的进制,在十六进制表示的数据后面添加H,二进制后面添加B【Binary】。

    几条汇编指令

    汇编指令不分大小写!

    在这里插入图片描述
    进位的丢失指的是禁止为不能在8位寄存器中保存,但是CPU并不是真的丢弃这个进位值。

    物理地址

    1. CPU访问内存单元时要给出内存单元的地址。
    2. 所有的内存单元构成的存储空间是一个一维的线性空间,我们将这个唯一的地址成为物理地址

    16位结构的CPU

    • 运算器一次最多可以处理16位数据。
    • 寄存器的最大宽度为16位。
    • 寄存器和运算器之间的通路是16位。

    8086 CPU给出物理地址的方法

    1. 8086有20根地址线,可传送20位地址,寻址能力为1M
    2. 但8086内部为16位结构,只能传送16位的地址,寻址能力为64K
    3. 所有8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
      在这里插入图片描述
      在这里插入图片描述
    4. 地址加法器工作原理:物理地址 = 段地址 * 16 + 偏移地址。
      在这里插入图片描述
      在这里插入图片描述
    5. 一个数据的二进制形式左移N位,相当于该数据乘以2的N次方。一个数据X进制形式左移N位,相当乘以N的X次方

    段地址*16+偏移地址=物理地址【本质】

    1. 基础地址 + 偏移地址 = 物理地址
      在这里插入图片描述

    2. 段地址*16+偏移地址 = 物理地址
      在这里插入图片描述

    段的概念

    1. 错误认知:内存被划分为一个一个的段,每一个段有一个段地址。
    2. 正确认知:内存并没有分段,段的划分来自CPU,由于8086CPU用“ 段地址*16+偏移地址 = 物理地址 ”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
      在这里插入图片描述
    3. 在编程中可以根据需要,将若干地址连续的内存单元看作一个段,用段地址*16定位段的起始地址【基础地址】,用偏移地址定位段中的内存单元。
    4. 一个段的起始地址是16的倍数。偏移地址为16位,寻址能力为64K,所以段的最大长度也是64K
    5. CPU访问内存单元时,必须向内存提供内存单元的物理地址。
    6. 8086CPU在内部用段地址偏移地址移位相加的方法形成最终的物理地址。
    7. CPU可以用不同的段地址和偏移地址形成同一个物理地址。
    8. 8086PC机中,存储单元的地址用两个元素来描述:段地址和偏移地址。
    9. 数据在21F60H内存单元中,对于8086PC机的两种描述:数据存在内存2000:1F60单元中【常见】;数据存在内存的2000段中的1F60H单元中。
    10. 可根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

    段寄存器

    • 段寄存器就是提供段地址的。
    • 8086CPU有4个段寄存器:CS【代码地址】、DS【数据地址】、SS【堆栈地址】、ES 【前面不够放这个寄存器】。
    • 8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。

    CS和IP

    1. CS【代码段寄存器】和IP【指令指针寄存器】是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的位置。
    2. 8086CPU工作过程的简要概述:
    • CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
    • IP=IP+所读取指令的长度,从而正确的指向下一条指令;
    • 执行指令。转到步骤1,周而复始。
      在这里插入图片描述
    1. 在任何时候,CPUCS:IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
    2. 如果说内存中的一段信息曾被CPU执行过的话,那么它所在的内存单元必然被CS:IP指向过。

    修改CS、IP的指令

    • CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
    • CPU从何处执行指令是由CS:IP中的内容决定的,程序员可以通过改变CS:IP中的内容来控制CPU执行目标指令。
    • mov指令可以改变8086CPU大部分寄存器的值,被称为传送指令。但mov指令不能用于设置CS:IP的值。
    • jmp 段地址:偏移地址,同时修改CSIP,用指令中给出的段地址修改CS,偏移地址修改IP。
    jmp 2AE3:3   //即物理地址被修改为2AE33
    jmp 3:0B16   //0003:0B16,即物理地址被修改为00B46
    
    • jmp 某一合法寄存器,则是仅修改IP。如jmp ax类似于mov IP,ax

    在这里插入图片描述

    mov ax,6622H
    jmp 1000:3
    mov ax,0000
    mov bx,ax
    jmp bx
    mov ax,0123H
    mov ax,0000
    

    代码段

    1. 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
    2. 可以将长度为N【N <= 64KB】的一组代码,存在一组地址连续,起始地址为16的倍数内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
    3. 如何使得代码段中的代码被执行呢? 将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动地将我们定义的代码段中的指令当作指令来执行,需要使用CS:IP来指定。
    4. CPU只认CS:IP指向的内存单元中的内容为指令。
      在这里插入图片描述
  • 相关阅读:
    【理解链表指针赋值】链表中cur->next = cur->next->next->next与cur =cur->next->next的区别
    网络安全——
    Servlet 与Spring对比!
    PMP每日一练 | 考试不迷路-11.04(包含敏捷+多选)
    今日睡眠质量记录80分
    到站上海!见证这座零碳园区的绿色低碳新选择
    监控Android Looper Message调度的另一种姿势
    多链路聚合路由在消防智能指挥系统中的应用
    MySQL基础学习总结(四)
    Hugging Face发布diffuser模型AI绘画库初尝鲜!
  • 原文地址:https://blog.csdn.net/m0_55854679/article/details/126839635