文章目录
- 前言
- 机器语言与机器指令
- 汇编语言与汇编指令
- 用汇编语言编写程序的工作过程
- 注意事项
- 计算机组成
- 指令和数据的表示
- 计算机中的存储单元
- 计算机中的总线
- 三类总线
- X86 CPU性能一览
- CPU对存储器的读写
- 内存地址空间
- 将各类存储器看作一个逻辑存储器 —— 统一编址
- 内存地址空间的分配方案 —— 以8086 PC机为例
- 寄存器及数据存储
- CPU的组成
- 寄存器是CPU内部的信息存储单元
- 通用寄存器 —— 以AX为例
- "字" 在存储器中的存储
- mov和add指令
- 学习汇编指令 —— 用中学
- 写出汇编指令执行的结果(1)
- 写出汇编指令执行的结果(2)
- 确定物理地址的方法
- 物理地址
前言
开始学习汇编语言,学习的B站课程链接:https://www.bilibili.com/video/BV1Wu411B72F?spm_id_from=333.788.videopod.episodes&vd_source=737c6257f76c5f1bba2796b3bf263fad&p=3
参考书是王爽老师的《汇编语言第3版)
提示:以下是本篇文章正文内容,下面案例可供参考
机器语言与机器指令
- 机器语言是机器指令的集合;
- 机器指令是一台机器可以正确执行的命令;
- 机器指令由一串二进制数表示,例:01010000
- 电平脉冲
汇编语言与汇编指令
- 汇编语言的主体s是汇编指令
- 汇编指令和机器指令的差别在于指令的表示方法上
- 汇编指令是机器指令便于记忆的书写格式
- 汇编指令是机器指令的助记符
操作:将寄存器BX的内容送到AX中
机器指令:1000100111011000
汇编指令:MOV AX, BX
用汇编语言编写程序的工作过程
汇编语言程序示例
assume cs : codesg # 告诉汇编器 CS(代码段寄存器)应该指向 codesg 段
codesg segment
start:mov ax, 0123H # 将 0123H 装载到寄存器 AXmov bx, 0456H # 将 0456H 装载到寄存器 BXadd ax, bx # 将 AX 和 BX 中的值相加,结果存储在 AX 中add ax, ax # 再次将 AX 加上它自己(即 AX = AX + AX)mov ax, 4c00H # 设置 AX 为 4C00H, 这是 DOS 的终止函数调用int 21H # 调用中断 int 21H 来执行 DOS 功能
codesg ends
end
注意事项
- DOS 中断:int 21H 是一个常见的 DOS 中断,用于调用各种 DOS 功能。AH=4Ch 表示程序终止功能,AL中的内容作为返回码给操作系统。
- 假设指令:assume cs : codesg 告诉汇编器 CS(代码段寄存器)应该指向 codesg 段;
计算机组成
CPU是计算机的核心部件,它控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向它提供指令和数据;
指令和数据在存储器(内存)中存放,离开内存,性能再好的CPU也无法工作;
指令和数据的表示
计算机中的数据和指令,存储在内存或磁盘上;
数据和指令,都是二进制信息;
问题:二进制信息1000100111011000是数据,还是指令
- 1000100111011000 -> 89D8H(数据)
- 1000100111011000 -> MOV AX, BX(指令)
计算机中的存储单元
存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号;
计算机中的总线
在计算机中专门有连接CPU和其他芯片的导线,通常称为总线;
- 物理上:一根根导线的集合;
- 逻辑上划分为:
- 地址总线
- 数据总线
- 控制总线
三类总线
地址总线:
- CPU是通过地址总线来指定存储单元的;
- 地址总线宽度决定了可寻址的存储单元大小;
- N根地址总线(宽度为N),对应寻址空间 2^N
数据总线:
- CPU与内存或其他器件之间的数据传送是通过数据总线来进行的;
- 数据总线的宽度决定了CPU和外界的数据传输速度;
例:向内存中写入数据89D8H时的数据传输
控制总线:
- CPU通过控制总线对外部器件进行控制;
- 控制总线是一些不同控制线的集合;
- 控制总线宽度决定了CPU对外部器件的控制能力;
X86 CPU性能一览
CPU | 地址总线宽度 | 寻址能力 | 数据总线宽度 | 一次传送数据 | 读取1KB数据要读的次数 |
---|---|---|---|---|---|
8080 | 16 | 64KB | 8 | 1B | 1024 |
8088 | 20 | 1MB | 8 | 1B | 1024 |
8086 | 20 | 1MB | 16 | 2B | 512 |
80286 | 24 | 16MB | 16 | 2B | 512 |
80386 | 32 | 4GB | 32 | 4B | 256 |
CPU对存储器的读写
CPU要想进行数据的读写,必须和外部器件进行三类信息的交互:
- 存储单元的地址(地址信息)
- 器件的选择,读或写命令(控制信息)
- 读或写的数据(数据信息)
演示:
机器码:1010 0000 0000 0011 0000 0000
16进制:A00300
汇编指令:MOV AL, [3]
含义:从3号单元读取数据送入寄存器AL
内存地址空间
- CPU地址总线宽度为N,寻址空间为 (2^N) B
- 8086CPU的地址总线宽度为20,那么可以寻址1MB个内存单元,其内存地址空间为1MB
从CPU角度看地址空间分配
- RAM
- 主板上的RAM
- 扩展槽上的RAM(例显卡)
- ROM
- 系统BIOS
- 接口卡上的BIOS
将各类存储器看作一个逻辑存储器 —— 统一编址
所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器;
每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间;
CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据;
内存地址空间的分配方案 —— 以8086 PC机为例
寄存器及数据存储
CPU的组成
寄存器是CPU内部的信息存储单元
8086 CPU有14个存储器:
- 通用寄存器:AX、BX、CX、DX
- 变址寄存器:SI、DI
- 指针寄存器:SP、BP
- 指令指针寄存器:IP
- 段寄存器:CS、SS、DS、ES
- 标志寄存器:PSW
共性:
- 8086 CPU所有的寄存器都是16位的,可以存放两个子节;
通用寄存器 —— 以AX为例
一个16位寄存器存储一个16位的数据
问题:8086上一代CPU中的寄存器都是8位的,如何保证程序的兼容性
方案:通用寄存器均可以分为两个独立的8位寄存器使用
细化:
- AX可以分为AH和AL
- BX可以分为BH和BL
- CX可以分为CH和CL
- DX可以分为DH和DL
寄存器 | 寄存器中的数据 | 所表示的值 |
---|---|---|
AX | 010011100010000 | 20000(4F20H) |
AH | 01001110 | 78(4EH) |
AL | 00100000 | 32(20H) |
“字” 在存储器中的存储
8086是16位CPU
- 8086的字长为16bit
一个字可以存在一个16位寄存器中
- 这个字的高位字节存在这个寄存器的高8位寄存器
- 这个字的低位字节存在这个寄存器的低8位寄存器
mov和add指令
学习汇编指令 —— 用中学
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
---|---|---|
mov AX, 18 | 将18送入AX | AX = 18 |
mov AH, 78 | 将78送入AH | AH = 78 |
add AX, 8 | 将寄存器AX中的数值加上8 | AX = AX + 8 |
mov AX, BX | 将寄存器BX中的数据送入寄存器AX | AX = BX |
add AX, BX | 将AX, BX中的内容相加,结果存在AX中 | AX = AX + BX |
注:汇编指令不区分大小写
写出汇编指令执行的结果(1)
假设原AX、BX中的值均为0000H
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
---|---|---|
mov AX, 4E20H | 4E20H | 0000H |
add AX, 1406H | 6226H | 0000H |
mov BX, 2000H | 6226H | 2000H |
add AX, BX | 8226H | 2000H |
mov BX, AX | 8226H | 8226H |
add AX, BX | 044CH(最高位溢出) | 8226H |
写出汇编指令执行的结果(2)
假设原AX、BX中的值均为0000H
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
---|---|---|
mov AX, 001AH | 001AH | 0000H |
mov BX, 0026H | 001AH | 0026H |
add AL, BL | 0040H | 0026H |
add AH, BL | 2640H | 0026H |
add BH, AL | 2640H | 4026H |
mov AH, 0 | 0040H | 4026H |
add AH, 85H | 00C5H | 4026H |
add AL, 93H | 0058H | 4026H |
确定物理地址的方法
物理地址
CPU访问内存单元时要给出内存单元的地址