【微机原理与接口技术】指令系统

目录

  • 8086/8088内部寄存器的类型
    • 通用寄存器
    • 段寄存器
    • 控制寄存器
  • 8086/8088内存单元的编址
  • 寻址方式
    • 立即寻址
    • 寄存器寻址
    • 直接寻址
    • 寄存器间接寻址
    • 寄存器相对寻址
    • 基址-变址寻址
    • 基址-变址-相对寻址
    • 隐含寻址
  • 数据传送指令
    • 通用数据传送指令
      • 一般传送指令MOV
      • 堆栈操作指令PUSH/POP
      • 交换指令XCHG
      • 查表转换指令XLAT
    • 输入输出指令IN/OUT
    • 取偏移地址指令LEA
    • 装入地址指针指令LDS和LES
  • 算术运算指令
    • 加法运算指令
      • 普通加法指令ADD
      • 带进位位的加法指令ADC
      • 加一指令INC
    • 减法运算指令
      • 不考虑借位的减法指令SUB
      • 考虑借位的减法指令SBB
      • 减一指令DEC
      • CMP指令
  • 逻辑运算和移位指令
    • 逻辑运算指令
      • 逻辑与指令AND
      • 逻辑或指令OR
      • 逻辑非指令NOT
      • 逻辑异或指令XOR
      • 测试指令TEST
    • 移位指令
      • 算术左移SHL和逻辑左移SAL
      • 逻辑右移指令SHR
      • 算术右移指令SAR
      • 不带CF的循环左移ROL和循环右移ROR
      • 带CF的循环左移RCL和循环右移RCR
  • 串操作指令
    • 串传送
    • 串比较
    • 串扫描
    • 串装入
    • 串存储
  • 程序控制指令
    • 无条件转移指令JMP
      • 段内直接转移
      • 段内间接转移
      • 段间直接转移
      • 段间间接转移
    • 条件转移指令JCC
    • 循环控制指令
      • LOOP指令
      • LOOPZ(或LOOPE)指令
      • LOOPNZ(或LOOPNE)指令
    • 过程调用和返回
      • 段内直接调用
      • 段内间接调用
      • 段间直接调用
      • 段间间接调用
      • 返回指令
    • 中断指令
  • 处理器控制指令

8086/8088内部寄存器的类型

14个16位寄存器,按功能可分为三类:8个通用寄存器,4个段寄存器,2个控制寄存器。

通用寄存器

  1. 数据寄存器(AX,BX,CX,DX):8088/8086含4个16位数据寄存器,每一个又可拆分为2个8位寄存器。

    AX:累加器。所有I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中。

    BX:基址寄存器。在间接寻址中用于存放基地址。

    CX:计数寄存器。用于在循环或串操作指令中存放计数值。

    DX:数据寄存器。在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数。

  2. 地址指针寄存器(SP,BP)

    SP:堆栈指针寄存器,其内容为栈顶的偏移地址。

    BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。

    BX和BP的区别:作为基址寄存器,用BX表示所寻找的数据在数据段,用BP则表示数据在堆栈段。

  3. 变址寄存器(SI,DI)

    SI:源变址寄存器

    DI:目的变址寄存器

    变址寄存器在指令中常用于存放数据在内存中的地址。

段寄存器

  1. CS:代码段寄存器,存放代码段的段基地址。
  2. DS:数据段寄存器,存放数据段的段基地址。
  3. ES:附加段寄存器,存放数据段的段基地址。
  4. SS:堆栈段寄存器,存放堆栈段的段基地址。

控制寄存器

  1. IP: 指令指针寄存器
  2. FLAGS:标志寄存器

8086/8088内存单元的编址

  1. 内存单元的地址表示有物理地址和逻辑地址两种方式
  2. 物理地址:指每个内存单元在整个内存空间中具有的惟一的地址。8086/8088CPU有20根地址线,它可以产生20位的地址码,寻址范围为220,即1兆字节空间。为了方便书写,在源程序中常用5位十六进制数或一个符号来表示一个存储单元的地址。
  3. 任何两个相邻字节单元就构成一个字单元。字单元的地址为两个字节单元中较小地址字节单元的地址。字数据的存放规则是低8位放在较低地址字节单元,高8位放在较高地址字节单元
  4. 逻辑地址:每个存储单元的逻辑地址由两部分组成。16位的段(基)地址—决定该逻辑段在内存中的位置。16位的段内地址,也叫相对地址,或偏移地址—决定该存储单元相对段起始单元的距离。逻辑段的起始单元称为段首,段首的偏移地址=0。
  5. 物理地址=段基地址×16+偏移地址

寻址方式

立即寻址

  1. 指令中的源操作数是立即数,即源操作数是参加操作的数据本身,
  2. 立即寻址仅适合于源操作数
  3. 例:MOV AX,1200H【微机原理与接口技术】指令系统_第1张图片

寄存器寻址

  1. 参加操作的操作数在CPU的通用寄存器中。例:MOV AX,BX
  2. 执行时不必访问内存就可取得操作数,执行速度较快。

直接寻址

  1. 指令中直接给出操作数的偏移地址,默认在数据段,可以允许段重设。
  2. 注意:存储器操作数的长度由指令中另一个操作数的长度决定。
  3. 操作数的段地址默认为数据段,但允许段重设,即由指令定义段,说明数据存放在其他逻辑段中。例:MOV AX,ES:[1200H],这种情况称为段超越,所加的段寄存器叫段前缀。

寄存器间接寻址

  1. 寄存器的内容表示操作数的偏移地址,此时寄存器中的内容不再是操作数本身,而是存放数据的偏移地址,操作数本身在内存中。
  2. 存放偏移地址的寄存器称为间址寄存器,它们可以是:BX,BP,SI,DI,操作数的段地址(数据处于哪个段)取决于选择哪一个间址寄存器:BX,SI,DI默认在数据段DS,BP默认在堆栈段SS。
  3. 偏移地址长度均为16位,故间址寄存器必须是16位寄存器。
  4. 例:MOV BX,1200H,MOV AX,[BX]【微机原理与接口技术】指令系统_第2张图片

寄存器相对寻址

  1. 操作数的偏移地址为寄存器的内容加上一个位移量(常量)
  2. 可以使用的寄存器为:BX、BP、SI和DI

基址-变址寻址

  1. 操作数的偏移地址为:一个基址寄存器的内容 + 一个变址寄存器的内容
  2. 操作数的段地址由选择的基址寄存器决定:基址寄存器为BX,默认在数据段基址寄存器为BP,默认在堆栈段

基址-变址-相对寻址

指定一个基址寄存器和一个变址寄存器。同时给出一个8位或16位的位移量

隐含寻址

指令中隐含了一个或两个操作数的地址,即操作数在默认的地址中。

数据传送指令

通用数据传送指令

一般传送指令MOV

  1. 格式:MOV dest,src
  2. 两操作数长度必须相同
  3. 存储单元之间不能直接传送
  4. 段寄存器CS只能作源操作数,段寄存器之间不能直接传送
  5. 在源操作数是立即数时,目标操作数不能是段寄存器

堆栈操作指令PUSH/POP

  1. 存取以字为单位,堆栈操作指令的操作数必为16位
  2. 操作数不能是立即数;可以是16位寄存器或存储器1个字单元;若为存储器操作数,需要声明操作数的字长。
  3. 压栈指令PUSH,指令执行过程:SP - 2 → SP,操作数高字节 → (SP+1),操作数低字节 → (SP)
  4. 出栈指令POP,指令执行过程:(SP)操作数低字节弹出,(SP+1)操作数高字节弹出 ,SP ← SP+2

交换指令XCHG

  1. 格式:XCHG OPRD1,OPRD2,将源地址和目标地址中的内容进行互换
  2. 两操作数必须有一个是寄存器操作数,不允许使用段寄存器。

查表转换指令XLAT

  1. 格式:XLAT
  2. 指令为零操作数指令,采用隐含寻址,隐含的操作数为BX和AL。用BX的内容代表表格首地址,AL内容为表内位移量, BX+AL得到要查找元素的偏移地址。

输入输出指令IN/OUT

  1. 指令功能:专门面向I/O端口操作的指令

  2. 指令格式

    输入指令:IN acc,PORT

    输出指令:OUT PORT,acc,PORT为端口地址,acc为累加器AL或AX

  3. 直接寻址:端口地址为8位时,指令中直接给出8位端口地址;可寻址256个端口。

  4. 间接寻址:端口地址为16位时,指令中的端口地址必须由DX指定;可寻址64K个端口。

取偏移地址指令LEA

  1. 指令格式:LEA REG,MEM
  2. 操作:将变量的16位偏移地址取出送目标寄存器,当程序中用符号地址表示内存偏移地址时,须使用该指令。
  3. 源操作数必须是一个存储器操作数,目标操作数必须是16位通用寄存器,通常是间址寄存器。

装入地址指针指令LDS和LES

  1. 格式:LDS DEST,SRC; LES DEST,SRC
  2. 把SRC存储单元开始的4个字节单元的内容送入DEST通用寄存器和段寄存器DS(LDS指令)或ES(LES指令)。
  3. DEST十六位通用寄存器,SRC必须是一个存储器操作数。

算术运算指令

加法运算指令

普通加法指令ADD

  1. 格式:ADD OPRD1 OPRD2
  2. 操作:OPRD1+OPRD2 →OPRD1
  3. ADD指令的执行对全部6个状态标志位都产生影响
  4. 不允许两个操作数都是存储器操作数,不允许把段寄存器作为操作数

带进位位的加法指令ADC

  1. 指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样,只是CF也要参加求和运算
  2. 操作:OPRD1+OPRD2+CF→OPRD1,注意:CF是该指令执行前的值
  3. ADC指令常用于多字节数相加,使用前要先将CF清零。

加一指令INC

  1. 格式:INC OPRD
  2. 操作:OPRD+1 → OPRD,注意:INC指令执行不影响CF标志
  3. 不能是段寄存器或立即数

减法运算指令

减法指令对操作数的要求与对应的加法指令相同

不考虑借位的减法指令SUB

  1. 格式:SUB OPRD1,OPRD2
  2. 操作:OPRD1-OPRD2 →OPRD1

考虑借位的减法指令SBB

  1. 指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样,只是CF也要参加求和运算
  2. 操作:OPRD1-OPRD2-CF→OPRD1,注意:CF是该指令执行前的值

减一指令DEC

  1. 格式:DEC OPRD
  2. 操作:OPRD-1 → OPRD,注意:DEC指令执行不影响CF标志

CMP指令

  1. 格式:CMP OPRD1,OPRD2
  2. 操作:OPRD1- OPRD2
  3. 指令执行的结果不影响目标操作数,仅影响标志位!
  4. 用于比较两个数的大小,可作为条件转移指令转移的条件
  5. 指令对操作数的要求及对标志位的影响与SUB指令相同。
  6. 两个无符号数的比较:两个数的大小由CF或ZF来判断,CMP AX,BX,若AX>BX,CF=0;AX
  7. 两个带符号数的比较:两个数的大小由OF和SF共同决定,OF和SF状态相同,AX > BX; OF和SF状态不同,AX < BX

逻辑运算和移位指令

  1. 逻辑运算指令对操作数的要求大多与MOV指令相同。
  2. “非”运算指令要求操作数不能是立即数
  3. 除“非”运算指令外,其余指令的执行都会使标志位OF=CF=0,AF不变,并对SF,PF和ZF有影响

逻辑运算指令

逻辑与指令AND

  1. 格式:AND OPRD1,OPRD2
  2. 操作:两操作数按位相“与”,结果送目标地址。
  3. 应用:实现两操作数按位相与的运算;使目标操作数的某些位不变,某些位清零;在操作数不变的情况下使CF和OF清零

逻辑或指令OR

  1. 格式:OR OPRD1,OPRD2
  2. 操作:两操作数按位相“或”,结果送目标地址。
  3. 应用:实现两操作数按位相或的运算;使目标操作数的某些位不变,某些位变1;在操作数不变的情况下使CF和OF清零

逻辑非指令NOT

  1. 格式:NOT OPRD
  2. 操作:操作数按位取反再送回原地址
  3. 指令中的操作数不能是立即数,指令的执行对标志位无影响

逻辑异或指令XOR

  1. 格式:XOR OPRD1,OPRD2
  2. 操作:两操作数按位相“异或”,结果送目标地址。

测试指令TEST

  1. 格式:TEST OPRD1,OPRD2
  2. 操作:执行“与”运算,运算的结果影响标志位,但不送回目标地址。
  3. 常用于测试某些位的状态

移位指令

算术左移SHL和逻辑左移SAL

  1. 格式:SHL OPRD,CL或SHL OPRD,1;SAL同
  2. 操作:将目的操作数左移一位或CL指定的位,每左移一位,左边的最高位移入标志位,右边的最低位补0
  3. 指令系统中它们是同一条指令,正负数算术左移与逻辑左移结果一样

逻辑右移指令SHR

每右移一位,右边的最低位移入标志位CF,而在左边的最高位补0

算术右移指令SAR

和SHR的区别是,最高位不是补0,而是保持不变

不带CF的循环左移ROL和循环右移ROR

ROL指令:最高位移入CF,同时移入最低位构成循环

ROR指令:最低位移入CF,同时移入最高位构成循环

带CF的循环左移RCL和循环右移RCR

RCL指令:最高位移入CF,而CF原来的值移入最低位

RCR指令:最低位移入CF,而CF原来的值移入最高位

串操作指令

源串地址由DS:[SI]提供,目的串由ES:[DI]提供。

每次只处理串中的一个单元(字或字节),并自动修改SI和(或)DI,使其指向下一个单元。

地址修改方向由DF标志位决定:DF=0为增地址方向, DF=1为减地址方向。

指令前面可加上自动重复前缀,实现自动重复执行串操作,重复执行次数由CX指定。

REP:CX不等于0重复

REPE/REPZ:CX不等于0且ZF等于1重复

REPNE/REPNZ:CX不等于0且ZF等于0重复

串传送

MOVS OPRD1,OPRD2

MOVSB

MOVSW

串比较

CMPS OPRD1,OPRD2

CMPSB

CMPSW

串扫描

SCAS OPRD

SCASBS

CASW

执行AX(或AL)-OPRD,结果不保存,只影响标志寄存器。

串装入

LODS OPRD

LODSB

LODSW

对字节: AL<-[DS:SI]

对字: AX<-[DS:SI]

串存储

STOS OPRD

STOSB

STOSW

对字节: AL->[ES:DI]

对字: AX->[ES:DI]

程序控制指令

无条件转移指令JMP

段内直接转移

  1. 格式:JMP Label
  2. 说明:转移的目标地址由指令直接给出,如:常数、标号

段内间接转移

  1. 格式:JMP OPRD
  2. 说明:转移的目标地址存放在某个16位通用寄存器或存储器的某字单元中
  3. JMP WORD PTR[BX],在上述指令中,若操作数OPRD是存储器,则要加上类型指示符WORD PTR已说明后面的存储器操作是一个字

段间直接转移

  1. 格式:JMP FAR LABLE
  2. 转移的目标地址由指令直接给出

段间间接转移

  1. 格式:JMP OPRD
  2. 转移的目标地址由指令中的32位存储器单元给出

条件转移指令JCC

指令名称 汇编格式 转移条件 功能说明
进位转移 JC target (CF)=1 有进位或借位
无进位转移 JNC target (CF)=0 无进位或借位
等于或为零转移 JE/JZ target (ZF)=1 相等或结果为 0
不等于或为零转移 JNE/JNZ target (ZF)=0 不相等或结果为 0
奇偶校验为偶转移 JP/JPE target (PF)=1 有偶数个 1
奇偶校验为奇转移 JP/JPO target (PF)=0 有奇数个 1
结果为负转移 JS target (SF)=1 为负数
结果为正转移 JNS target (SF)=0 为正数
溢出转移 JO target (OF)=1 溢出
不溢出转移 JNO target (OF)=0 不溢出
大于则转移 JA/JNBE target (CF)=0 且(ZF)=0 无符号数
大于或等于则转移 JB/JNAE target (CF)=0 无符号数
小于则转移 JB/JNAE target (CF)=1 无符号数
小于或等于则转移 JAE/JNB target (CF)=1 或(ZF)=1 无符号数
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)或(ZF)=1 带符号数

循环控制指令

LOOP指令

  1. 格式:LOOP LABLE
  2. 循环条件:CX≠ 0
  3. 操作:DEC CX,CX-1→CX,JNZ LABEL(符号地址 ),CX ≠ 0则转LABEL,否则执行下条指令

LOOPZ(或LOOPE)指令

格式同上,执行是先使CX内容减1,再根据CX中的以及ZF的值来决定是否继续循环,继续循环的条件是CX≠0且ZF=1,若CX=0或者ZF=0则退出循环。

LOOPNZ(或LOOPNE)指令

继续循环的条件是CX≠0且ZF=0,否则退出循环。

过程调用和返回

段内直接调用

  1. 格式: CALL NEAR PROC
  2. 指令中的NEAR可以省略

段内间接调用

  1. 格式:CALL OPRD
  2. OPRD是16位寄存器或两个存储器单元的内容,内容代表的是一个近过程的入口地址,例如:CALL WORD PTR[SI]

段间直接调用

  1. 格式:CALL FAR PROC
  2. 例:CALL FAR TIMER

段间间接调用

  1. 格式:CALL OPRD
  2. OPRD为32位的存储器地址
  3. 例:CALL DWORD PTR[SI]

返回指令

  1. 格式:RET
  2. 功能:从堆栈中弹出断点地址,返回原程序
  3. RET指令一般位于子程序的最后,返回指令在格式上不区分段内或段间(即1WORD或2WORD)。

中断指令

  1. 格式: INT n
  2. n为中断向量码,是一个常数,取值0-255
  3. 说明: n×4存放“中断服务子程序入口地址”的存储单元的偏移地址

处理器控制指令

CLC:CF<-0

STC:CF<-1

CLD:DF<-0

STD:DF<-1

CLI:IF<-0

STI:IF<-1

HLT:暂停指令

你可能感兴趣的:(微机原理与接口技术,嵌入式硬件,硬件架构)