selector汇编语言

汇编语言知多少(一): 概论

2018-10-23  本文已影响75人  Lin__Chuan

编程语言的发展

操作:
将寄存器 BX 的内容送到寄存器 AX.

机器语言: 1000100111011000
汇编语言: mov ax, bx
高级语言: ax = bx

汇编语言的特点

采用高级语言C++和汇编语言编写同一个功能, 将 a + b 的结果赋值给 c, 然后打印 c 的结果.

语言 源文件大小 目标文件大小 可执行文件大小
汇编语言 近400字节 近200字节 近600字节
C++ 近150字节 近550字节 近9000字节

由于C++会链接很多底层库, 所以可执行文件会大这么多.

汇编语言的分类

要弄清楚这个, 我们先讲一下微处理器.

微处理器(Microprocessor)是可编程特殊集成电路, 其所有组件小型化至一块或数块集成电路内, 可在其一端或多端接受编码指令,执行此指令并输出描述其状态的信号. 又称半导体中央处理器,是微型计算机的一个主要部件.

时间 事件
1971年 Intel公司发布世界第一款4位微处理器 4004
1972年 Intel公司发布世界第一款8位微处理器 8008
1978年 Intel公司发布16位微处理器 8086(是x86系列第一款)
1982年 AT&T贝尔实验室设计的世界第一款32位微处理器BELLMAC-32A投产
1990年 用RISC技术(精简指令集)设计全球第一款64位微处理器 R4000

那么汇编语言怎么分类呢?

指的一提的是

Intel 处理器 ARM 处理器

汇编语言的用途

了解 CPU 等硬件结构.

软件\程序执行的过程

image.png

每一个CPU芯片都有许多管脚, 这些管脚和总线(Bus)相连, CPU 通过总线跟外部器件交互.

8086芯片

数据总线

8088的数据总线宽度是 8 根, 8086 的数据总线宽度是 16根, 那么分别向内存中写入 89D8H.

练习:

这里再啰嗦一遍, 1 字节 = 8 位, 1 Byte = 8 bit, 我们常说的 64 位操作系统, 指的是CPU 每次能处理 64 bit 的数据.

内存

各类存储器的逻辑连接与物理连接对应图.


image.png

所有的内存单元都有唯一的地址, 叫作物理地址, 内存地址空间的大小受 CPU 地址总线宽度的限制.

8086的地址地址总线宽度为20, 可以定位 2^{20} 个不同的内存单元, ( 内存地址范围为0x00000 ~ 0xFFFFF), 所以8086的内存空间大小为 1 MB.
注: 2^{20} = 1048576 , 0xFFFFF => 1048575

8086的寻址方式

地址加法器采用 物理地址 = 段地址 x 16 + 偏移地址 的方式合成物理地址.
比如 8086CPU 要访问地址为 123C8H 的内存单元

我们又能发现, 8086CPU的要访问的同一个 物理地址 可以由不同的 段地址偏移地址 组成.

内存的分段管理

如果给定一个段地址, 仅通过变化偏移地址来进行寻址, 最多可定位多少个内存单元?
偏移地址为 16 位, 变化范围为 0 ~ FFFFH, 仅用偏移地址来寻址, 最多可寻64KB个内存单元(2^{16} = 64KB) , 若给定段地址为 1000H, 用偏移地址寻址, CPU的寻址范围为 10000H ~ 1FFFFH.

在 8086PC机中, 存储单元的地址用段地址和偏移地址来描述, 
比如数据在 21F60H 内存单元中, 对于 8086PC机来说, 数据存在内存2000: 1F60单元中, 
或者数据存在 2000H段 中的 1F60H 单元中.

CPU的典型构成

不同的 CPU, 寄存器的个数, 结构是不同的, 8086 有 14 个寄存器, 都是16位 寄存器, 每个可以存放 2个 字节.


寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址.

通用寄存器

在汇编的数据存储中

上面展示的数据 20000 (4E20H), 字: 010011100 0100000B, 左边是 高八位, 右边是低八位.

段寄存器
8086 存在4个段寄存器, 当 CPU 需要访问内存时, 由这4个提供段寄存器提供内存单元的 段地址.

  1. 8086CPU 当前状态: CS 中的内容为 2000H, IP 中的内容是 0000H, CS 为代码段寄存器, IP (Instruction Pointer Segment)为指令指针寄存器, 他们指示了 CPU 当前要读取指令的地址.
  2. 内存 20000H ~ 20009H 单元存放着可执行的机器码.

下面将详细就介绍 CPU 如何处理汇编指令.

  1. CS, IP 中的内容送到 地址加法器 中, 物理地址 = 段地址 x 16 + 偏移地址, 输出 20000H
  2. 地址加法器 将物理地址送入到 输入输出控制电路.
  3. 输入输出控制电路 将物理地址 20000H 输入到 地址总线 开始寻址.
  4. 从内存 20000H 单元开始存放的机器指令 B8 23 01 通过 数据总线 被送入到 CPU.
  5. 输入输出控制电路 将机器指令 B8 23 01 送入 指令缓冲器.
    • 此时 IP 中的值自动增加, 以便CPU 可以读取下一条指令
    • 因为当前读入的指令 B8 23 01 长度为 3 个字节, 所以 IP 中的值加 3, 此时CS: IP执行内存单元 2000: 0003
  6. 执行控制器 执行指令 B8 23 01, 即 mov ax, 0123H, 此时 AX 中的内容为 0123H.
  7. CPU 从内存 20003H 处读取指令 BB 03 00, 送入 指令缓冲器, 此时 IP 再次加 3.
  8. 执行指令 BB 03 00 即 mov bx, 0003H.
  9. CPU 从内存 20006H 处读取指令 89 D8, 输入指令缓冲器. 此时 IP 值加 2.
  10. 执行指令 89 D8, 即 mov ax, bx, AX 中的内容变为 0003H.
  11. CPu 从内存 20008H 读取指令 01 D8 入指令缓冲器. IP 的值加 2 .
  12. 执行指令 01 D8, 即 add ax, bx, AX 中的内容变为 0006H.

上面这个过程可以简述为

  1. 从 CS: IP 指向的内存单元读取指令, 读取的指令进入指令缓冲器.
  2. IP = IP + 所读取指令的长度, 从而指向下一个指令的.
  3. 执行指令, 重复步骤1, 重复这个过程.

指令和数据

看完上面这个过程, 我们会发现 指令和 数据都是二进制信息,
比如 内存中二进制信息 10001001 11011000, 既可当做数据 89D8H , 也可当做指令 mov ax, bx

那么 CPU 怎么区分两者呢

处理器架构、指令集和汇编语言,三者有何关系
维基百科-汇编语言
维基百科-X86
维基百科-ARM架构
维基百科-微处理器
维基百科-寄存器

上一篇下一篇

猜你喜欢

热点阅读