分类
(1)数据传送;
(2)算术运算;
(3)逻辑运算;
(4)串操作;
(5)程序控制;—-转移指令
(6)处理器控制;
1、传送指令MOV
MOV DST(目的作数) ,SRC(源操作数)
(1)CPU内部寄存器之间的数据传送。
mov ah,al
mov dl,bh
mov bp,sp
mov ax,cs
mov ds,bx
此指令把一个字节或一个字从源操作数SRC传送至目的操作数DST。源操作数可以是累加器、寄存器、存储单元及立即数。目的操作数为:累加器、寄存器和存储单元。
注意:源和目的不能同时为段寄存器,CS不能为目的IP不能为源,也不能做目的,这种例外永远存在。不影响标志位
2、传送指令
(1)立即数送至通用寄存器或存储单元(各种存储器寻址方式)。
mov al,3
mov si,-5
mov varb,-1 ;varb表示变量名,代表一个存储单元
mov varw,3456h ;varw是一个字变量
mov [si],6543h
注意:立即数不能直接传送到段寄存器,需借助其他通用寄存器(mov ax,5000h mov ds,ax)。立即数永远不能做目的操作数。
(2)寄存器与存储器之间的数据传送。
mov ax,varw ;varw为字变量,存储器操作为直接寻址
mov bh,[di] ;存储器操作数为寄存器间接寻址
mov di,es:[si+3] ;存储器操作数为相对变址寻址,使用段超越前缀
mov bp,[bx+si+3] ;存储器操作数为相对基址加变址寻址
mov [bp],ax ;使用SS段寄存器
mov varb,dl ;varb是一个字节变量
mov ds:[bp],dl ;使用段超越前缀
mov varw,ds ;varw是字变量
mov es,varw
注意:源操作数和目的操作数类型必须一致,并且不能同时为存储器操作数或段寄存器,需借助其他通用寄存器(mov bx,[si] mov [di],bx)。mov ax,cs mov ds,ax
3、交换指令
利用交换指令可方便地实现通用寄存器与通用寄存器或存储单元之间的数据交换
XCHG OPRD1,OPRD2
将操作数1的内容与操作数2的内容互换。操作数同时是字节或字。
xchg al,ah
xchg si,bx
OPRD1和OPRD2可以是通用寄存器和存储单元。但不包括段寄存器,也不能同时是存储单元或立即数。可采用各种寻址方式来指定存储单元。
xchg [si+3],al
xchg [si+bp+3],bx
不影响标志位
4、地址传送指令
(1)LEA指令(Load Effective Address):传送有效地址指令
LEA REG,OPRD
将操作数OPRD的有效地址传送到操作数REG。操作数OPRD必须是一个存储器操作数,操作数REG必须是一个16位通用寄存器。
lea ax,buffer ;buffer为变量名
lea dx,[bx+3]
lea si,[bp+di+4]
注意:LEA指令和MOV指令有本质的区别;假设buffer变量的偏移是1234h,该字变量的值为5678h,lea ax,buffer执行后ax=1234h;mov ax,buffer执行后,ax=5678h
不影响标志位
(2)LDS指令:段值和段内偏移构成32位的地址指针。该指令传送32位地址指针。
LDS REG,OPRD
将操作数OPRD中所含的一个32位地址指针的段值部分送到数据段DS,偏移部分送入REG寄存器。操作数OPRD必须是一个32位的存储器操作数,REG可以是一个16位的通用寄存器,实际往往是变址寄存器或基址寄存器。
(3)LES指令也是传送32位地址指针
LES REG,OPRD
将操作数OPRD中所含的一个32位地址指针的段值部分送到附加段ES,偏移部分送入REG寄存器。其他与LDS指令相同。
5、堆栈操作指令
堆栈是一段RAM内存空间,栈底一端地址较大,栈顶一端地址较小。段值为SS寄存器,SP始终指向栈顶。
后进先出的原则用途:
(1)现场和返回地址保护;
(2)寄存器内容的保护;
(3)传递参数;
(4)存储局部变量
不影响标志位
进栈指令PUSH
把16位数据压入堆栈PUSH SRC该指令把源操作数SRC压入堆栈。先把栈顶指针SP减2,然后把源操作数SRC送入SP指向的栈顶。
源操作数可以是通用寄存器和段寄存器,也可以是字存储单元
PUSH SI
PUSH DS
PUSH VARW ;字变量
PUSH [SI]
假设AX=8A9BH
PUSH AX
出栈指令POP
POP DST
POP AX
标志操作指令
1、标志传送指令
(1)LAHF指令:LAHF该指令把标志寄存器的低8位(SF,ZF, ,AF, ,PF, ,CF)传送至AH寄存器的指定位。
(2)SAHF指令:SAHF该条指令和LAHF相反,把寄存器AH的指定位送至标志寄存器低8位。不影响高8位的OF,DF,IF,TF标志。
(3)PUSHF指令:PUSHF该条指令把寄存器的内容压入堆栈,即先把堆栈指针寄存器SP的值减2,然后把标志寄存器的内容送入由SP所指的栈顶。
(4)POPF指令:POPF该条指令把当前堆栈顶的一个字传送到标志寄存器,同时相应地修改堆栈指针,即把SP加2。
PUSHF指令和POPF指令一起使用,起到保护和恢复标志寄存器的作用。
2、标志操作指令
(1)CLC指令 | 格式CLC 功能:CF置0 |
---|---|
(2)STC指令 | 格式STC 功能:CF置1 |
(3)CMC指令 | 功能:进位标志CF取反 |
(4)CLD指令 | 功能:DF置0 |
(5)STD指令 | 功能:DF置1 |
(6)CLI指令 | 功能:IF置0 |
(7)STI指令 | 功能:IF置1 |
加一指令INC
inc a 相当于 add a,1 // i++
优点:速度比add指令快,占用空间小
这条指令执行结果影响AF、OF、PF、SF、ZF标志位,但不影响CF进位标志位。
减一指令DEC
dec a 相当于 sub a,1 // i—
优点:速度比sub指令快,占用空间小
这条指令执行结果影响AF、OF、PF、SF、ZF标志位,但不影响CF进位标志位。
比较指令CMP
CMP的功能相当于减法指令,只是不保存结果。CMP指令执行后,将对FLAG标志寄存器产生影响
CMP指令格式:CMP LES REG,OPRD
如果比较的是两个无符号数,则ZF和CF表示的两个操作数之间的关系如表所示:
如果比较的是两个有符号数,则SF、ZF和OF表示的两个操作数之间的关系如表所示:
下面用三段代码来说明标志位是如何受到 CMP 影响的
AX=5,并与 10 进行比较,则进位标志位将置 1,原因是(5-10)需要借位:
mov ax, 5
cmp ax,10 ; ZF = 0 and CF = 1
1000 与 1000 比较会将零标志位置 1,因为目标操作数减去源操作数等于 0:
mov ax,1000
mov cx,1000
cmp cx, ax ;ZF = 1 and CF = 0
105 与 0 进行比较会清除零和进位标志位,因为(105-0)的结果是一个非零的正整数
mov si,105
cmp si, 0 ;ZF = 0 and CF = 0