基本指令系统
传送类指令
把数据、地址或立即数从一个存储位置搬运到另一个存储位置(相对于高级语言里的赋值语句)
- 通用数据传送: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数据传送方向
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位存放在高地址单元
- 完成初始化后,栈顶地址高于栈底地址,因为堆栈中无数据,为一个空栈
- 每次入栈。SP-2(32位时-4)
- 为避免堆栈溢出,要设置最大堆栈空间
- 存取原则:后进先出
入栈指令
格式:PUSH SRC(通用寄存器或字存储单元的内容)
把源操作数压入堆栈,是单操作数指令(其实使用了一个隐含操作数,在堆栈中)
- SP-2→SP:先修改栈顶指针,使它向低地址移动一个字单元
- (SRC)→(SP):把数据保存至SP指向的字存储单元
出栈指令
格式:POP DEST
把栈顶数据取出,保存到目的地址中,是单操作指令,同PUSH
- (SP)→DEST:把SP当前指向的栈顶数据送到指定地址保存
- SP+2→SP:修改栈顶指针,使它向高地址移动一个字单元
标志位传送指令
取标志指令
格式:LAHF
功能:AH←(FR) 7-0,是无操作数指令,使用了两个隐含操作数,由机器指令的OPCODE指定
存标志指令
格式:SAHF
功能:FR 7-0←(AH),无操作数指令,影响标志位:SF、ZF、AF、PF、CF
地址传送指令
装入有效地址指令
格式: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指令完全一致,但是不保存运算结果,只关心两个数的关系(标志位状态)
通常用来和条件转移指令配合使用,实现程序的分支或循环结构