指令系统按功能分类可分为六大类:
数据传送指令、数据运算指令、逻辑运算和移位指令、字符串处理指令、控制转移指令、
处理器控制指令
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中。
特点:若⽬的操作数为⽆符号数,每移位⼀次,相当于⽬的操作数除以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个时钟周期的时间,不完成任何操作,主要⽤于循环操作中增加延时。