文章目录
微机概述
- 计算机由运算器、控制器、存储器、输入设备和输出设备5个基本部分组成。
- 微型计算机总线系统:
数据总线 DB(双向) 、控制总线 CB(双向)、地址总线 AB(单向); - 8086/8088CPU内部结构按照功能划分:
包括总线接口部分BIU和执行部分EU。
BIU负责CPU与存储器,,输入/输出设备之间的数据传送,包括取指令、存储器读写、和I/O读写等操作。 EU部分负责指令的执行。
8086/8088CPU内部寄存器
8086/8088CPU内部共有14个16位寄存器,通用寄存器(8个)、段寄存器(4个)、控制寄存器(2个)。
1、通用寄存器
- 数据寄存器(AX、BX、CX、DX)
8088/8086含4个16位数据寄存器,它们又可分为8个8位寄存器,即:AX->AH、AL BX->BH、BL CX->CH、CL DX->DH、DL
AX:累加器。所有I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中;
BX:基址寄存器。在间接寻址中用于存放基地址;
CX:计数寄存器。用于在循环或串操作指令中存放计数值;
DX:数据寄存器。在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数。 - 地址指针寄存器(SP、BP)
SP:堆栈指针寄存器,其内容为栈顶的偏移地址;
BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。 - 变址寄存器(SI、DI)
SI:源变址寄存器
DI:目标变址寄存器
变址寄存器在指令中常用于存放数据在内存中的地址。
注意:
BX与BP在应用上的区别:
- 作为通用寄存器,二者均可用于存放数据;
- 作为基址寄存器,用BX表示所寻找的数据在数据段;用BP则表示数据在堆栈段。
2、段寄存器
8088/8088采用将地址空间分段的方法。
内存每个单元的地址在逻辑上都由两部分组成:
段(基)地址:指示存储单元在整个内存空间中处于哪个区域
段内地址(相对地址/偏移地址):指示存储单元在段中的相对位置(与段中第1个单元的距离)
物理地址 = 段地址 * 16 + 段内偏移
- CS
代码段寄存器,存放代码段的段基地址 - DS
数据段寄存器 ,存放数据段的段基地址
ES - 附加段寄存器,存放数据段的段基地址
- SS
堆栈段寄存器, 存放堆栈段的段基地址
3、控制寄存器IP、FLAGS
FLAGS称为标志寄存器或程序状态字,是16位寄存器,其中使用的是9位,包括6个状态标志和3个控制标志。
状态标志位:
- CF(Carry Flag)
进位标志位。加(减)法运算时,若最高位有进(借)位则CF=1 - OF(Overflow Flag)
溢出标志位。当算术运算的结果超出了有符号数的可表达范围时,OF=l - ZF(Zero Flag)
零标志位。当运算结果为零时ZF=1 - SF(Sign Flag)
符号标志位。当运算结果的最高位为1时,SF=l - PF(Parity Flag)
奇偶标志位。运算结果的低8位中“1”的个数为偶数时PF=l - AF(Auxiliary Carry Flag)
辅助进位标志位。加(减)操作中,若Bit3向Bit4有进位(借位),AF=1
AF和PF仅针对低8位
控制标志位:
- TF(Trap Flag)
陷井标志位,也叫跟踪标志位。TF=1时,使CPU处于单步执行指令的工作方式。 - IF(Interrupt Enable Flag)
中断允许标志位。IF=1使CPU可以响应可屏蔽中断请求。 - DF(Direction Flag)
方向标志位。在数据串操作时确定操作的方向。
寻址方式
立即寻址
操作数在指令中,紧跟在操作码之后,这样的操作数成为立即数,可以是8bit或者16bit。
例如:
MOV AL,12H
MOV AX,1234H
寄存器寻址
寄存器寻址:操作数在CPU寄存器中,指令中指定寄存器编号
MOV SI, AX
MOV AL, AH
直接寻址
直接寻址:操作数在存储器中,指令直接包含操作数的有效地址。此时操作数一般存放在数据段DS中,采用换段前缀可以使用其它段寄存器。
MOV AX, [1234H]
寄存器间接寻址
寄存器间接寻址:操作数在存储器中,操作数有效地址在SI、DI、BX、BP之一种。在不使用换段前缀的情况下,若有效地址在SI/DI/BX中,则以DS的值为段值;若有效地址在BP中,则以段寄存器SS的值为段值。
MOV AX, [SI]
MOV [BP], CX
寄存器相对寻址
寄存器相对寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)内容加上指令中给定的8位或16位位移量之和。即:EA = (BX/BP/SI/DI) + (8/16位位移量)
在不使用换段前缀的情况下,若SI/DI/BX的内容作为有效地址的一部分,则以DS的值为段值;若BP的内容作为有效地址的一部分,则以段寄存器SS的值为段值。
在指令中给定的8位或16位位移量以补码形式表示。在计算有效地址时,若位移量是8位,则将其有符号扩展为16位,当有效地址超过FFFFH,则对其进行64K取模。
MOV AX,[DI+1233H]
基址、变址寻址
操作数的偏移地址为:
一个基址寄存器的内容 + 一个变址寄存器的内容;
操作数的段地址由选择的基址寄存器决定:
基址寄存器为BX,默认在数据段
基址寄存器为BP,默认在堆栈段
基址变址寻址方式与相对寻址方式一样,主要用于一维数组操作。
MOV SI,1100H
MOV BP,SI
MOV AX,[SI+BP]
基址、变址、相对寻址
操作数的偏移地址为:
基址寄存器内容+变址寄存器内容+位移量
操作数的段地址由选择的基址寄存器决定
基址变址相对寻址方式主要用于二维表格操作。
MOV DI,1100H
MOV BP,DI
MOV AL,[BP][DI]5
隐含寻址
指令中隐含了一个或两个操作数的地址,即操作数在默认的地址中。
MUL BL //AL×BL--> AX
指令系统
指令中包含的信息
- 运算数据的来源
- 运算结果的去向
- 执行的操作
指令格式: - 零操作数指令: 操作码
- 单操作数指令: 操作码 操作数
- 双操作数指令: 操作码 操作数,操作数
- 多操作数指令: 三操作数及以上
数据传送指令
1.通用数据传送
1)一般数据传送指令MOV
MOV dest,src //src-->dest
- 两操作数字长必须相同;
- 两操作数不允许同时为存储器操作数;
- 两操作数不允许同时为段寄存器;
- 在源操作数是立即数时,目标操作数不能是段寄存器;
- IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。
2)堆栈操作指令
堆栈操作的原则:
- 先进后出
- 以字为单位
压栈指令
- 格式: PUSH OPRD
- 指令执行过程:
SP - 2 → SP
操作数高字节 → SP+1
操作数低字节 → SP
出栈指令
- 格式: POP OPRD
- 指令执行过程:
SP → 操作数低字节
SP+1 → 操作数高字节
SP ← SP+2
- 指令的操作数必须是16位;
- 操作数可以是寄存器或存储器两单元,但不能是立即数;
- 不能从栈顶弹出一个字给CS;
- PUSH和POP指令在程序中一般成对出现;
- PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反。
3) 交换与查表指令
格式:
XCHG REG,MEM/REG
注:
- 两操作数必须有一个是寄存器操作数
- 不允许使用段寄存器。
例:
XCHG AX,BX
XCHG [2000],CL
4)字位扩展指令
字节到字的扩展指令
- 格式:
CBW - 操作:
将AL内容扩展到AX - 规则:
若最高位=1,则执行后AH=FFH
若最高位=0,则执行后AH=00H
字到双字的扩展指令
- 格式:
CWD - 操作:
将AX内容扩展到DX AX - 规则:
若最高位=1,则执行后DX=FFFFH
若最高位=0,则执行后DX=0000H
2.输入输出
专门面向I/O端口操作的指令
指令格式:
- 输入指令: IN acc,PORT
- 输出指令 :OUT PORT,acc
根据端口地址码的长度,指令具有两种不同的端口地址表现形式。
- 直接寻址
端口地址为8位时,指令中直接给出8位端口地址;
寻址256个端口,端口地址范围:0000H-00FFH。 - 间接寻址
端口地址为16位时,指令中的端口地址必须由DX指定;
可寻址64K个端口,端口地址范围:0000H-FFFFH 。
IN AX,80H ;从80H端口读入16bit数据到AX
MOV DX,2400H
IN AL,DX ;从2400H端口读入8bit数据到AL
OUT 35H ,AX ;将AX的值写入到35H端口中
OUT AX,35H ×
IN 35H,AX ×
3.地址传送
取偏移地址指令LEA
- 操作:
将变量的16位偏移地址取出送目标寄存器
当程序中用符号表示内存偏移地址时,须使用该指令。 - 格式:
LEA REG,MEM - 指令要求:
源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。
算术运算类指令
1.加法指令
1)ADD指令
- 格式:
ADD OPRD1,OPRD2 - 操作:
OPRD1+OPRD2 → OPRD1
ADD指令的执行对全部6个状态标志位都产生影响
2)ADC指令
- 指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样
- 指令的操作:
OPRD1+OPRD2+CF - ADC指令多用于多字节数相加,使用前要先将CF清零。
3)INC指令
- 格式:
INC OPRD - 操作:
OPRD+1 → OPRD - 常用于在程序中修改地址指针
2.减法指令
1)SUB指令
- 格式:
SUB OPRD1,OPRD2 - 操作:
OPRD1- OPRD2 → OPRD1 - 对标志位的影响与ADD指令同
2)SBB指令
- 指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样
- 指令的操作:
OPRD1- OPRD2- CF → OPRD1
3)DEC指令
- 格式:
DEC OPRD - 操作:
OPRD - 1 → OPRD - 指令对操作数的要求与INC相同
指令常用于在程序中修改计数值
4)NEG指令
- 格式:
NEG OPRD - 操作:
0 - OPRD - 用0减去操作数,相当于对该操作数求补码
5)CMP指令
- 格式:
CMP OPRD1,OPRD2 - 操作:
OPRD1- OPRD2 - 指令执行的结果不影响目标操作数,仅影响标志位!
- 用途:
用于比较两个数的大小,可作为条件转移指令转移的条件 - 指令对操作数的要求及对标志位的影响与SUB指令相同
3.乘法指令
注:乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX
1)无符号的乘法指令MUL
- 格式:
MUL OPRD(不能是立即数) - 操作:
OPRD为字节数:AL×OPRD → AX
OPRD为16位数:AX×OPRD → DX AX
2)带符号的乘法指令IMUL - 格式:
IMUL OPRD - 指令格式及对操作数的要求与MUL指令相同。
- 指令执行原理:
- 将两个操作数取补码(对负数按位取反加1,正数不变);
- 做乘法运算;
- 将乘积按位取反加1。
4.除法指令
1)无符号除法指令
-
格式:
DIV OPRD -
若OPRD是字节数
执行:AX/OPRD
结果:
AL=商 AH=余数 -
若OPRD是双字节数
执行: DXAX/OPRD
结果:
AX=商 DX=余数
2)有符号除法指令
格式:
IDIV OPRD
逻辑运算
- 逻辑运算指令对 操作数的要求大多与MOV指令相同。
- “非”运算指令要求操作数不能是立即数;
- 除“非”运算指令外:
其余指令的执行都会影响除AF 外的5个状态标志;
无论执行结果任何,都会使标志位OF=CF=0。
1)逻辑与指令:AND DST, SRC
执行操作: (DST) ← (DST) ∧ (SRC)
- 应用:
1.实现两操作数按位相与的运算
AND BL,[SI]
2.使目标操作数的某些位不变,某些位清零
AND AL,0FH
3.在操作数不变的 情况下使CF和OF清零
AND AX,AX
2)逻辑或指令:OR DST, SRC
执行操作: (DST) ← (DST)∨(SRC)
- 应用:
1.实现两操作数 相 “或”的 运算
OR AX,[DI]
2.使某些位不变,某些位置“1”
OR CL,0FH
3.在不改变操作数的 情况下使OF=CF=0
OR AX,AX
3)逻辑非指令:NOT OPRD
执行操作:操作数按位取反再送回原地址
- 注:
指令的执行对标志位无影响 - 例:
NOT BYTE PTR[BX]
4)异或指令: XOR DST, SRC
执行操作: (DST) ← (DST)⊕(SRC)
5)测试指令: TEST OPR1, OPR2
执行操作: (OPR1)∧(OPR2)
- 应用:
常用于测试某些位的状态
移位指令
- 非循环移位指令
- 循环移位指令
- 注:
移动一位时由指令直接给出;
移动两位及以上,则移位次数由CL指定。
非循环移位指令
1)算术左移指令:
SAL OPRD,1
SAL OPRD,CL
2)逻辑左移指令:
SHL OPRD,1
SHL OPRD,CL
3)逻辑右移
格式:
SHR OPRD,1
SHR OPRD,CL
4)算术右移
格式:
SAR OPRD,1
SAR OPRD,CL
循环移位指令
不带进位位的循环移位
左移 ROL
右移 ROR
带进位位的循环移位
左移 RCL
右移 RCR
指令格式、对操作数的要求与非循环移位指令相同
串操作指令
- 目标操作数必须在附加段,源操作数默认在数据段(允许段重设)。
- 源串和目标串指针分别为SI和DI
- 串长度值必须由CX给出
- 需要设置数据的操作方向
确定DF的状态 - 串操作指令前可以加重复前缀。使用时应注意:
传送类指令前加无条件重复前缀
串比较类指令前加条件重复前缀,但前缀不影响ZF状态
1.串传送指令
- 格式:
MOVS OPRD1,OPRD2
MOVSB
MOVSW - 串传送指令常与无条件重复前缀连用
2.串比较指令
- 格式:
CMPS OPRD1,OPRD2
CMPSB
CMPSW - 串比较指令常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。
- 前缀的操作对标志位不影响
3.串扫描指令
- 格式:
SCAS OPRD
SCASB
SCASW - 执行与CMPS指令相似的操作,只是这里的源操作数是AX或AL
注:
- 需要定义附加段
目标操作数必须在附加段 - 需要设置数据的操作方向
确定DF的状态 - 源串和目标串指针分别为SI和DI
- 串长度值必须由CX给出
- 注意重复前缀的使用方法
传送类指令前加无条件重复前缀
串比较类指令前加条件重复前缀,但前缀不影响ZF状态
程序控制指令
程序的执行方向
- 程序控制类指令的本质是:
控制程序的执行方向 - 决定程序执行方向的因素:
CS,IP - 控制程序执行方向的方法:
仅修改IP,则程序将改变当前的执行顺序,转向本代码段内其它某处执行;
修改CS 和IP ,则程序转向另一个代码段执行。
转移指令
无条件转移指令
无条件转移到目标地址,执行新的指令
- 格式:
JMP OPRD
1.无条件段内转移
转移的目标地址在当前代码段内,段地址不改变。
即:目标地址是16位偏移地址。
- 段内直接转移
转移的目标地址由指令直接给出
格式:
JMP Label - .段内间接转移
转移的目标地址存放在某个16位寄存器或存储器
的某两个单元中
例:
MOV BX,1200H
JMP BX
执行完上述指令后:
IP=1200H
2.无条件段间转移
转移的目标地址不在当前代码段内。
目标地址为32位,包括段地址和偏移地址。
- 段间直接转移
转移的目标地址由指令直接给出
格式:
JMP FAR Label - 段间间接寻址
转移的目标地址由指令中的32位操作数给出
32位目标地址须存放于内存中
例:
JMP DWORD PTR[BX]
条件转移指令
在具备一定条件的情况下转移到目标地址
几种条件转移指令的应用
- JC/JNC
判断CF的状态。常用于比大小 - JZ/JNZ
判断ZF的状态。常用于循环体的结束判断 - JO/JNO
判断OF的状态。常用于有符号数溢出的判断 - JP/JPE
判断PF的状态。用于判断运算结果低8位中1的个数是否为偶数 - JA/JAE/JB/JBE
判断CF或CF+ZF的状态。常用于无符号数的大小比较
循环控制指令
- 循环范围:
以当前IP为中心的-128~+127范围内循环。 - 循环次数由CX寄存器指定。
- 循环指令:
LOOP(无条件循环指令)
LOOPZ
LOOPNZ
无条件循环指令
- 格式:
LOOP LABEL - 循环条件:
CX ≠ 0 - 操作:
DEC CX
JNZ 符号地址
中断指令
- 格式:
INT n - 说明:
nх4
存放中断服务子程序入口地址的单元的偏移地址
该单元在数据段,段地址=DS - 中断指令执行过程
1.将FLAGS压入堆栈;
2.将INT指令的下一条指令的CS、IP压栈;
3.由n×4得到存放中断向量的地址;
4.将中断向量(中断服务程序入口地址)送CS和IP寄存器;
5.转入中断服务程序。
汇编例题
编写S=86H*34H-21H,式中三个数均为无符号数。
DATA SEGMENT
NUM DB 86H,34H,21H
RESULT DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,NUM
MOV AL,[SI]
MUL BYTE PTR [SI+1]
MOV BL,[SI+2]
MOV BH,0
SUB AX,BX
MOV RESULT,AX
MOV AH,4CH
INT 21H
DATA ENDS
END START