微机原理学习笔记
文章目录
基础概论
硬件设备
主机系统:
- CPU
- 存储器
- 输入输出接口
- 总线
CPU
微处理器简称CPU,是计算机的核心。
主要包括:
- 运算器
- 控制器
- 寄存器组
存储器
定义:
- 计算机中的记忆装置。用于存放计算机工作过程中需要操作的数据和程序。
- 内存储器
- 特点:
- 存取速度较快,容量相对较小。
- 内存按单元组织,每单元都对应一个惟一的地址;
- 每个内存单元中存放1Byte数据;
- 内存单元个数称为内存容量。
- 特点:
- 外存储器
- 联机外存
- 硬磁盘
- 脱机外存
- 各种移动存储设备
- 联机外存
输入输出接口
接口是CPU与外部设备间的桥梁
主要功能:
- 数据缓冲寄存;
- 信号电平或类型的转换;
- 实现主机与外设间的运行匹配。
总线
- 是一组导线和相关的控制、驱动电路的集合。
- 是计算机系统各部件之间传输地址、数据和控制信息的通道
- 地址总线(AB)
- 数据总线(DB)
- 控制总线(CB)
微机的一般工作过程
计算机的工作就是按照一定的顺序,一条条地执行指令
指令
指令:
- 由人向计算机发出的、能够为计算机所识别的命令
执行步骤:
- 取指令
- 分析指令
- 读取操作数
- 执行指令
- 存放结果
并行与顺序执行
顺序执行:
- 一条指令执行完了再执行下一条指令。
并行执行:
- 同时执行两条或多条指令。
冯诺依曼计算机
冯 • 诺依曼计算机的工作原理
- 存储程序工作原理
结构特点
- 运算器为核心
特点:
- 程序存储,共享数据,顺序执行
- 属于顺序处理机,适合于确定的算法和数值数据的处理。
不足:
- 与存储器间有大量数据交互,对总线要求很高;
- 执行顺序由程序决定,对大型复杂任务较困难;
- 以运算器为核心,处理效率较低;
- 由PC控制执行顺序,难以进行真正的并行处理。
哈佛结构
- 指令和数据分别存放在两个独立的存储器模块中;
- CPU与存储器间指令和数据的传送分别采用两组独立的总线;
- 可以在一个机器周期内同时获得指令操作码和操作数。
数制
十进制到非十进制数的转换
- 对二进制的转换:
- 对整数:除2取余;
- 对小数:乘2取整。
- 对十六进制的转换:
- 对整数:除16取余;
- 对小数:乘16取整。
- 对八进制的转换:
- 对整数:除8取余;
- 对小数:乘8取整。
实例:
将十进制数48.25转换为二进制数。
将两个部分分开计算:
48 / 2 -> 结果逆序排放:110000
0.25 *2 -> 结果顺序排放: 01
结果:110000.01
编码
- 二进制
- BCD
- ASCII码
计算机中的数以及运算
定点数
定点数:
- 定点整数
- 定点小数
特点:
- 编程时需要确定小数点位置;
- 难以表示两个大小相差较大的数
- 存储空间利用率低
浮点数
浮点数:小数点的位置可以左右移动的数
有符号数
有符号数:
- 用最高位表示符号,其余是数值
0:表示正数
1:表示负数
符号数的表示方法:
- 原码
- 反码
- 补码
原码
[X]原=符号位+|绝对值|
缺点:
- 计算机中用原码进行加减运算比较困难
- 0的表示不唯一。
反码
- 若X>0 ,则 [X]反=[X]原
- 若X<0, 则 [X]反= 对应原码的符号位不变,数值部分按位求反。
数0的反码也不是唯一的。
补码
定义:
- 若X>0, 则[X]补= [X]反= [X]原
- 若X<0, 则[X]补= [X]反+1
数0的补码也是唯一的。
运算溢出判断
- 对最高位有进位,Cs = 1
- 对次高位有进位,Cp = 1
- 当两者进一个为1时,发生溢出
- Cs =1 为负溢出
- Cp =1 为正溢出
- 当两者进一个为1时,发生溢出
- 两者都为1,结果为正数
8088/8086 CPU
特点
- 采用了并行流水线工作方式
- 通过指令欲取队列实现
- 对内存空间实行分段管理
- 将内存分成4段,并且设置地址寄存器,从而达到对于1MB空间的寻址
- 支持协处理器
两种工作模式
8088/8086可工作于两种模式下
- 最小模式
- 最小模式为单处理器模式,所有控制信号由微处理器产生
- 最大模式
- 最大模式为多处理器模式,部分控制信号由外部总线控制器产生
- 用于包含协处理器的情况下
最小模式
8088最小模式下的主要引脚信号
- 完成一次访问内存或接口所需要的主要信号
- 与外部同步控制信号
- 中断请求和响应信号
- 总线保持和响应信号
内部结构
EU_执行单元
构成:
- 运算器
- 8个通用寄存器
- 1个标志寄存器
- EU部分控制电路
作用:
- 指令译码
- 指令执行
- 暂存中间运算结果
- 保存运算结果特征
BIU_总线接口单元
功能:
- 从内存中取到指令到欲取队列
- 并行流水线的基础
- 负责与内存和IO的数据传输
- 传递新的指令给EU去执行
结构:
- 指令队列
- 段寄存器
- 地址加法器
- 逻辑控制单元
8088 内部寄存器详解
- 总共14个16位寄存器
- 8个通用寄存器
- 4个段寄存器
- 2个控制寄存器
通用寄存器
数据寄存器
- AX : 累加器
- IO指令接口信息,中间运算结果
- BX : 基址寄存器
- 间接寻址存放基址
- CX : 计数寄存器
- 循环或者串操作的计数器
- DX : 数据寄存器
地址寄存器
- SP : 堆栈指针寄存器
- 栈顶的偏移地址
- BP : 基址指针寄存器
- 访问内存单元的偏移地址
BP默认在堆栈段,BX默认在数据段
变址寄存器
- SI : 源变址寄存器
- DI : 目标变址寄存器
控制寄存器
IP指针寄存器
- 用于指定下一条指令
FLAGS状态寄存器
状态标志位
- 记录计算的结果状态
标志位 | 含义 | 为 |
---|---|---|
CF | 进位标志位 | 加(减)法运算时,若最高位有进(借)位则CF=1 |
PF | 奇偶标志位 | 偶数个 |
AF | 辅助进位标志位 | 第三位对第四位有进位 |
ZF | 零标志位 | 结果为0 |
SF | 符号标志位 | 最高位为1,意思就是结果为负数 |
OF | 溢出标志位 | 当算术运算的结果超出了有符号数的可表达范围时, OF=l |
控制标志位
标志位 | 含义 |
---|---|
TF | 陷阱标志位.TF=1时,使CPU处于单步执行指令的工作方式 |
IF | 允许中断 |
DF | 串操作方向 |
段寄存器
-
CS
- 代码段寄存器,存放代码段的段基地址。
-
DS
- 数据段寄存器 ,存放数据段的段基地址。
-
ES
- 附加段寄存器,存放数据段的段基地址。
-
SS
- 堆栈段寄存器, 存放堆栈段的段基地址
实模式下存储与总线
寻址
内存分段管理思想
内存每个单元的地址在逻辑上都由两部分组成:
- 段(基)地址
- 指示存储单元在整个内存空间中处于哪个区域
- 段内地址(相对地址/偏移地址)
- 指示存储单元在段中的相对位置(与段中第1个单元的距离)
内存地址变换
物理地址=段基地址×16+偏移地址
或
物理地址=段基地址×10H+偏移地址
实例:
- 段基地址 =6000H
- 段首地址 : 60000H
- 偏移地址=0009H
- 物理地址 : 60009H
逻辑段与逻辑地址
内存的分段是逻辑分段,不是物理段。各个逻辑段在地址上可以不相连、可以部分重合,也可以完全重合。每个内存单元具有惟一物理地址,但可能具有多个逻辑地址。即:
- 一个内存单元可以同时处于两个逻辑段
- 一个内存单元可以在不同的时刻属于相同(或不同)类型的段
- 一个内存单元在同一时刻可以属于不同类型的段
实例:
已知:
CS=1055H,
DS=250AH
ES=2EF0H
SS=8FF0H
画出各段在内存中的分布。
解:
- CS=1055H
- 段首地址=10550H
- 默认段尾地址= 2054FH (加了 FFFFH)
- 段首地址=10550H
- DS=250AH
- 段首地址=250A0H
- 默认段尾地址=3509FH
- ES=2EF0H
- SS=8FF0H
堆栈的概念
堆栈:
- 内存中一个特殊区域,用于存放暂时不用或需要保护的数据。
- 常用于响应中断或子程序调用。
名词解释:
- 栈顶:堆栈指针的偏移位置
- 栈首:等于则满,堆栈段的首地址
- 栈底:等于则空,堆栈段的结尾地址
实例:
- 已知
- SS=1000H,SP=0100H
- 则:
- 堆栈段的段首地址=10000H
- 栈顶(偏移)地址=0100H
- 若该段最后一个单元地址为10200H,则:
- 栈底偏移地址=0200H
系统总线
CPU工作时序:
- CPU各引脚信号在时间上的关系
总线周期:
- CPU完成一次访问内存(或接口)操作所需要的时间。
- 一个总线周期至少包括4个时钟周期。
指令系统
指令系统概述
定义
- 指令:命令CPU完成的命令
- 指令系统:所有指令的集合
格式
操作码 [目的操作码],[源操作码]
操作数的格式
立即操作数
- 其实就是值,不是地址
- 不能作为目的操作码
寄存器操作数
- 指定寄存器存储的数据
- 最快的
存储器操作数
- 指定内存中的偏移值
- 格式最特殊,使用
[]
符号包裹住偏移量 - 运行时间最长
寻址方式
无论哪种寻址方式,得到的指令长短都取决于目标操作数
普通的立即寻址和寄存器寻址都比较简单就不赘述了
寄存器间接寻址
- 仅有通用4个寄存器可以用于存放数据的偏移地址
- BX : 数据段
- BP : 仅仅这个默认在堆栈段
- SI : 数据段
- DI : 数据段
- 一般格式
// 1200H是偏移地址,从段起始地址开始偏移1200H
MOV BX,1200H
MOV AX,[BX]
重设段
使用段名:
的方式可以重新设置段号
寄存器相对寻址
MOV AL,[BX]5
在BX的寻址上再加5
基址变址寻址
- 偏移地址为
- 一个基址 + 一个变址
- 段地址由选择的基址决定
- BX:数据
- BP:堆栈
- 必须要一个基址 + 一个变址
MOV SI,1100H
MOV BX,SI
MOV AX,[SI+BX] ;也可表示为 [BX][SI]
基址变址相对寻址
在原来的基础上加上相对,不赘述了.
常用指令
分类
从功能上可以分为六大类:
- 数据传送
- 算术运算
- 逻辑运算和位移
- 串操作
- 程序控制
- 处理器控制
数据传送类指令
通用数据传送指令
MOV
MOV AL,BL
注意点:
- 两个操作数字长必须相同
- 不允许同时为存储器操作数
- 不允许同时为段寄存器
- 当源操作数是立即数,目标操作数不能是段寄存器
- IP和CS还有FLAGS一般不作为目标操作数
堆栈操作指令
-
以字为单位
-
压栈
// OPRD:16位寄存器
PUSH OPRD
- 出栈
POP OPRD
PUSH
push指令执行过程
- SP–>SP
- 高位字节 -> SP-1
- 低位字节 -> SP
其实对堆栈本身在内存中是倒置的
操作说明:
- 操作数必须16位
- 操作数不能是立即数
- 不能从栈顶弹出一个字给CS
交换指令
XCHG
格式:
XCHG REG,MEM/REG
注意:
- 两个操作数必须有一个是寄存器操作数
- 不允许使用段寄存器
- 任何一个操作数不能为立即数
- 两个操作数长度必须相等
例子:
XCHG AX,BX ;将BX和AX寄存器的值交换
XCHG [2000],CL ;将内存中从2000位置与CL中的值交换
查表指令
XLAT
- 没有操作数
- 固定
BX
中存储表格首地址,AL
存储表内位移量 -
BX+AL
得到对应的偏移地址 - 操作:将偏移地址的内容送到AL
字位扩展指令
CBW
格式:
CBW
操作:
- 将AL内容扩展到AX
- 规则
- 如果最高位=1,则执行后
AH=FFH
- 如果最高位=0,则执行后
AH=00H
- 如果最高位=1,则执行后
CWD
CWD
操作:
- 将AX内容拓展到DX
注意:
- 将符号数的符号位扩展到高位
- 无符号数为在高位补充0
地址传送指令
LEA
作用:
- 将
变量
(属于存储器操作数)的十六位偏移地址写入到目标寄存器
格式:
LEA REG,MEM ;MEM必须是存储器操作数
例子:
MOV AL,i ;结果:AL中存入i处的内容
LEA BX,i ;结果:BX = i
标志传输指令
格式就是这样,这个不重要
输入输出指令
对于IO设备接口的基础概念
IO设备的接口也有地址的概念.
IN & OUT
格式:
IN acc,PORT ;读入,port:端口地址
OUT PORT,acc ;输出
两种寻址方式:
- 直接寻址
- 端口地址8位
- 寻址256个端口。
- 间接寻址
- 端口地址16位
- 端口地址必须有DX指定
- 可寻址64K个端口。
例子:
IN AX,80H ;从80H位的读入16bit数据到AX
MOV DX,2400H
IN AL,DX ;将2400H端口读入8bit到AL
OUT 35H,AX ;将AX的值写入到35H端口中
OUT AX,35H ;格式错误
算术运算指令
算术运算指令的执行会对状态标志位产生影响
加法运算
ADD
格式:
ADD OPRD1,OPRD2 ;OPRD1的值会变为:OPRD1+OPRD2
实例:
ADC
操作方式对于ADD
完全一样
ADC用于多字节数相加,使用前要件将CF清零
INC
作用:
- 修改地址指针
- 一次的内容为1个字节,8个bit
格式:
INC OPRD ;不能是段寄存器,不能是立即数
加法用例
- 目的:求内存数据段中M1为首和M2为首的两个20字节数之和,并将结果写入M2为首的区域中。
LEA SI,M1 ;将M1的地址给SI
LEA DI,M2 ;将M2的地址给DI
MOV CX,20 ;计数器
CLC ;是CF = 0
NEXT:MOV AL,[SI]
ADC [DI],AL ;计算
INC SI ;下一个指针
INC DI
DEC CX
JNZ NEXT ;循环
HLT
减法运算
SUB
格式:
SUB OPRD1,OPRD2
操作:
OPRD1-OPRD2 -> OPRD1
SBB
操作与SUB一致
SBB OPRD1,OPRD2
作用:
OPRD1-OPRD2-CF -> OPRD1
DEC
操作数-1
格式:
DEC OPRD
操作:
OPRD -1 -> OPRD
NEG
格式:
NEG OPRD
操作:
0-OPRD -> OPRD
对一个负数取补码相当于用0减去此数
说明:
对一个负数取补码就相当于用零减去此数
CMP
格式:
CMP OPRD1,OPRD2
操作:
OPRD1-OPRD2
作用:
CAP AX,BX
;OF和SF状态相同,AX >= BX
;OF和SF状态不同,AX < BX
;AX >= BX ,CF = 0
;AX = BX , ZF = 0
;AX < BX ,CF = 1
乘法运算
无符号(MUL)
格式:
MUL OPRD ; OPRD 不能是立即数
- 乘法采用的是隐含寻址,被乘数隐含存放在累加器AL或者AX中
- 乘法的结果会翻倍:字节 * 字节 = 16位
- OPRD是字节数
- 结果存放在
AX
- 结果存放在
- OPRD是16位数
- 结果存放在
DXAX
- 结果存放在
实例:
MUL BYTE PTR[BX]
- BYTE PTR 用于指定为字节操作数
- WORD PTR 用于指定为16位操作数
有符号(IMUL)
格式:
IMUL OPRD
原理:
- 将操作数取补码(对负数按位取反+1)
- 乘法运算
- 将乘积按位取反+1
除法运算
无符号(DIV)
格式:
DIV OPRD
有符号(IDIV)
IDIV OPRD
如果OPRD是字节数:
- 执行:AX/OPRD
- AL = 商 , AH = 余数
如果OPRD是双字节数:
- 执行:DXAX/OPRD
- AX = 商 , DX = 余数
位移指令
逻辑指令
对标志位的影响
- 除了
非
指令,其他指令都会影响AF(辅助)外的五个标志 - 无论结果如何,都会让标志位OF = CF = 0 (无进位,无溢出)
-
非
不影响标志位
AND(与)
格式:
AND OPRD1,OPRD2
操作:
- 两个操作数相
与
,结果送往目标地址
应用:
- 实现按位相与运算
AND BL,[SI]
- 让目标操作数的某些位不变,某些位为0
AND AL,OFH ;将高八位都置位0
- 将CF和OF清零
AND AX,AX
实例:
从地址3F8H端口中读入一个字节数,如果该数bit1位为1,则可以从38FH端口将DATA为首地址的一个字输出,否则就不能进行数据传送.
MOV DX,3F8H ;将地址存起来
WATT: IN AL,DX ;从端口读取
AND AL,02H ;进行与运算
JZ WATT ;ZF = 1转移,重复之前
MOV DX,38FH ;输出端口
MOV AX,DATA ;输出数据
OUT DX,AX ;进行输出
OR(或)
格式:
OR OPRD1,OPRD2
操作:
- 两个操作数相
或
,结果送往目标地址
应用:
- 和与基本一致,就是可以将某些位不变,某些位置"1"
实例:
将一个二进制数9变为字符’9’
MOV AL,9
OR AL,30H
NOT(非)
格式:
OR OPRD1,OPRD2
操作:
- 操作数按位取反返回原地址
XOR(异或)
格式:
XOR OPRD1,OPRD2
操作:
- 两操作数
异或
,结果送目标地址 - 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
TEST(测试)
格式:
TEST OPRD1,OPRD2
操作:
- 执行
与
运算,但是结果不送回目标地址
应用:
- 长用于测试某些位的状态
串操作指令
说明
本质上是多个单操作数
在串操作指令执行之前需要确定:
- 串所在的区域
- 串的首地址
- 串的长度
- 串的控制方向
要求
- 串所在区域以及首地址
- 源串一般存放在数据段,偏移地址由SI指定.允许段重设
- 目标串必须在附加段,偏移地址由DI指定
- 串长度
- 有CX指定
- 串操作方向
- 有DF标志位指定.
- 0 ->增地址方向
- 1 ->减地址方向
- 有DF标志位指定.
重复前缀
- 无条件重复:
REP
- 直到CX等于0才停止
- 条件重复
- 相等结束(寻找关键字)
REPNZ
- 不相等结束(比较字符串)
REPZ
- 相等结束(寻找关键字)
串操作指令的流程
简述:
- 取数值
- 操作一个单位
- 修改地址值
- 修改串长
- 判断
最终结果:
串指令结束之后,地址实际上会指向判定点的后一位!
串传送指令
MOVS
格式:
MOVS OPRD1,OPRD2 ;此格式仅用于源操作数虚段重设的情况下
MOVSB ;按字节传输
MOVSW ;按字传送
- 通常与无条件重复前缀连用
实例:
题目:使用MOVS指令将两百个字节数据从MEM1
为首的地址区域传送到MEM2
为首地址的区域内
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB ;这句话就可以完成功能
HLT
串比较指令
CMPS
格式:
CMPS OPRD1,OPRD2
CMPSB
CMPSW
功能:
- 实现两个数据串的比较
实例:
测试上传的200个字节是否正确
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REPE CMPSB ;当CX=0或者ZF=0(就是不相等)
JZ STOP ;两个串相等就stop
DEC SI ;指向不相等数据的地址
MOV AL,[SI] ;获取对应的值
MOV BX,SI ;获取地址
STOP :HLT
串扫描指令
SCAS
格式:
SCAS OPRD ;目标操作数
SCASB ;源操作数AL
SCASW ;源操作数AX
作用:
用于指定存储区域中寻找某个关键字
实例:
在ES段中从2000H单元开始存放了10个字符,寻找其中有无字符’A’.如果有则记录下搜索次数,将搜索次数写到DATA1单元,并将存放’A’的地址写入DATA2单元.
MOV DI,2000H
MOV BX,DI
MOV CX,0AH
MOV AL,'A'
REPNZ SCANSB ;遇到不相等的就循环
串装入和存储指令
LODS
格式:
LODS OPRD
LODSB
LODSW
作用:
-
对字节:AL <- [DS:SI]
-
对字 : AX <- [DS:SI]
-
用于将数据传依次装入累加器,以便显示和输出到接口
-
一般不加前缀
STOS
格式:
STOS OPRD
STOSB
STOSW
操作:
- 字节:AL -> [ES:DI]
- 字:AX -> [ES:DI]
- 常常用于将内存某个区域置为同样的值
实例:
将6000H:1200H单元开始的l00个字存储单元内容清零。
MOV AX,6000H
MOV ES,AX
M0V DI,1200H
M0V CX,100
CLD
M0V AX,0
REP STOSW
HLT
串操作注意事项
-
需要定义附加段
- 目标操作数必须在附加段
-
需要设置数据的操作方向
- 确定DF的状态
-
源串和目标串指针分别为SI和DI
-
串长度值必须由CX给出
- 注意重复前缀的使用方法
- 传送类指令前加无条件重复前缀
- 串比较类指令前加条件重复前缀,但前缀不影响ZF状态
- 注意重复前缀的使用方法
程序控制指令
工作原理
- 修改PC(程序计数器)和CS(代码段),从而达到目的
转移指令
无条件转移(JMP)
有两种:
-
不同字长需要指定
-
段间转移
- 32位操作数
- 只能间接寻址
-
段内转移
- 16位操作数
- 可以直接也可以间接
段内实例:
MOV BX,1200
JMP WORD PTR[BX]
段间实例:
MOV SI,1122H ;SI得到地址
MOV WORD PRT[SI],0120H ;从SI内地址的内存段开始存入一个16位0120H
ADD SI,2 ;SI内地址向前16位
MOV WORD PTR[SI],0122H ;从SI内地址的内存段开始存入一个16位0122H
JMP DWORD PTR[SI-2] ;跳转到0120H:0122H的地方
有条件转移
- 条件转移均为段内短地址转移
- 范围为:-128 — +127
指令名称 | 汇编格式 | 转移条件 | 备注 |
---|---|---|---|
CX内容为0转移 | JCXZ | target | CX=0 |
大于/不小于等于转移 | JG/JNLE | target | SF=OF且ZF=0 |
大于等于/不小于转移 | JGE/JNL | target | SF=OF |
小于/不大于等于转移 | JL/JNGE | target | SF≠OF且ZF=0 |
小于等于/不大于转移 | JLE/JNG | target | SF≠OF |
溢出转移 | JO | target | 0F=1 |
不溢出转移 | JNO | target | 0F=0 |
结果为负转移 | JS | target | SF=1 |
结果为正转移 | JNS | target | SF=0 |
高于/不低于等于转移 | JA/JNBE | target | CF=0且ZF=0 |
高于等于/不低于转移 | JAE/JNB | target | CF=0 |
低于/不高于等于转移 | JB/JNAE | target | CF=1 |
低于等于/不高于转移 | JBE/JNA | target | CF=1或ZF=1 |
进位转移 | JC | target | CF=1 |
无进位转移 | JNC | target | CF=0 |
等于或为零转移 | JE/JZ | target | ZF=1 |
不等于或非零转移 | JNE/JNZ | target | ZF=0 |
奇偶校验为偶转移 | JP/JPE | target | PF=1 |
奇偶校验为奇转移 | JNP/JPO | target | PF=0 |
实例:
统计内存数据段中意TABLE为首地址的100个8位带符号数中正数,负数和零元数的个数
基本思路:
- 先将存放统计值的单元(或寄存器)清零
- 读取一个数,通过标志位的状态判断数的性质
- 最高位是1,则是负数
- 最高位是0,则是正数或0
- 再判断是否为0
代码:
START: XOR AL,AL ;将AL本身清零
MOV PLUS,AL ;清零
MOV MINUS,AL ;清零
MOV ZERO,AL ;清零
LEA SI,TABLE ;记录地址
MOV CL,100 ;记录长度
CLD
CHECK: LODSB ;将SI处数据读入AL
OR AL,AL ;将自己的数值特征输入符号标志位中
JS X1 ;如果SI为1,说明是负数
JZ X2 ;说明是0
INC PLUS ;说明是正数,正数计数+1
JMP NEXT ;跳转到下一个
X1: INC MINUS
JMP NEXT
X2: INC ZERO
NEXT: DEC CL ;计数器-1
JNZ CHECK ;非零跳转
HLT
循环控制
- 循环范围
- 以当前IP为中心的-128-+127之间内循环
- 循环次数有CX指定
- 循环指令
-
LOOP
-> 无条件循环 -
LOOPZ
-> 条件循环 -
LOOPNZ
-> 条件循环
-
无条件
格式:
LOOP LABEL
循环条件:
- CX != 0
指令作用:
- 跳转并将CX-1
条件循环
和无条件基本一致,多了判断ZF的值
实例
在以DATA为首地址的内存数据段中,存放有200个16位的有符号数,试找出其中最大和最小的符号数,并分别放在MAX和MIN为首的内存单元内
START: LEA SI,DATA ;得到数据地址
MOV CX,200 ;标记长度
CLD ;指定串扫描的方向
LODSW ;读取数据地址的数据
MOV MAX,AX ;将AX设置为MAX
MOV MIN,AX ;将AX设置为MIN
DEC CX ;减长度
NEXT: LODSW ;串读取数据
CMP AX,MAX ;比较
JG LARGE ;大于跳转
CMP AX,MIN ;比较
JL SMALL ;小于跳转
JMP GOON ;直接跳转
LARGE: MOV MAX,AX ;有更大的处理
JMP GOON
SMALL: MOV MIN,AX ;有更小的处理
GOON: LOOP NEXT ;跳转下次循环
HLT
过程调用
作用:
- 用于调用一个子程序
与转移指令的比较:
- 子过程调用执行结束后,要返回原调用处
- 必须保护返回地址
调用指令的执行过程:
- 保护断点
- 将调用指令的下一条指令的地址压入堆栈
- 获取子过程的入口地址
- 执行子过程
- 恢复断点,返回原程序
段内调用
被调用程序与调用程序在同一代码段
格式:
CALL NEAR PROCC ; NEAR可以省略
实例:
CALL TIMER ;直接调用
CALL WORD RPT[SI] ;间接调用
段间调用
子过程与原调用程序不在同一个代码段
实例:
CALL FAR TIMRE ; 直接调用,FAR不能省略
CALL DWORD PTR[SI] ; 间接调用,需要指定类型
返回指令
功能:
- 从堆栈中着弹出断点地址,返回原程序
格式:
RET
子程序最后一条指令必须是RET
中断指令
复习中断的概念
中断的概念
- 由于某种异常或者随机事件是处理器暂时停止正在运行的程序转去执行一段特殊处理程序,处理好后返回原程序.
中断指令:
- 引起CPU产生一次中断的指令
中断与过程调用
- 相似点
- 都是从一个过程转到另一个过程并且返回
- 区别
- 中断是随机或者异常事件,调用是事先写好的程序
- 调用直接给出子程序入口地址,中断只给出中断响亮码
- 调用可以是近过程也可以是远过程,但是中断均为远过程
- 响应中断请求不仅要保护断点地址,还要保护FLAGS内容(用于分析出错原因)
中断指令
格式:
INT n ; n为中断类型码:0-255
说明:
- 偏移地址: n * 4
- 段地址:DS_数据段
执行过程:
- 将
FLAGS
压入堆栈 - 将INT指令的下一条指令的CS,IP入栈
- 有
4*n
得到存放中断向量的地址 - 将中断向量送CS和IP寄存器
- 转入中断程序
中断返回指令
格式:
IRET ; 负责恢复断点和恢复标志寄存器的内容
处理器控制指令
这类指令用来对CPU进行控制,入修改标志寄存器,让CPU暂停等
标志位操作指令
格式 | 作用 |
---|---|
CLC (CL置为0) | 进位标志位 |
STC(ST置为1) | |
CMC(CM取反) | |
CLD | 方向标志位 |
STD | |
CLI | 中断标志位(这个为关中断) |
STI |
汇编程序设计
汇编源程序
- 汇编源程序 : 使用助记符编写的程序
- 汇编程序 : 对汇编源程序进行编译
编译过程:
汇编语言类型和格式
汇编语句可以分为两类:
- 指令性语句:CPU能够执行
[标号:] [前缀] 助记符 [操作数],[操作数] [ ;注释]
- 指示性语句:CPU不执行,有汇编程序执行
[名字] 伪指令助记符 操作数 [,操作数,…] [ ;注释]
操作数
-
寄存器
-
存储器单元
-
常量
-
变量或标号
-
表达式
常量
- 数字常量
- 字符串常量
- 用单引号包起来的字符或者字符串
例子:
MOV AL,'A' ;
MOV [DI],'ABCD' ; 存储相对应的ASCII码
变量
- 其实就代表内存中的地址
- 属性
- 段
- 偏移量
- 类型
- 字节 byte
- 字型 word
- 双字型 dword
表达式
取值运算
作用:
- 获取变量的属性值
伪指令:
- OFFSET
- 取偏移地址
- SEG
- 取段地址
例子:
MOV AX,SEG DATA ;取到DATA的段地址给AX
MOV DS,AX ;将地址信息给数据段寄存器
MOV BX,OFFSET DATA ;将DATA的偏移地址存入到BX
;上面一句与 LEA BX,DATA 等价
属性运算
作用:
- 指定存储器操作数的类型
运算符:
PTR
例子:
MOV BYTE PTR[BX],12H ;指定为字节型
汇编伪指令
数据定义
- DB(Define Byte):
- 定义的变量为字节型
- DW (Define Word) :
- 定义的变量为字类型
- DD (Define Double Word) :
- 定义的变量为双字型
- DQ (Define Quadword) :
- 定义的变量为4字型
- DT (Define Tenbytes) :
- 定义的变量为10字节型
实例:
DATA1 DB 11H,22H,33H,44H ;但是每个只能占用为一个Byte
内存中数据分布:
说明:
- 定义字符串必须使用DB伪指令
DATA1 DB 'ABCD',66H
内存中数据分布:
重复操作符
用于多次重复数据定义
格式:
[变量名] 伪指令助记符 n DUP(初值 [,初值,… ] );n为重复次数
例子:
M1 DB 10 DUP (0) ;括号中有多个数据的话,多个数据都会重复定义n次
?
的作用
用于表示随机值,用于预留存储空间
例子:
MEM1 DB 34H,'A',?
DW 20 DUP (?) ;预留40个字节单元,每单元为随机值
调整偏移量指令
格式:
ORG 表达式 ;计算值为非负常数
例子:
DATA SEGMENT
ORG 1200H
BUFF DB 1,2
DATA ENDS
符号伪指令
作用:
- 将表达式的值赋给一个名字。当源程序中需多次引用某一表达式时,可以利用EQU伪指令,用一个符号代替表达式,以便于程序维护。
说明:
- EQU说明的表达式不占用内存空间
例子:
CONSTANT EQU 100 ; 以后使用CANSTANT就是100
段伪指令
段定义
格式:
段名 SEGMENT [定位类型] [组合类型] [’类别’]
...
段名 ENDS
实例:
DATA SEGMENT ;这里一个典型的数据定义段
MEM1 DB 11H,22H
MEM2 DB ‘Hello!’
MEM3 DW 2 DUP(?)
DATA ENDS
段指定
说明所定义逻辑段的性质
格式:
ASSUME 段寄存器名:段名[,段寄存器名:段名,…]
实例:
ASSUME DS:DATA ; 说明DATA在数据段
结束
表示源程序结束
格式:
END [标号]
其他伪指令
过程定义
作用:
用于定义一个过程体
格式:
PROCNAME PROC
...
PROCNAME ENDP
等待程序实例:
DELAY PROC
PUSH BX ;保护需要使用的寄存器信息
PUSH CX
MOV BL,2 ;BL存储循环执行次数
NEXT:MOV CX,4167 ;为无条件循环赋值
W10M: LOOP W10M
DEC BL;BL-1
JNZ NEXT ;非零跳转
POP CX ;将数据取出来
POP BX
RET
DELAY ENDP
CALL DELAY ; 调用
宏定义
作用:
-
源程序中由汇编程序识别的具有独立功能的一段程序代码
-
当 源程序中需要多次使用同一个程序段时,可以将该程序段定义为一个宏
格式:
宏命令名 MACRO <形式参数> ;形参:通过参数传递调用宏
...
ENDM
;定义
DADD MACRO X,Y,Z
MOV AX,X
ADD AX,Y
MOV Z,AX
ENDM
;调用
DADD DATA1,DATA2,SUM
;汇编后源程序中的宏展开
MOV AX,DATA1
ADD AX,DATA2
MOV SUM,AX
系统调用
系统调用分类
- BIOS
- 驻留在ROM中的基本输入/输出系统
- DOS
- 磁盘操作系统
DOS功能/BIOS功能调用是调用系统内核子程序
DOS功能与BIOS功能均通过中断方式调用
DOS软中断
DOS中断包括:设备管理,目录管理,文件管理,其它
DOS软中断: 类型码为 21H
关于DOS软中断说明:
- 包含多个子功能的功能包;
- 各子功能用功能号区分;
- 用软中断指令调用,中断类型码固定为21H。
调用基本步骤:
- 将调用参数装入指定的寄存器;
- 将功能号装入AH; 按中断类型号调用DOS中断;
- 检查返回参数是否正确。
- 调用格式:
MOV AH,功能号
<置相应参数>
INT 21H
字符输入
单字符输入
格式:
MOV AH,01
INT 21H
- 输入的字符在AL中
字符串输入
接收一串字符
用户自定义缓冲区,格式:
功能号:
- 10
说明:
- 缓存区必须在数据段
实例:
DATA1 DB 20,?,20 DUP(?) ;第一个20个字符最大,?实际输入字符,DUP真正的缓冲区
...
LEA DX,DAT1
MOV AH,0AH
INT 21H
字符输出
单字符
功能号:
- 2
- 由AH接收
输出字符:
- 由DL接收
例子:
MOV AH,2
MOV DL,41H
INT 21H ; 输出A到屏幕上
字符串
AH :功能号09H
DS:DX
待输出字符串的偏移地址
注意点:
- 被显示的字符串必须以‘$’结束;
- 所显示的内容不应出现非可见的ASCII码;
- 若考虑输出格式需要,在定义字符串后,加上回车符和换行符。
DATA SEGMENT
MESS1 DB ‘Input String:’, 0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
┇
MOV AH,09
MOV DX,OFFSET MESS1
INT 21H
返回DOS
功能号:
- 4CH
调用格式:
MOV AH,4CH
INT 21H
功能:
- 程序执行完该2条语句后能正常返回OS
- 常位于程序结尾处。
汇编语言程序设计实例
数据存储
以下数据区在内存中是如何存储的?
DATA SEGMENT
NAMES DB ‘TOM..’,20
DB ‘CATE’,25
DATA ENDS
输出字符串
阅读程序段,说明该程序段的功能
DATA SEGMENT
A DB ‘123ABC’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA BX,A
MOV CX,6
LP:MOV AH,2
MOV AL,[BX]
XCHG AL,DL
INC BX
INT 21H
LOOP LP
MOV AH,4CH
INT 21H
CODE ENDS
END START
原文地址:https://blog.csdn.net/qq_41259552/article/details/103291027