【0415】基本指令系统
基本指令系统
指令属性:指令长度,指令时间
指令按照格式分类:双操作数指令,单操作数指令,无操作数指令
设计那么多指令的目的:在程序设计时可以更加清楚,灵活。
8086/8088指令系统中的指令按照功能分类有六类:传送类指令,算术运算类指令,位操作类指令,串操作类指令,程序转移类指令,处理器控制类指令。
传送类指令
功能:把数据从一个存储位置搬运到另一个存储位置
标志位影响:一般不影响标志位,仅当FR作为目的操作数地址时会影响标志位
(1)数据传送指令
指令格式:MOV DEST,SRC
两个操作数中只容许有一个为存储器寻址。
MOV指令中立即数不能直接传送给段寄存器,而且段寄存器之间不能直接传送数据,但都可以通过通用寄存器中转,来实现数据传送。
在无寄存器寻址指令中,需指明内存单元是以字节还是字单位传送数据。
CS不能为目的操作数,可以为源操作数。
(2)交换指令
指令格式:XCHG DEST,SRC
不能用立即数做操作数;最多只能有一个内存单元
(3)取标志位
指令格式:LAHF
把FR的低8位作为源操作数放入寄存器AH,没有操作数
(4)存标志位
指令格式:SAHF
把寄存器AH内容存入FR的低8位,FR作为目的操作数
(5)地址传送指令
指令格式:LEA DEST SRC
将源操作数的有效地址(偏移量)送到目的地址保存(和内存单元中的内容无关),源操作数必须是内存单元
(6)装入地址指针指令
指令格式:LDS DEST,SRC
LES DEST,SRC
LDS指将SRC中物理地址的值存入DEST,高一字的内容赋给DS;
LES指将SRC中物理地址的值存入DEST,高一字的内容赋给ES;
假定源操作数地址SRC中存放着2个字构成的逻辑地址。指令作用就是从存储单元取出逻辑地址.
(7)堆栈操作指令在程序中定义一个堆栈段:
STACK1 SEGMENT STACK--关键字
DB 40H DUP(0)
STACK1 ENDS
SP始终指向栈顶,存放的是字数据,SS指向的是堆栈的上限地址。
(1)入栈操作PUSH
单操作数指令不能使用立即数
(2)出栈操作POP
(3)标志入栈指令PUSHF
把标志寄存器FR中的内容保存在堆栈中
(4)标志出栈指令POPF
从栈顶取数据保存到标志寄存器。
算术运算类指令
会影响标志位.
(1)加法指令ADD
指令格式:ADD DEST SRC
标志位影响:OF CF ZF AF PF SF[6个标志位都会受到影响]
(2)带进位的加法
ADC DEST SRC
DEST+SRC+CF
(3)加1指令
INC DEST
通常理解成无符号数(通常是对地址+1),不会影响CF内容,会影响OF内容[只有当内容是0111 1111B]
(4)减法指令
SUB DEST SRC
(5)带进位的减法
SBB DEST SRC
(6)减1指令deincrease
DEC DEST
不会影响CF内容
(7)求补操作
NEG DEST
补码:X补=(2^n)-X, 0-X
十进制算法:0-x,得数取补码
二进制/16进制算法=2^n-x,得数就是要求的结果
当成十进制就是负数,当成2进制/16进制就是补码[操作数一般解释为补码]
例:在DAW+2,DAW字单元存放有一个32位带符号数,DAW中存放的是低16位,求这个数的相反数并存入原内存单元中。
NEG DAW
MOV AX,0
SBB AX,DAW+2
MOV DAW+2,AX
(8)比较指令
CMP DEST SRC
仅使用减法操作来影响标志位,不保存运算结果
判断溢出就直接化成同进制数进行计算后判断
两个带符号的数的比较不能用单一的符号判断两个数的关系
SF与OF相同,(DEST)>SRC
SF与OF不同,(DEST)<SRC
位操作类指令
(1)与操作
AND DEST,SRC
无论结果是什么,CF,OF被强制置为0,AF不确定。
标志位‘不确定’什么意思?可能会变化,但没有意义
(2)或操作
OR DEST,SRC
CF,OF被强制置为0,AF不确定
(3)异或操作
XOR DEST,SRC
CF,OF被强制置为0,AF不确定
(4)非操作
NOT DEST
标志位不影响
以上位操作可以用来进行取位操作(与操作),置位操作(或操作),位变反操作(异或操作,用1将目标数变反)
(5)测试指令
TEST DEST,SRC
DEST,SRC按位取与,但是不保存结果
CF,OF被强制置为0,AF不确定
PPT第五章基本指令系统4 P26
(6)移位/循环移位指令
OPR DEST,COUNT
OPR:操作助记符
COUNT:超过1要用CL表示
OPR
SAL (shift arithmetic left ):算术左移
SAL–算术左移:OF仅当COUNT=1时才有意义,AF标志不确定P69
操作数解释为补码,空出的低位补0
SAR (shift arithmetic right):算术右移
SAR–算术右移:算术右移不会发生溢出的现象,始终都有OF=0。
操作数解释为补码,空出的高位补原来的符号位
正数右移所得最小值为0,负数右移所得最大值为-1。
可以利用算术移位实现乘除法
SHL(shift logical left): 逻辑左移
逻辑左移指令实际上和算术左移指令是同一条指令,机器指令代码完全一致。
在DEBUG中输入指令时只有SHL指令合法,而SAL指令非法。
但是在源程序中SAL指令是可以使用的,针对带符号数,逻辑左移指令SHL针对无符号数,这样算术移位汇编指令与逻辑移位汇编指令一致,都有左移和右移汇编指令。
SHR (shift logical right):逻辑右移
指令功能:将目的操作数地址中的数据右移COUNT位,移出的最高位保存到CF标志,空出的高位则补充0(与算术移位指令不同)
虽然逻辑移位指令把数据解释为无符号数,但仍影响OF标志,且仍按照带符号数溢出的判断逻辑进行设置。
因此,SHL、SHR都可能出现带符号数溢出的情况。
但是,程序员往往不关心SHL,SHR中的OF标志。
ROL (rotate left):循环左移
ROL DEST,COUNT
指令功能:把目的地址中的数据循环左移COUNT位,从高位(左)移出的数据位都补充到低位(右),移出的最低位保存到CF标志位。
如果COUNT=1,OF标志有意义,如果移位前后数据的符号位发生了变化,OF=1;如果符号位没有发生变化,OF=0。如果COUNT>1,OF标志不确定(没有意义)
ROR (rotate right):循环右移
指令功能:把目的地址中的数据循环右移COUNT位,从低位(右)移出的数据位都补充到高位(左),移出的最高位保存到CF标志位。
标志位影响:CF、OF,标志位的解释和循环左移指令中完全一致。
RCL (rotate left through carry):带进位循环左移
指令功能:将CF与目的操作数看作一个整体,CF作为最高位(最左),对整体数据循环左移COUNT位。
标志位影响:CF标志作为数据最高位参加移位操作;OF标志位的解释与循环移位指令一致。
RCR (rotate right through carry) :带进位循环右移
利用循环移位实现高字节移位
注意:多字多字节每次只能移动一位,否则OF没有意义,而且CF只能容纳一位数据。