微机原理笔记分享
课程链接:https://www.bilibili.com/video/BV1qv411Y7AA?share_source=copy_web
寻址方式和指令系统
汇编语言与指令
- 机器语言
- 机器指令
- 汇编语言
- 汇编指令
指令格式
-
操作码 操作数 ;注释
-
操作码
- 说明要执行什么操作
- 不可少,用助记符表示,有确定的机器码
-
操作数
-
操作码的操作对象
-
单/双/无,可为立即数,寄存器,存储单元, 1/O接口
-
操作数类型
-
立即数(常数)
-
具有固定数值的操作数(即常数),它具体可以是一个字节或者字
-
取值范围
-
注意:立即数只能用作源操作数
-
-
寄存器操作数
- 放在8个通用寄存器或4个段寄存器中的操作数
-
存储器操作数
-
存放在存储单元中的操作数
-
类型可以是字节(1个存储单元)或者字(两个存储单元)
-
注意:大部分指令不允许两个操作数同时为存储器操作数
-
说明
- 若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段
- 存储器操作数的偏移地址可以通过不同的寻址方式由指令给出
-
-
-
-
8086寻址方式
-
指令中指定操作数所在位置的方法一般指源操作数
-
在8086指令系统中,说明操作数所在地址的寻址方式可分为3大种(7小种):
-
立即数寻址方式
-
立即(数)寻址
- 操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数
- 立即数可以为8位,也可以为16位。如果是16位数,则“高位字节存放在高地址中,低位字节存放在低地址中”
- 操作数可以是计算机有效数制下的数值,也可以是带单引号的字符
- 立即寻址方式只能用于源操作数,而不能用于目的操作数
-
-
寄存器寻址方式
-
寄存器寻址
- 操作数放在某个寄存器中,不需要访问存储器来取得操作数8位和16位操作数
- 寄存器寻址方式既可用于源操作数,也可用于目的操作数,还可以两者都用于寄存器寻址方式
-
-
存储器寻址方式
-
直接寻址
- 直接寻址:根据操作数存储单元的有效地址直接寻址
- 有效地址(EA):操作数的偏移地址
-
寄存器间接寻址
-
操作数的偏移地址放在寄存器中,只有SI、DI、BX和BP可作间址寄存器
-
-
寄存器相对寻址
-
EA=间址寄存器的内容加上一个8/16位的位移量
-
寄存器相对寻址方式操作数的书写形式可以采用多种,以下是与MOV AX,COUNT[BX]指令等价的另外几种书写形式:
- MOV AX,[BX+ COUNT]
- MOV AX,[COUNT+ BX]
- MOV AX,[ BX]COUNT
-
-
基址变址寻址
-
由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址+变址寻址。
-
由基址寄存器(BX或BP)给出—基址寻址方式
-
由变址寄存器(SI或DI)给出一变址寻址方式
-
注意:[BX+BP]或[SI+DI]是非法搭配
-
示范
-
正确
- MOV AX,[BX][SI]
- MOV AX,[BX+SI]
- MOV AX,DS: [BP] [DI]
-
错误
- MOV AX,[BX][BP]
- MOV AX,[DI][SI]
-
-
-
相对基址变址寻址
-
在基址+变址寻址的基础上再增加一个8位或16位偏移量,三者之和为偏移地址
-
与基址变址寻址方式相同,基址变址相对寻址方式的操作数也可采用多种等价形式,例:
- MOV DX ,disp [ BX ][ SI]
- MOV DX ,disp [ BX+SI]
- MOV DX,[ BX +SI + displ
- MOV DX,[BX +SI ]disp
-
-
-
其它寻址方式
-
I/O端口寻址(直接端口+间接端口)
- IN AL,63H ;将端口63H中内容→AL
MOV DX,213H
OUT DX,AL ; AL→端口213H
- IN AL,63H ;将端口63H中内容→AL
-
隐含寻址
- DAA ;操作数存放于规定位置
-
转移类指令寻址
- JMP, JNZ
-
-
-
8086指令常见格式(涉及通用寄存器)
内存单元字的存储
-
16位寄存器存储一个字,高8位存高字节,低8位存放低字节。
-
内存中存储一个字,低位字节放在低地址单元,高位字节放在高地址单元。
-
8086从存储器偶地址存取字数据
汇编指令分类
数据传送类
-
1.计算机中最基本、最重要的一种操作,数据传送指令是最常用的一类指令
-
2.数据传送指令负责把数据、地址或立即数传送到寄存器或存储单元中
-
数据传送指令
-
1.通用传送指令MOV
-
MOV指令
-
格式:MOV 目的操作数,源操作数
-
功能:将源操作数的内容传送给目的操作数,源操作数内容不变
-
注意:MOV指令不影响标志位
-
MOV指令不能实现的传送情况
- 当是双操作数时,数据类型须匹配,即要同为8位、16位或32位数据;两个操作数不能同时为段寄存器;也不能同时为存储器操作数
- 立即数不能作目的操作数使用,也不能直接传送给段寄存器
- CS不能作目的操作数
- IP不能作目的操作数和源操作数
-
-
-
2.目的地址传送指令LEA
-
地址传送指令
-
特点:传送的是存储器操作数的地址(偏移地址、段地址),而不是内容。
-
对标志寄存器的各标志位均无影响
-
源操作数都必须是存储器操作数,而目的操作数可以是任何一个16位的通用寄存器
-
代表指令:LEA
-
LEA指令
-
功能:将源操作数的有效地址传送至指定的16位寄存器中
-
例
-
备注
- 指令中“r16”常用的寄存器是BX、BP、SI、DI。一般不使用其他寄存器。
- 源操作数mem是一个存储器操作数,常用的是变量名,如:LEA BX,BUFFER。本条指令常被描述为“取变量的偏移地址”
-
-
-
-
3.标志传送指令
-
4.数据交换和字节转换指令XCHG XLAT
-
数据交换指令XCHG
-
格式:XCHG 寄存器,存储器操作数/寄存器
-
功能:实现源操作数和目的操作数之间的内容相互交换
-
例
- XCHG AL,BL ;
- XCHG AX,DX ;
- XCHG CX,[3450H]
- 以下3条指令实现寄存器之间数据交换。
- MOV AX,5678H ; AX=5678H
- MOV BX,OFFFFH ;BX=OFFFFH
- XCHGAX,BX ; AX=OFFFFH , BX=5678H
-
注意
- 不能在存储器与存储器之间交换数据
- XCHG指令不影响标志位
-
-
表转换指令
-
格式:XLAT或XLAT表首址
-
功能:将AL与BX寄存器内容之和作为偏移地址,将其所对应的存储单元内容送入AL寄存器。
-
指令执行前:在内存建立一个字节表格,内含要转换成的目的代码
- BX-存放表格首地址
- AL-存放相对表格首地址的位移量
-
指令执行后:将AL寄存器的内容转换为目标代码
-
例
-
-
-
5.堆栈操作指令PUSH POP
-
格式
-
堆栈操作指令PUSH
-
堆栈操作指令POP
-
堆栈操作指令小结
- 单操作数指令
- 堆栈以字方式编址,操作数必须是字操作数
- 操作数可以是通用寄存器、段寄存器和存储器的数据字
- 操作数可以是段寄存器(POP指令CS除外)
- 存储器数据字可以用任意一种有效的寻址方式表示
- 指令操作结果不影响标志寄存器
-
堆栈常用来
- 临时存放数据
- 传递参数
- 保存和恢复寄存器
-
-
注:
- 1)除标志传送指令外,均不影响标志位
- 2)红色重点掌握
-
算术运算类
-
加法
-
加法指令ADC
-
格式
-
功能
- ADC指令将源与目的操作数相加A再加进位CF标志,结果送目的操作数ADC指令按状态标悲的定义相应设置
-
用法
- ADC指令主要与ADD配合,实现多字节或多精度数据相加的运算
-
例
-
编写执行双精度数(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作数的高位字,BX是源操作数的高位字。
-
执行前
- (DX,CX) = 0008 2ACOH,
(BX,AX) = 000A E25BH。
- (DX,CX) = 0008 2ACOH,
-
执行指令
- ADD CX,AX ;(CX)= 0D1BH
ADC DX, BX ; now,(DX)=0013H
- ADD CX,AX ;(CX)= 0D1BH
-
-
-
加法指令ADD
-
格式
-
功能
- 将源操作数的内容和目的操作数的内容相加,相加后的结果保存在目的操作数中,并根据结果置相关标志位
-
注意
- 1.源操作数和目的操作数应同时为有符号数或为无符号数,且二者的数据类型应匹配
- 2.对标志位CF 、OF 、PF、SF、ZF和 AF有影响
-
例
- ADD AL, 30. ;累加器与立即数相加
ADD BX,[3000H] ;通用寄存器与存储单元内容相加
ADD D1,Cx ;通用寄存器之间相加
ADD BETA[SI],DX ;存储器操作数与寄存器相加
这些指令对标志位CF、OF 、PF、SF、ZF和AF有影响。
- ADD AL, 30. ;累加器与立即数相加
-
-
增1指令INC
-
对指令中指定操作数的内容加1后,又回送给该操作数不影响进位CF标志
-
主要用于在循环程序中修改地址指针和循环次数等
-
注意内存字节单元和内存字单元
-
加法调整指令
-
格式
- DAA
-
功能
- 功能:将两个压缩BCD数之和(默认AL中)调整为正确的压缩BCD码
-
调整方法:
- 若AL的低4位大于9或者AF=1,则AL<–AL+06H,并使AF=1
若AL的高4位大于9或者CF=1,则AL<–AL+60H,并使CF=1
其余情况AL的内容不变
- 若AL的低4位大于9或者AF=1,则AL<–AL+06H,并使AF=1
-
-
-
减法
-
减法指令SUB
-
格式
-
功能
- 将目的操作数内容与源操作数内容相减之后的结果(差)存入目的操作数中,对操作数的使用及标志位的影响同ADD指令
-
例
- 子主题 1
-
-
减1指令DEC
-
格式
-
功能
- 完成对指令中指定操作数的内容减1后,又回送给该操作数。与INC指令一样,DEC指令通常也用于在循环过程中对地址指针和循环次数的修改
-
-
比较指令CMP
-
格式
-
功能
- 将目的操作数与源操作数内容相减,相减结果不回送目的操作数,仅根据结果影响标志位,对标志位的影响与SUB相同。
-
-
-
乘法指令(操作数部分隐含)
-
MUL无符号数乘法
-
格式
-
例
-
-
-
除法指令
-
除法指令对标志没有定义,但会产生除法
逻辑运算和移位(位操作类)
-
位操作类指令以二进制位为基本单位进行数据的操作;包含逻辑运算类指令和移位指令。
-
要求
- 全面而准确地理解每条指令的功能和应用
-
注意
- 这些指令对标志位的影响
-
逻辑运算指令
-
AND
-
格式
-
功能
- 对两个操作数执行按位的逻辑与运算,结果送到目的操作数
-
说明
- 按位的逻辑与运算;
- 操作数不能同时为存储器操作数;
- 注意对标志位的影响;
-
思考
-
某一个操作数自己和自己相逻辑与,结果是?
- 自己本身
-
AND指令主要用在什么场合?
-
置0
- 0⋀0=0
1⋀0=0
- 0⋀0=0
-
-
-
-
OR
-
格式
-
功能
- 对两个操作数执行按位逻辑或运算,结果送到目的操作数
-
说明
- 按位逻辑或运算;
- OR指令对操作数的限制和对标志位的影响;
-
思考
-
某一个操作数自己和自己相逻辑与,结果是?
- 自己本身
-
OR指令主要用在什么场合?
-
置1
- 0⋁1=1
1⋁1=1
- 0⋁1=1
-
-
-
-
异或指令XOR
-
格式
-
功能
- 对两个操作数执行按位逻辑异或运算,结果送到目的操作数
-
说明
-
只有相“异或”的两位不相同,结果才是1
- 0⊕1=1
1⊕0=1
0⊕0=1
1⊕1=1
- 0⊕1=1
-
XOR指令对操作数的限制和对标志位的影响同AND指令
-
-
思考
- 某一个操作数自己和自己相异或,结果是0
- XOR指令主要用在取反、清空(操作数)场合.
-
-
NOT
-
格式
-
功能
- 对一个操作数执行按位逻辑非运算
-
说明
- 按位取反,原来是“0”的位变为“1”,原来是“1”的位变为“0”;
- NOT指令是一个单操作数指令;
- NOT指令不影响标志位;
-
-
TEST
-
格式
-
TEST 目的,源;量目的⋀源,不回送结果,但影响标志位
-
-
-
非循环移位指令
-
算术左移SAL
-
格式
- SAL目的,计数值
SAL AH,1
SAL AH,CL
SAL BYTE PTR [BX] ,1
- SAL目的,计数值
-
-
逻辑左移SHL
-
格式
- SHL 目的,计数值
SHL AH,1
SHL AH, CL
- SHL 目的,计数值
-
注意
- CF总是被移出的高位,两者均属于破坏性移位
- 左移1位.相当于乘2
- 移位次数为1时,若最高位被改变,OF=1,否则OF=0
-
-
逻辑右移SHR
-
格式
- SHR 目的, 计数值; 右移1次,无符号数相当于除以2(余数丢弃)
-
例
- MOV AL,10000110B ; AL=134
SHR AL,1 ; AL=67
SHR AL,1 ; AL=33,CF=1
- MOV AL,10000110B ; AL=134
-
-
算术右移SAR
-
格式
- SAR目的,计数值; 右移1次,有符号数相当于除以2
-
例
- MOV AL, 80H: AL-10000000B=-128
MOV CL,03H
SAR AL,CL ; AL-i10000B=FOH=-16
- MOV AL, 80H: AL-10000000B=-128
-
-
-
循环移位指令
-
RCL
-
计数值;大循环左移
-
-
ROL
-
计数值;小循环左移
-
-
RCR
-
计数值;大循环右移
-
-
ROR
-
计数值;小循环右移
-
-
例
-
控制转移类
-
无条件转移指令
-
无条件转移到目标地址
-
转移指令JMP地址
-
功能
- 使程序无条件地转移到指令中指定的目标地址去执行
-
段内转移(近转移near):目标地址和JMP指令在同一个代码段
- 不需要更改CS段地址,只要改变IP偏移地址
- 短转移short是近转移的一个特例(16位到8位)
-
段间转移(远转移far) :目标地址和JMP指令在不同代码段
- 需要更改CS段地址和IP偏移地址
- 目标地址必须用一个32位数表达(32位远指针)
-
近转移和远转移
-
例
-
-
-
条件转移指令
-
当具备一定条件时(通常指状态标志位)转移到目标地址
-
状态标志
-
CF:Carry Flag
-
PF: Parity Flag
-
ZF: Zero Flag
-
SF: Sign Flag
-
OF: Overflow Flag
-
直接标志转移指令
-
基于1个状态标志位状态
-
JC,JNC
- 判断CF的状态,常用于两个无符号数比较大小
-
JZ/JE,JNZ/JNE
- 判断ZF的状态,常用于循环体的结束判断
-
JS,JNS
- 判断SF的状态,常用于判断数的性质
-
JO,JNO
- 判断OF的状态,常用于有符号数溢出的判断
-
JP/JPE,JNP/JPO
- 判断PF的状态,常用于判断结果低8位1的个数是否为偶数
-
-
间接标志跳转指令(无符号数)
- >JA(JNBE)------CFVZF=0
- ≥JAE (JNB)------CF=0
- <JB(JNAE)------CF=1
- ≤JBE (JNA) ------CFVZF=1
-
间接标志跳转指令(比较有符号数)
- >JG (JNLE) ------(SF⊕OF) VZF=0
- ≥JGE (JNL)------ SF⊕OF=0
- <JL(JNGE)------SF⊕OF=1
- ≤JLE (JNG)------(SF⊕OF) VZF=1
-
例
- 例:编写一程序段,实现比较两个有符号数的大小,将较大者存放在AX寄存器中
-
-
循环指令
-
循环范围:以当前IP为中心的-128~127范围内循环
-
循环次数:默认CX寄存器指定
-
例
-
LOOP指令例子
-
编写一程序段,实现求1+2+…+100之和,并把结果存入AX中。
-
方法一
-
方法二用循环计数器CX
-
-
-
-
子程序调用及返回指令
-
过程(子程序)调用指令
- 子程序是完成特定功能的一段程序
- 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行
- 当运行完子程序功能后,采用RET返回指令回到主程序继续执行
- 与转移指令的区别?
- CALL指令和RET指令都不影响状态标志位
-
主程序与子程序
-
调用指令的执行过程
-
1.保护断点
- 将调用指令的下一条指令的地址(断点)压入堆栈
-
2.获取子程序的入口地址
- 子程序第一条指令的地址
-
3.执行子程序(程序员完成)
- 功能实现,参数的保存及恢复
-
4.恢复断点
- 将断点的偏移地址弹出
-
-
子程序调用指令
-
CALL指令分成4种类型
- (1)CALL 子程序名 ;段内直接调用
(2)CALL r16
CALL WORD PTR m16 ;段内间接调用
(3)CALL far ptr子程序名 ;段间接调用
(4)CALL DWORD ptr mem ;段间间接调用
- (1)CALL 子程序名 ;段内直接调用
-
CALL指令需要保存返回地址:
-
-
子程序返回指令
- 功能:弹出堆栈中由CALL指令压入的返回地址值,迫使CPU返回到主程序中CALL指令的下一条指令去继续执行,该指令常放在子程序的最后
-
-
中断指令
-
1、中断指令INT
- 格式:INT n
- 功能:产生一个中断类型号为n的内部中断,其n值是一个0~FFH范围内的整数
- INT n指令的具体执行步骤和操作将在后续章节叙述
-
2、溢出中断指令INTO
- 格式:INTO
- 功能:产生一个溢出中断
-
3、中断返回指令IRET
- 功能:退出中断过程,返回到中断时的断点处继续执行。所有的中断程序,不管是由软件引起还是由硬件引起,其最后一条指令必须是IRET
-
字符串操作
-
什么是串操作指令
- 针对数据块或字符串的操作
- 可实现存储器到存储器的数据传送
- 待操作的数据串(源串),目标操作串(目标串)
-
操作对象是多个字节数(一串字符或数据,以字或者字节为单位),需确定:
- 串所在的区域段
- 串的首地址(源串,目标串)
- 串长度
- 串的操作方向
-
为什么要进行字符串操作
- 数据传送类指令每次只能传送一个数据,若要传送大批数据就需要重复编程(通过循环来实现),这样就浪费了大量的时间和空间。为此8086提供了一组处理内存中连续存放数据的串指令,这就是串操作指令。
-
指令系列
-
字符串传送指令
-
串所在区域和首地址
- 源串一般放在数据段,偏移地址由SI决定,允许段超越
- 目的串只能放在附加段,偏移地址由DI决定,不允许段超越
-
串长度:由寄存器CX指定
-
串的操作方向:由标志位DF决定,指令根据DF状态自动修改地址指针
- DF=0,增地址方向
- DF=1,减地址方向
-
格式
-
例
-
-
字符串比较指令CMPS
-
格式
-
功能
-
将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果置标志位,但不保存结果。
- ([SI])一([DI])。
- 修改串指针,使之指向串中的下一个元素。
- 当DF=0时,DI增量。当DF=1时,DI减量。
-
-
例
-
-
字符串扫描指令SCAS
-
格式
-
功能
-
AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存。
- 字节操作:(AL).二(DI),字操作:(AX)-([DI])
- 修改指针使之指向串中的下一个元素。
- 当DF=0时,DI增量。当DF=1时,DI减量。
-
-
-
重复操作指令
-
串操作指令仅对数据串中的一个字节或字进行操作。
-
在串操作指令前,都可以加一个重复前缀实现串操作的重复执行。
-
3种指令
-
REP
-
格式
- REP 串指令
-
格式
- 当CX+0时,重复执行后面的串指令。可以理解为每执行一次后面的串指令,CX减1,并回送CX,直到CX=0,重复执行结束。
-
REPZ和REPNZ
-
格式
- REPZ/REPE 串指令
-
功能
- 重复执行串指令的条件是:(CX0)且字符相等(ZF
=1)。可理解为:每执行一次串指令,CX减1回送CX,并判断ZF是否为0,只要CX=0或ZF=0,重复执行结束
- 重复执行串指令的条件是:(CX0)且字符相等(ZF
-
说明
- 后面常跟CMPS串指令,用于字符串的比较。
-
-
-
重复次数隐含在CX寄存器中
-
-
处理器控制
-
标志位操作:这组指令共有7条,均为无操作数指令,它们的操作数隐含在标志寄存器的某些标志位上,即能直接对指定的标志位进行操作,但不影响别的标志位。
- 在这里插入图片描述
- 在这里插入图片描述
-
空操作指令
-
NOP指令不执行任何操作,但要耗时3个时钟周期
-
NOP常用于程序调试
- 在需要预留指令空间时用NOP填充
- 代码空间多余时也可以用NOP填充
- 还可以NOP实现软件延时,相当于“XCHGAX,AX”指
-