微机原理与接口技术抢救手册#3

本文详细介绍了8086处理器的指令系统,包括不同的寻址模式如立即寻址、寄存器寻址和存储器寻址,以及I/O端口的访问方法。此外,还讨论了加法、减法、乘法和除法等基本运算指令,以及堆栈操作如PUSH和POP,以及程序控制指令如无条件转移JMP和条件转移JCC。
摘要由CSDN通过智能技术生成

Chapter 4 Instruction System

Instruction addressing mode 指令格式

操作码+目标操作数+源操作数

opcode + operand DST, operand SRC

 

储存操作数:

指令直接给出 Instruction gives directly

保存在寄存器中 Register

保存在内存中 Memory unit

Adressing mode 寻址方式

立即寻址Immediate addressing mode

立即寻址的特点是操作数就在指令内,因此,也叫做立即数,采用补码的形式存放,在执行阶段不访问内存。

寄存器寻址Register addressing mode

存储器寻址

直接寻址Direct addressing mode

优:从指令中可以直接的得到操作数的有效地址,且只访问内存一次。

缺:操作数的位数限制了寻址范围,而且,必须修改操作数才能修改地址。

寄存器间接寻址 Register-indirect addressing mode

数据依然保存在存储器单元中,只不过存储单元的偏移地址存放于寄存器中。

不是所有的寄存器都可以用来进行寻址

可用:BX, SI, DI, BP。

其中BX, SI, DI默认的段地址为DS指向的数据段。

BP默认的段地址为SS指向的堆栈段。

寄存器相对寻址 Register relative addressing mode

寄存器相对寻址是在寄存器间接寻址的基础之上进行

基址变址寻址 Based-indexed addressing mode

基址变址寻址,包括后面的基址变址且相对寻址

其数据段地址由基址寄存器决定,即BX, SI, DI作为基址寄存器时,数据在DS指定的的数据段中,BP作为基址寄存器时,数据在SS指向的堆栈段。

有效地址为 基址寄存器BX or BP 加上 变址寄存器SI or DI的和

基址变址相对寻址 Relative based-indexed addressing mode

I/O端口寻址Port addressing

用IN和OUT指令访问由输入输出端口编址组成的I/O空间

优点:输入输出的指令和访问存储器的指令明显区别;长度短,执行快,不占用内存

缺点:CPU需要有专门的IN、OUT指令且这些指令没有访问存储器指令强

直接端口寻址:指令直接提供8为立即数地址

如:

IN AL/AX, 63H

OUT 64H, AL/AX

间接端口寻址:由DX寄存器给出端口地址

如: 

IN AL/AX, DX

OUT DX, AL/AX

隐含寻址Implicit addressing mode

有些指令无需指明操作数,或者只有一个操作数。这类寻址的方式称为隐含寻址。

类似的指令有:CLI, MUL, PUSH。

Instruction操作指令

General Transfer Instruction

传送指令MOV

MOV DST, SRC ;可以是字节或字 BYTE / WORD

                           ;把SRC(源操作数)传送到DST(目标操作数)

注意:

操作数长度要求一致

不可以同时为存储器操作数

不可以同时为段寄存器

SRC为立即数时,DST不可以是段寄存器

IP, CS 不作为DST

堆栈指令 PUSH / POP

堆栈在内存,先进后出,8086由高向低堆栈

堆栈指针SP指向当前栈

PUSH入栈指令

PUSH SRC ;是字WORD

SRC 不能是立即数

SRC高字节先入(SP-1)低字节后入(SP-2)

执行后SP变为SP-2

如:

AX = 1234H

SP = 1200H

PUSH AX ; 则先11FFH为12H, 后11FEH为34H

指针SP = 11FEH

POP 出栈指令

POP DST ; 字WORD

DST 不能是立即数或CS段寄存器

先送入低字节SP, 在送入高字节SP+1

SP变为SP+1(SP的内容加2)

如:

AX = 1234H

SP = 1200H

POP AX ; 先1200H 为34H, 后1201H为12H,

指针SP=1202H

交换指令 XCHG

XCHG OPR1, OPR2 ; Byte or Word

OPR1 和 OPR2 中有一个在寄存器中,但不能是段寄存器

OPR1 和 OPR2两个不能同时在存储器中

结果不影响标志位(正负不变)

换码指令XLAT

XLAT ; Byte

把[BX+AL] 地址的操作数 给到AL

BX: 指向表的首地址

AL: 表中某项的偏移量

地址传送指令LEA

LEA REG, SRC

把SRC的有效地址传送到寄存器REG中

规定:SRC只能是存储器操作数,REG只能用16位寄存器,不能用段寄存器

 

I/O传输指令 IN and OUT

直接输入 the IN instruction: IN AX, PORT

直接输出the OUT instruction:OUT AX, PORT

间接输入the indirect IN instruction:IN AX, DX

间接输出the indirect OUT instruction:OUT AX, DX

​​​​​​​

算术运算指令Arithmetical Operation Instruction

算数运算涉及符号数和无符号数

加减运算时指令相同,无符号数用CF=1表示溢出,符号数用OF=1表示溢出

**溢出与进位

进位CF=1: 运算结果向更高位进位或借位(D7向D8)

溢出OF=1: 最高有效位均为0相加得1;最高有效位均为1相加得0(正数相加为负数,负数相加为正数,正数减负数为负数,负数减正数为正数)

乘除运算时指令不同

加法运算(不带进位)ADD instruction

ADD DST, SRC ;B/W

源操作数可以是8位/16位寄存器、存储器操作数或立即数

目的操作数不可以位立即数、两者不可同时位存储器存储数

对6个状态标志位都有影响

 

 

加法运算(带进位)ADC instruction

ADC DST, SRC ;B/W

进位标志位也加入计算,结束运算后CF会根据结果重新给值

ADC主要用于多字节(或字)运算

加一INC instruction

INC OPR;B/W

令OPR加一

OPR不可以是立即数或段寄存器内容

 

减法(不带借位)SUB instruction

SUB DST, SRC ; B/W

源操作数可以是8位/16位寄存器、存储器操作数或立即数

目的操作数不可以位立即数、两者不可同时位存储器存储数

对6个状态标志位都有影响

减法(带借位)SBB instruction

SBB DST, SRC ;B/W

进位标志位也加入计算,结束运算后CF会根据结果重新给值

SBB主要用于多字节(或字)运算

 

减一DEC instruction

DEC OPR ;B/W

常用于循环程序中修改指针和循环次数

OPR不可以是立即数或段寄存器的内容

 

比较(做减法看标志位)CMP instruction

CMP OPR1, OPR2 ;B/W

不保留减法结果,只根据状态标志位判断

​​​​ 

​​​​​​​

​​​​​​​

BCD code adjustment instruction

DAA 压缩BCD码加法调整指令

DAS 压缩BCD码减法调整指令

只能对AL中的结果进行调整(单字节调整),如果是多个字节的十进制加减,则需要从低字节开始逐字节进行运算调整

 

无符号数乘法

Unsigned number multiply instruction(MUL)

MUL SRC ;B/W

字节操作:AL*SRC 传给 AX

字操作:AX*SRC 传给 DX(高16位)、AX(低16位)

目的操作数DST必须是累加器(AX或AL)

源操作数SRC不能是立即数和段寄存器

 

符号数乘法

Signed number multiply instruction(IMUL)

IMUL SRC ;B/W

字节操作:AL*SRC 传给 AX

字操作:AX*SRC 传给 DX(高16位)、AX(低16位)

目的操作数DST必须是累加器(AX或AL)

源操作数SRC不能是立即数和段寄存器

无符号数除法

Unsigned number division instruction(DIV)

DIV SRC; B/W

字节操作:AX存16位被除数,SRC为8位除数,8位商存在AL,8位余数存在AH

 

字操作:AX(低)、DX(高)存32位被除数,SRC为16位除数,16位商存在AX,16位余数存在DX

符号数除法

Signed number division instruction(IDIV)

IDIV SRC; B/W

字节操作:AX存16位被除数,SRC为8位除数,8位商存在AL,8位余数存在AH

 

字操作:AX(低)、DX(高)存32位被除数,SRC为16位除数,16位商存在AX,16位余数存在DX

 

**余数符号与被除数相同

 

字节/字扩展

Byte word extension instruction(CBWCWD)

CBW ;

把AL的符号位扩展到AH中

CWD ;

把AX的符号位扩展到DX中

Logical Operations and Shift Instructions

逻辑运算指令 Logical operations instruction

AND

AND DST ,SRC ;B/W

对二进制数逐位进行“与”运算,相同保留,不同取0

更多用于屏蔽数据某位

​​​​​​​

0FH = 00001111B

OR

OR DST ,SRC ;B/W

对二进制数逐位进行“或”运算,源操作数为1的位数进行替换,其余位保留

更多用于保留数据某位

 

 80H = 1000 0000 B

NOT

NOT OPR ; B/W

操作数按位取反

XOR

XOR DST , SRC ; B/W

对DST 和 SRC 按位进行异或运算,结果存入DST

 

TEST

TEST OPR1, OPR2; B/W

OPR1和OPR2逐位进行“与”运算,结果不保留,(不改变OPR1和OPR2),改变状态标志位

  1. SF = 将结果的最高位赋给SF标志位,例如结果最高位是1,SF就是1
  2. 看TEMP是不是0,如果TEMP是0,ZF位置1;如果TEMP不是0,ZF位置0
  3. PF = 将TEMP的低8位,从第0位开始,逐位取同或。也就是第0位与第1位的同或结果,去和第2位同或,结果再去和第3位同或…直到和第7位同或。PF位是奇偶校验位,如果结果低8位中1的个数是偶数,PF=1;否则PF=0
  4. CF位置0
  5. OF位置0

移位运算指令

非循环移位指令Acyclic shift instruction

SHL逻辑左移指令

SHL OPR COUNT; B/W

操作数每左移一次,操作数的最低位补零,最高位移入CF(CF的原值丢失)

 

SHR逻辑右移指令

SHR OPR COUNT; B/W

操作数每右移一次,操作数的最高位补零,最低位移入CF(CF的原值丢失)

 

SAL算术左移指令(与SHL相同)

SAL OPR COUNT; B/W

操作数每左移一次,操作数的最低位补零,最高位移入CF(CF的原值丢失)

 

SAR算术右移指令

SAR OPR COUNT; B/W

每右移一次,操作数的最低位移入CF,最高位(符号位)不变,次高位与最高位相同

 

循环移位指令Cyclic shift instruction

ROL循环左移指令

ROL OPR COUNT; B/W

每移位一次,操作数的最高位被移入操作数的最低位,同时(最高位)移入标志位CF

 

ROR循环右移指令

ROR OPR COUNT; B/W

每移位一次,操作数的最低位被移入操作数的最高位,同时(最低位)移入标志位CF

 

RCL带进位循环左移指令

RCL OPR COUNT; B/W

每移位一次,操作数的最高位移入标志位CF,而原CF中的值移到操作数的最低位

 

RCR带进位循环右移指令

RCR OPR COUNT; B/W

每移位一次,操作数的最低位移入标志位CF,而原CF中的值移到操作数的最高位

 

Program control instruction

无条件转移指令JMP

Unconditional jump instruction

使程序无条件地转移到指令中指定的目的地去执行

有效地址存入IP, 段地址存入CS

分类:

第一种类型:段内转移或近(NEAR)转移

转移指令的目的地址和JMP指令在同一代码段中,转移时仅改变IP寄存器的内容,段地址CS的值不变。

直接:

短跳转 JMP SHORT 标号

程序转移到 LABEL指明的指令处继续执行。SHORT 为属性说明符, 说明转移范围,以当前 IP 为中心,转移范围-128~+127

近跳转 JMP NEAR PTR 标号

程序转移到 LABEL 指明的指令处继续执行。NEAR 为属性说明符, 说明转移范围,以当前 IP 为中心,转移范围-32768~+32767

间接:

JMP BX

将 BX 的值传送给 IP,程序转移到 CS:IP 处继续执行。操作数可以是所有 16 位 通用寄存器。

操作数必须是 16 位。

JMP WORD PTR [SI]

从[BX+DI]指明的内存区域连续取出两个字节传送给 IP,程序转 移到 CS:IP 处继续执行。操作数可以采用各种寻址方式。

操作数必须是 16 位。

第二种类型:段间转移,又被称为远(FAR) 转移

转移指令的目的地址和JMP指令不在同一段中,发生转移时,CS和IP的值都要改变——程序要转移到另一个代码段去执行。

直接转移:JMP FAR PTR 标号

程序转移到 LABEL 指明的指令处继续执行,LABEL 为标号。FAR 是 相对于 NEAR 的属性说明符,FAR 说明标号 LABEL 在另外的代码段,与 JMP 指 令本身不在同一段。这条指令执行的操作是 IP←LABEL 的偏移地址,CS←LABEL 所在段的段基址,程序转移到 CS:IP 处继续执行

间接转移:JMP DWORD PTR [DI]

从 [BX+DI]指明的内存区域连续取出 4 个字节,前两个字节(低 地址)传送给 IP,后两个字节送给 CS,程序转移到 CS:IP 处继续执行。操作数属 于存储器操作数,可以采用各种存储器的寻址方式

条件转移指令JCC

Conditional jump instruction

条件转移指令先测试条件,若条件成立则执行转移操作;若不成立则不转移并顺序执行下一条指令。所有的条件转移指令转移范围-128~+127,属于段内短转移,都不影响状态标志位

 

循环指令LOOP

Loop control instructions

LOOP 标号

先MOV CX(CX为计数寄存器), N(循环次数)

CX = CX-1

CX是否为0

为0则跳出循环继续运行

不为0则跳转到标号处继续执行

过程调用和返回指令CALL/RET

Procedure call and return

call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江弋南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值