【0415】基本指令系统

    技术2023-04-02  92

    基本指令系统

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

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

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

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

    Processed: 0.017, SQL: 9