3.3 80x86的指令系统
指令格式: 操作码 操作数
ADD AL,10H
操作码:指明CPU要执行什么样的操作,有以下几种
数据传送、算术运算、逻辑运算、串操作、控制转移、处理机控制
操作数:指明参与操作的数据或数据所在的地方,操作数有以下三种来源。
- 立即数操作数:操作数在指令中。 MOV AL,9
- 寄存器操作数:操作数在寄存器中。 MOV AL,BL
- 存储器操作数或内存操作数:操作数在内存单元中。 MOV AL,[2000H]
操作数类型
- 指令中有寄存器操作数,有寄存器操作数决定类型。
- 指令操作数中无寄存器,则由内存操作数的类型决定。
- 指令中无类型的依据,需对存储器操作数加类型说明。
执行速度
由快到慢:寄存器操作数 -》 立即数操作数 -》 存储器操作数
3.3.1 数据传送指令
- 通用数据传送指令:MOV、PUSH、POP、XCHG、XLAT
- 地址传送指令:LEA、LDS、LES
- 标志寄存器传送指令:LAHF、SAHF、PUSHF、POPF
- 类型转换指令:CBW、CWD
通用数据传送指令
-
传送指令: MOV DST,SRC
执行操作:(DST)《- (SRC)
注意:1.两个操作数的类型要相同;2.DST、SRC不可同时为段寄存器;3.立即数不能直接送段寄存器;4.DST不能是立即数和CS;5.DST、SRC不能同时为存储器寻址;6.指令指针IP,不能作为MOV指令的操作数;7.不影响标志位。 -
进栈指令: PUSH SRC
执行操作:(SP)<- (SP)-2 ((SP)+1,(SP))<-(SRC) -
出栈指令:POP DST
执行操作:(DST)《-((SP)+1,(SP)) (SP)《- (SP)+ 2
堆栈:‘后进先出’的存储区,段地址存放在SS中,SP在任何时候都指向栈顶,进出栈后自动修改SP。
注意:1.该操作以字为单位;2.该堆栈是栈顶在高位(即底下),栈底在低位(即上面),这点和C语言差别很大。 -
所有寄存器进栈指令:PUSHA
功能:16位通用寄存器依次进栈,次序为AX、CX、DX、BX,指令执行前的SP、BP、SI、DI。执行后(SP)-16 —> (SP),SP仍指向栈顶。 -
所有寄存器出栈指令:POPA
功能:16位通用寄存器依次出栈,次序为DI、SI、BP、SP,指令执行前的B