欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【0415】基本指令系统

程序员文章站 2022-03-10 09:47:37
...

基本指令系统

指令属性:指令长度,指令时间

指令按照格式分类:双操作数指令,单操作数指令,无操作数指令

设计那么多指令的目的:在程序设计时可以更加清楚,灵活。

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)堆栈操作指令【0415】基本指令系统在程序中定义一个堆栈段:

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

相关标签: 汇编语言 汇编