8086cpu学习笔记(4):指令系统

指令系统按功能分类可分为六大类:
数据传送指令、数据运算指令、逻辑运算和移位指令、字符串处理指令、控制转移指令、
处理器控制指令

一、数据传送指令

MOV
格式: MOV 目的, 源
将源操作数传送到目的操作数。
注意:IP寄存器不作为操作数。
立即数和CS寄存器不作为目的操作数。
两操作数不同时为储存单元和段寄存器。
16为立即数不可以直接被传送到DS寄存器中,必须经过AX过度。

PUSH
格式:PUSH 源
压栈

POP
格式:POP 目的
弹栈
注意:CS寄存器数据只可作为源操作数,不可作为目的操作数(只可出不可进)
立即数不作为堆栈指令操作数

XCHG
格式:XCHG 目的,源
目的和源操作数数据交换
注意:段寄存器不做操作数
不可两个存储单元直接交换

XLAT
格式:XLAT 转换表 或 XLAT
将一种代码转换为表中对应另一种代码。
使用步骤:
1建立一个表格
2将表格的起始偏移地址装入BX寄存器
3将要转换的数据相对于首元素的偏移量放入AL寄存器(既最多8位256字节)
4 执行XLAT后转换代码放入AL中

IN、OUT
格式:IN AC, 地址 OUT 地址, AC
AC:AX或AL(八位或16位累加器) 完成I/O端口与累加器直接的数传输
注意:当端口地址小于FFH(255)时直接给出,大于FFH时需放在DX寄存器中间接给出。

LEA
格式:LEA 目的,源
取有效地址指令,取源操作数地址偏移量。
注意:源操作数必须是储存单元,目的操作数必须时寄存器,但不能是段寄存器。
下面两条语句作用相等:
MOV AX, OFFSET TABLE
LEA AX, TABLE

二、算数运算指令

1.加法
ADD
格式:ADD 目的, 源
源+目的->目的

ADC
带进位的加法
格式:ADD 目的, 源
源+目的+CF->目的

注意:
• 源操作数:寄存器、存储器、⽴即数;
• 目的操作数:寄存器、存储器;
• 两个操作数不能同时为存储器;
• 两个操作数的类型必须相同。
• 一条带CF的加/减指令实际上涉及两个CF,参加加/减计算的是前一个字节计算后影响的CF,本次计算后影响的CF留下给下一字节计算。

ADC可用于多字节加法:
一、多字节加法程序流程图
在这里插入图片描述
二、程序

DATA SEGMENT                        ;数据段
DATA1 DB 4 DUP(?)            
DATA2 DB 4 DUP(?)
DATA3 DB 5 DUP(?)
DATA ENDS

CODE SEGMENT                        ;代码段
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX

MOV SI,OFFSET DATA1                 ;取地址
MOV DI,OFFSET DATA2
MOV BX,OFFSET DATA3
MOV CX,DATA2-DATA1
CLC

NEXT:                               ;循环做加法
MOV AL,[SI]
ADC AL,[DI]
NOP
MOV [BX],AL

INC SI
INC DI
INC BX

LOOP NEXT

MOV AL,0                           ;处理最后的进位
ADC AL,0
MOV [BX],AL
MOV AH,4CH
INT 21H

CODE ENDS
END START

REF:http://www.cnblogs.com/BlueMountain-HaggenDazs/p/5031213.html

INC
格式:INC 目的
目的+1->目的

注意:
操作数不为立即数
不影响CF标志位
当操作数是存储单元时,必须说明数据类型
例:INC BYTE PTR[BX]
INC WORD PTR[BX]

2.减法
SUB减法
SBB 带借位的减法
DEC 减量指令
格式和注意同加法

NEG
取负指令
格式:NEG 目的
目的 <- -目的

CMP
比较指令
格式:CMP 目的, 源
结果不回送,仅反应在标志位上
CMP指令仅执行减法计算,不回送结果,所以目的操作数不变,但根据减计算的结果影响6个条件标志位,可用的操作数组合也与SUB等指令相同。

ZF标志位变化意义:
ZF = 1,则两个数字相等,ZF = 0,则不相等。

CF标志位意义:无符号数判断大小:
CF = 0,则被减数大于或等于减数,若CF 0 1,则相反。

OF,SF标志位意义:有符号数判断大小:

OF = 0, SF = 0,则被减数大于等于减数。
SF = 1,则被减数小于减数
OF = 1, SF = 0,则被减数大于减数
SF = 0,则被减数小于减数

OF和SF相同,被减数大于等于减数,OF和SF不同,被减数小于等于减数

三、逻辑运算和移位指令

1.逻辑运算指令
NOT
按位取反
格式:NOT 目的

下列指令的操作数的要求同算术运算类的指令,指令执⾏后,将CF和OF清零,⽽运算的结果体现在ZF、SF和PF上,源操作数不变。

AND
逻辑与指令
格式:AND 目的, 源
按位与
可用与取数据的某些位,取的位与1,其余置零与0.

OR
逻辑或
格式:OR 目的, 源
按位或
可用于取数据的某些位,取得或0,其余置1或1.

XOR
逻辑异或
保留位异或0,取反位异或1

TEST
格式:TEST 目的, 源
逻辑与操作,结果保存标志,但不回传。

2.算数逻辑移位指令
SAL/SHL
算数/逻辑左移指令
格式:SAL/SHL 目的, 计数值
在这里插入图片描述
注意:
当移位次数大于1时必须放在CL中。

SHR
逻辑右移指令
格式:SHR 目的, 计数值
在这里插入图片描述

特点:若⽬的操作数为⽆符号数,每移位⼀次,相当于⽬的操作数除以2,可以实现除法运算,但是会丢弃余数。

SAR
算数右移指令
格式:SAR 目的, 计数值
在这里插入图片描述
每移动一次,最高位保持不变。

四、控制转移类指令

1.JMP
无条件跳转指令 (等同于C语言中的GOTO指令)
格式:JMP 目的
根据转移的距离和寻址的方式分为四类
段内直接转移
段内间接转移
段间直接转移
段间间接转移

段内直接转移
目标地址由指令直接给出
例: JMP 0011H
JMP NEXT

段内间接转移
例:JMP AX
JMP WORD PTR[AX]

段间直接转移
例:JMP FAR PTR
段间间接转移
例:JMP DWORD PTR[BX]
实质:IP ← 远标号的偏移地址
CS ← 远标号的段地址

2.过程调用及返回指令
过程调用指令:CALL
返回指令: RET

调用类型:
近调用:被调用过程与CALL在同一代码段里
远调用:不在同一代码段里

格式:CALL 过程名
执行步骤:
(1)保存断点:将CALL指令的下一行指令的有效地址压入栈中。(近调用:压入IP,远调用:压入CS和IP)
(2)根据指令给出的地址找到子程序的入口。

调⽤⽅式:
段内直接调⽤
格式:CALL NEAR PTR ⽬标地址
段内间接调⽤
格式:CALL WORD PTR [SI]
段间直接调⽤
格式:CALL FAR PTR ⽬标地址
段间间接调⽤
格式:CALL DWORD PTR [SI]

RET
格式:RET
与CALL指令相对应,通常作为⼀个⼦程序的最后⼀条指令,执⾏时从栈中弹出返回地址,即:栈顶的内容被弹出到IP(或IP和CS),⽤以返回到调⽤这个⼦程序的主程序的断点处。

3.条件转移指令
指令执行后,根据状态标志位确定是否转移。不满足条件则顺序执行。

格式:条件操作符 标号
指令的转移范围为-128~+127字节

⑴ 直接标志转移指令
特点:这类指令直接在指令助记符中给出状态标志的测试条件,共10条指令。
指令表格
助记符的命名规则:
J开头,若判定条件为对应标志位为1,则加上对应标志位符号的首字母。若判定条件为对应标志位为0,则加上N接对应标志位符号的首字母。

间接标志转移指令
特点:这类指令主要是放在CMP指令的后边,⽤来⽐较两个数的⼤⼩。
判断无符号数大小:
JA:大与
JAE:大于等与
JB:小于
JBE:小于等于

判断有符号数的大小:
JG:大于
JGE:大于等于
JL:小于
JLE:小于等于

4.循环控制指令
控制一组指令重复执行。
循环次数通常放在CX中。
循环控制均不影响标志位。

(1)LOOP
格式: LOOP 短标号

功能:CX-1 -> CX
判断CX是否为0,若不为零转移至标号后执行。
否则推出循环,顺序执行。

⑵ LOOPE/LOOPZ 相等或结果为零时循环
功能:CX-1→CX;若CX≠0且ZF=1则转移;

⑶ LOOPNE/LOOPNZ 不相等或结果不为零循环
功能:CX-1→CX;若CX≠0且ZF=0则转移;

⑷ JCXZ 若CX为0跳转
功能:判断若CX=0则转移;
注意:JCXZ指令不对CX的内容进⾏⾃动减1操作

五、处理器控制指令

标志操作指令:
在这里插入图片描述
助记符命名规则:
清零操作:CL开头
置一操作:ST开头
后面接目的标志位的首字母

2、停机指令和空操作指令
(1)HLT停机指令
作⽤:CPU进⼊暂停状态,不进⾏任何操作,该指令常⽤来等待中断的出现。

(2)NOP空操作指令
单字节指令,执⾏时需要3个时钟周期的时间,不完成任何操作,主要⽤于循环操作中增加延时。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sdhdwyx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值