汇编语言入门(一)

基础知识

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

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

  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指向的内存单元中的内容为指令。
    在这里插入图片描述
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

poggioxay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值