【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)堆栈操作指令屏幕截图(496)在程序中定义一个堆栈段:

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。

可以利用算术移位实现乘除法

SHLshift 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只能容纳一位数据。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值