汇编语言——指令系统

一种计算机所能执行的各种类型的指令的集合称为该计算机的指令系统。
Intel8086/8088CPU指令系统的指令可以分为六大类:
  1.传送类指令
  2.算术运算类指令
  3.位操作类指令
  5.程序转移类指令
  6.处理器控制类指令

从指令的格式划分,一般可以分为三种:
  1.双操作数指令:OPR DEST SRC
  2.单操作数指令:OPR DEST
  3.无操作数指令
对于无操作数指令,包含两种情况:
  (1)指令不需要操作数,如暂停指令HLT。
  (2)在指令格式中,没有显式地指明操作数,但是它隐含指明了操作数的存放地方,如指令PUSHF。

1、传送类指令

传送类指令的作用是将数据信息或地址信息传送到一个寄存器或存储单元中,可以分为以下四种情况:

1.通用数据传送指令

指令格式:MOV DEST, SRC
作用:将源操作数指定的内容传送到目的操作数,即DEST<=(SRC)。
当指令执行完后,目的操作数原有的内容被源操作数内容覆盖,即目的操作数和源操作数具有相同内容。
MOV指令对标志寄存器的各位无影响;
MOV指令可以是字节数据传送也可以是字数据传送,但是源操作数和目的操作数的长度必须一致。
MOV指令可以分为以下几种情况:

(1)立即数传送到通用寄存器或存储单元

例:
MOV AH, 10H
MOV AX, 2345H
MOV M-BYTE, 64H
MOV M-WORD, 2364H


注意:立即数只能作为源操作数,立即数不能传送给段寄存器。

(2)寄存器之间的传送

例:
MOV AH, CH
MOV DS, AX
MOV ES, BX
MOV AX, CS
MOV CS, AX ; 错误


注意:段寄存器CS只能作源操作数,不能作目的操作数。

(3)寄存器与存储单元之间传送

例:
MOV AL, [SI]
MOV [DI], AH
MOV AX, 10[BX]
MOV TABLE[BP], BX
MOV DS, [SI][BX]


综合,MOV指令在使用时需注意以下几个问题:
立即数只能作为源操作数,且它不能传送给段寄存器。
段寄存器CS只能作源操作数,段寄存器之间不能直接传送。
存储单元之间不能直接传送数据
MOV指令不影响标志位

2.交换指令

指令格式:XCHG DEST, SRC
作用:源操作数和目的操作数两者内容相互交换,即:(DEST)<=>(SRC).
指令对标志寄存器各位无影响;
数据交换可以在寄存器之间或寄存器与存储单元之间进行。但是不能在存储单元之间进行数据交换。
寄存器只能使用通用寄存器。
例:
XCHG AX, BX
XCHG AH, CH
为了完成两个存储单元(DA_BYTE1和DA_BYTE2)之间的数据交换可以使用以下三条指令来实现。
MOV AL, DA_BYTE1 ; AL <= (DA_BYTE1)
XCHG AL, DA_BYTE2 ; (AL) <=> (DA_BYTE2)
XCHG AL, DA_BYTE2 ; (AL) <=> (DA_BYTE2) 等价于 MOV DA_BYTE1, AL

3.标志传送指令

对标志寄存器进行存取的指令有4条,它们都是无操作数指令,即指令隐含指定标志寄存器、AH寄存器或堆栈寄存器为操作数。

(1)取标志寄存器指令

指令格式:LAHF
作用:将标志寄存器的低8位送入AH寄存器,即将标志SF、ZF、AF、PF、和CF分别送入AH的第7、6、4、2、0位,而AH的第5、3、1位不确定。
指令执行对标志寄存器各位无影响,即标志寄存器各位不变。

(2)存储标志寄存器指令

指令格式:SAHF
作用:将寄存器AH中的第7、6、4、2、0位分别送入标志寄存器SF、ZF、AF、PF和CF各标志位。而标志寄存器高8位中的各标志位不受影响。

(3)标志进栈指令

指令格式:PUSHF
作用:先将堆栈指针SP减去2,使其指向堆栈顶部的空字单元,然后将16位标识寄存器的内容送SP指向的字单元。

(4)标志出栈指令

指令格式:POPF
作用:将由SP指向的堆栈顶部的一个字单元的内容送入标志寄存器,然后SP的内容加2.

4.地址传送指令

这类指令有3条,它们的作用是将存储单元的地址送寄存器。

(1)装入有效地址

格式:LEA DEST, SRC
其中:源操作数SRC必须是一个字节或字存储器操作数(地址),DEST必须是一个16位通用寄存器。
作用:将SRC存储单元地址中的偏移量,即有效地址EA传送到一个16位通用寄存器中。
指令执行对标志寄存器各位无影响。
例:
LEA AX, [BX][SI]
源操作数使用的是基址变址寻址方式,它所形成的有效地址就是BX的内容加上SI的内容。即
AX <= (BX)+(SI)
注意:它不是将BX和SI所寻址的存储单元的内容送入AX。

比较指令LEA BX, DS:[23H]与MOV BX, DS:[23H]的功能

(2)装入地址指令指针

格式:LDS DEST, SRC
LES DEST, SRC
其中:DEST是任意一个16位通用寄存器。SRC必须是一个存储器操作数。
作用:把SRC存储单元开始的4字节单元的内容(32位地址指针)送入DEST通用寄存器和段寄存器DS(LDS)或ES(LES指令),其中低字单元内容为偏移量送通用寄存器,高字单元内容为段基值送DS或ES。
例:LDS SI, TABLE[BX]
设TABLE的值为0A02H,(BX)=34H,(DS)=2030H

2、算术运算类指令

8086/8088指令系统中有加、减、乘、除指令,这些指令可以对字节数据或字数据进行运算。
参加运算的数可以是无符号数,也可以是带符号数。带符号数用补码表示。
参加运算的数可以是二进制数,也可以是十进制数(以BCD码表示)。

1.加法指令

指令格式:ADD DEST, SRC
功能:目的操作数和源操作数相加,其和存放到目的操作数中,而源操作数内容保持不变,即DEST <= (DEST)+(SRC)。
根据相加的结果将影响到标志寄存器的CF、PF、AF、ZF、SF和OF。
DEST只能是通用寄存器或存储器操作数。不能是立即数。
SRC可以是通用寄存器、存储器或立即操作数
DEST和SRC不能都为存储器操作数。
ADD指令可以是字节操作数相加,也可以是字操作数相加。
例:分析下列各指令功能

(1)ADD AX, CX

功能:将寄存器AX的内容与CX的内容相加,结果传送到AX中

(2)ADD AH, DATA_BYTE

功能:将由直接寻址方式所指示的存储单元的内容与AH内容相加,结果送回AH中。

(3)ADD CX, 10H

功能:将常数10H加入到CX中。为字操作数指令

(4)ADD AX, [BX][SI]

功能:将由基址变址寻址方式所指示的存储单元的内容加入到AX中。

2.带进位加法指令

指令格式:ADC DEST, SRC
该指令的功能与ADD基本相同,所不同的是其结果还要加上进位标志位CF的值,即:
DEST <= (DEST)+(SRC)+CF
根据相加的结果设置标志寄存器中的CF、PF、AF、ZF、SF和OF
注意:参加运算的进位CF是本条指令执行之前的值。
用ADC指令可以实现数据长度大于16位的两数相加

例:计算12349678H + 377425H
MOV AX, 1234H
MOV BX, 9678H
ADD BX, 7425H
ADC AX, 37H

指令执行后,结果的高16位在AX,低16位在BX中。

3.加1指令

指令格式:INC DEST
该指令为单操作数指令,其功能是将目的操作数加1,并送回到目的操作数,即:
DEST <= (DEST)+1
目的操作数可以是任意的8位、16位通用寄存器或存储器操作数。目的操作数被视为带符号二进制数。
根据指令执行结果设置PF、AF、ZF、SF和OF标志,但不影响CF。INC指令主要用于某些计数器的计数和修改地址指针。
例:
INC CL
INC SI
INC COUNT

4.减法指令

指令格式:SUB DEST, SRC
功能:目的操作数的内容减去源操作数的内容,结果送入目的操作数,源操作数中内容保持不变。即:
DEST <= (DEST)-(SRC)
操作结果将影响标志位CF、PF、AF、ZF、SF和OF。
目的操作数DEST和源操作数SRC可以是8位或16位的通用寄存器、存储器操作数,但两者不能同时为存储器操作数。立即数只能作源操作数。

例:
SUB AX, BX
SUB AH, 10H
SUB DX, DA_WORD
SUB DA_BYTE, BL

注意:减法指令对借位标志的影响,若采用变减为加的运算方法,则产生的进位与CF标志结果相反。

5.带借位减法

指令格式:SBB DEST, SRC
该指令的功能与SUB指令基本相同,不同的是在两个操作数相减后再减去进位标志CF的值。即:
DEST <= (DEST)-(SRC)-CF.
注意:该CF的值是本条指令执行前的结果。
SBB指令在使用上与ADC类似,主要用于长度大于16位的数相减,即将低16位相减的结果引入高位部分的减法中。
根据指令执行结果设置PF、AF、ZF、SF、OF和CF。

6.减1指令

指令格式:DEC DEST
该指令为单操作数指令,将目的操作数的内容减1后,送回到目的操作数。即:DEST<=(DEST)-1
DEST可以是8位16位的通用寄存器存储器操作数,该指令将DEST看作是带符号二进制数。
根据指令操作结果PF、AF、ZF、SF和OF,但不影响CF。
DEC指令的使用类似INC指令。主要用于计数和修改地址指针,计数方向与INC指令相反。
例:
MOV AL, 10H
DEC AL
JNC LOP

7.求负数指令

指令格式:NEG DEST
功能:用零减去目的操作数的内容,并送回目的操作数,即:DEST<=0-(DEST)
DEST可以是任意一个8位或16位的通用寄存器或存储器操作数,被视为带符号的操作数。
由于机器中带符号数用补码表示,求操作数的负数就是求补操作。因此,NEG指令也叫取补指令。
NEG指令将影响标志PF、AF、ZF、SF、CF和OF。
对进位标志CF的影响:
只有当操作数为零时,进位标志CF被置零,其它情况都被置1.
对溢出标志OF的影响:
当字节操作数为-128,或字操作数为-32768时,执行NEG指令结果操作数将无变化,但溢出标志OF被置1.

例:设AL中存放一个正数(AL)=25H,BL中存放一个负数(BL)=-58H,求它们的相反数,即负数。
    NEG AL
    NEG BL
指令执行后,(AL)=-25H=11011011B
          (BL)=58H=01011000B     

 

3、位操作类指令

1.逻辑运算指令

逻辑运算指令共有4条,它们的指令格式分别是:

与:    AND DEST, SRC
或:    OR DEST, SRC
异或:  XOR DEST, SRC
非:    NOT DEST

DEST和SRC可以是8位或16位的通用寄存器或存储器操作数,但两者不能同时为存储器操作数,SRC可以为立即数。
逻辑指令对标志位的影响:
NOT指令对标志位无影响。而其余三条指令将根据结果影响SF、ZF和PF,而CF和OF总是置0,AF为不确定。
逻辑运算指令除用来实现各种逻辑运算之外,还常用于对字节或字数据的某些位的组合、分离或位设置。

posted @ 2018-06-19 02:13 Python学习者 阅读(...) 评论(...) 编辑 收藏