基本指令系统

传送类指令

把数据、地址或立即数从一个存储位置搬运到另一个存储位置(相对于高级语言里的赋值语句)

  • 通用数据传送:MOV、PUSH、POP
  • 地址传送:LEA、LDS、LES

1. 数据传送类指令(MOVE)

格式:MOV DSET, SRC

可以使用各种寻址方式,但两个操作数中只允许有一个为存储器寻址,因此若要实现两个内存单元间的数据传送,必须通过两条数据传送指令实现,使用寄存器作为数据传送的中转站

eg:把DA_WORD1字单元的内容传送到DA_WORD2字单元中

MOV AX, DA_WORD1
MOV DA_WORD2, AX

立即数传送

MOV AL, 4        // 字节传送
MOV CX, 0ffh    // 字传送
MOV byte ptr [si], 0ah    // byte ptr说明是字节操作
MOV word ptr [si+2], 0bh    // word ptr说明是字操作

没有使用寄存器寻址的指令中,必须指明内存单元的类型(字or字节),否则数据类型会出现二义性,汇编出现警告错误!

寄存器之间数据传送

MOV AX, BX        // 字传送
MOV AH, AL        // 字节传送

寄存器与存储器之间数据传送

MOV DX, [BP]
MOV DL, [SI]

MOV数据传送方向

image-20220328110941302.png

TIP

  • 两个操作数数据类型要相同,8或16位
  • 立即数不能作为目的操作数
  • 指令指针IP不能作为MOV指令的操作数
  • 两个操作数不能同时为存储单元,eg:MOV VAR1, [1000H]错误

2. 交换指令(Exchange)

格式:XCHG DEST, SRC(不能使用立即数)

寄存器间交换

XCHG AX, BX
XCHG AL, AH

寄存器与存储器交换

XCHG AX, [2000H]    // 字交换
XCHG AL, [2000H]    // 字节交换

同数据传送指令一样,两个操作数不能均在内存中,要想交换可以这样

eg:将字节存储单元DAB1,DAB2内容交换

MOV AL, DAB1
XCHG AL, DAB2
MOV DAB1, AL

堆栈操作指令

8086/8088堆栈的组织

  • SP所指向地址称为堆栈的栈顶,存放栈顶偏移量
  • 堆栈存放的是字数据,16位数据的低8位存放在低地址单元,高8位存放在高地址单元
  • 完成初始化后,栈顶地址高于栈底地址,因为堆栈中无数据,为一个空栈

image-20220411082539079.png

  • 每次入栈。SP-2(32位时-4)
  • 为避免堆栈溢出,要设置最大堆栈空间
  • 存取原则:后进先出

入栈指令

格式:PUSH SRC(通用寄存器或字存储单元的内容)

把源操作数压入堆栈,是单操作数指令(其实使用了一个隐含操作数,在堆栈中)

  1. SP-2→SP:先修改栈顶指针,使它向低地址移动一个字单元
  2. (SRC)→(SP):把数据保存至SP指向的字存储单元

image-20220411083859838.png

出栈指令

格式:POP DEST

把栈顶数据取出,保存到目的地址中,是单操作指令,同PUSH

  1. (SP)→DEST:把SP当前指向的栈顶数据送到指定地址保存
  2. SP+2→SP:修改栈顶指针,使它向高地址移动一个字单元

image-20220411090550124.png

标志位传送指令

取标志指令

格式:LAHF

功能:AH←(FR) 7-0,是无操作数指令,使用了两个隐含操作数,由机器指令的OPCODE指定

image-20220411090908996.png

存标志指令

格式:SAHF

功能:FR 7-0←(AH),无操作数指令,影响标志位:SF、ZF、AF、PF、CF

image-20220411091047698.png

地址传送指令

装入有效地址指令

格式:LEA DEST, SRC

功能:DEST←SRC的有效地址,即将源操作数的有效地址送到目的地址保存

LEA指令的源操作数必须是内存操作数,只有内存操作数的寻址方式中才有有效地址(偏移量)

目的操作数只能是16为的通用寄存器,因为有效地址是一个16位的无符号二进制编码

算术运算类指令

加法指令

格式:ADD DEST, SRC

功能:DEST←(DEST)+(SRC),影响标志位

  • 两个操作数单位必须一致(字或字节)
  • 源操作数可以为通用寄存器、内存单元、立即数
  • 目的操作数可以为通用寄存器、内存单元
  • 最多一个内存操作数

加1指令

格式:INC DEST

功能:DEST←(DEST)+1,影响标志位

目的操作数可为通用寄存器、内存单元

减法指令

格式:SUB DEST, SRC

功能:DEST←(DEST)-(SRC),影响标志位

减1指令

格式:DEC DEST

功能:DEST←(DEST)-1,影响标志位

求相反数指令

格式:NEG DEST

功能:DEST←0-(DEST),影响标志位,相当于求补操作

比较指令

格式:CMP DEST, SRC

功能:(DEST) - (SRC),影响标志位

CMP指令的执行过程、对操作数的要求、对标志位的影响与SUB指令完全一致,但是不保存运算结果,只关心两个数的关系(标志位状态)

通常用来和条件转移指令配合使用,实现程序的分支或循环结构

最后修改:2022 年 05 月 07 日
如果觉得我的文章对你有用,请随意赞赏