目录
指令种类
数据传送指令
通用传送指令
堆栈操作指令
标志寄存器进出堆栈指令
地址传送指令
算术运算指令
加法减法指令
乘法除法指令
指令种类
数据传送类指令
- 通用数据传送指令:MOV ,XCHG,XLAT
- 堆栈传送指令:PUSH,POP,LEA
算术运算指令:负责算术运算,影响标志位
位操作类指令
控制转移类指令
处理器控制类指令
数据传送指令
MOV,XCHG,XLAT
传送类指令不影响标志位,除了标志位传送指令外。
通用传送指令
mov指令
把一个字节或字的操作数从源地址传送至目的地址。注意:不存在存储器向存储器的传送指令。
举例:mov ax,es ;ax←es mov ds,ax ;ds←ax←es mov word ptr [si+2],0bh
注意: 两个操作数类型要一致.操作宽度
不允许段寄存器向段寄存器传送
xchg指令
把两个地方的数据进行互换。不存在存储器向存储器的传送指令。
XCHG reg,reg/mem; reg <->reg/mem
应用场景:1.寄存器与寄存器之间对换数据 2.寄存器与存储器之间对换数据
效率:XCHG > MOV :因为XCHG使用了内部暂存器。
示例:xchg ax,bx
xlat指令
将BX指定的缓冲区中、AL指定的位偏移的一个字节数据取出赋给AL。
XLAT ; AL <- DS:[BX+AL] //注意:无显式操作数,隐式操作数。
应用:数组遍历。以BX作为数组首地址,AL作为数组下标,访问的值存储给AL。AL = BX[AL];
作用宽度:8位(字节),固定的,不可改变。也叫累加器专用指令。
堆栈操作指令
push:将标志寄存器的内容压入堆栈,同时栈顶指针SP减2 模拟:sub sp , 2; mov [sp] , reg
pop:将栈顶单元内容送到标志寄存器,同时栈顶指针SP 加 2 模拟:movreg, [sp];add sp , 2
应用:1. 临时存放数据,2. 传递参数,3. 保存所有寄存器环境
注意:1. 低地址方向为栈出口方向,高地址方向为栈底方向。
2. 操作单位是字16位
标志寄存器进出堆栈指令
标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作。
低八位传送:LAHF和SAHF
LAHF指令将标志寄存器的低字节送寄存器AH
LAHF;AH←FLAGS的低字节
SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意
SAHF将AH寄存器内容送FLAGS的低字节
SAHF;FLAGS的低字节←AH
用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志
16位传送:PUSHF和POPF
pushf:将标志寄存器的内容压入堆栈,同时栈顶指针SP减2
popf:将栈顶单元内容送到标志寄存器,同时栈顶指针SP加2
问题:修改标志寄存器中TF标志位的方法?
思路:将标志寄存器压入栈中,然后弹出栈顶内容(标志寄存器的内容)。修改该值,然后将修改后的值压入栈,通过POPF,将修改后的值弹出到标志寄存器。
地址传送指令
将存储器单元的逻辑地址送至指定的寄存器。
- 有效地址传送指令 LEA
- 指针传送指令 LDS 和 LES
作用:
- 取全局变量的地址
- 代替加法指令表,如:多个寄存器做加法运算。【32位没有EA限制,可大大的替换】
lea指令:将存储器操作数的有效地址传送至指定的16位寄存器中
举例: LEA bx ,[bx + si] //相当于bx = bx+si。
lds指令:LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器
举例:LDS r16,mem;r16←mem,;DS←mem+2
les指令:LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器
LES r16,mem;r16←mem,;ES←mem+2
算术运算指令
标志一览
进位标志反映无符号整数运算结果是否超出范围有进位,加上进位或借位后运算结果仍然正确
溢出标志反映有符号整数运算结果是否超出范围有溢出,运算结果已经不正确
加法减法指令
add指令:
adc指令
sub指令
sbb指令
inc指令:对操作数加1(增量)再将结果返回原处。不影响进位CF标志,影响其他状态标志位
dec指令:对操作数减1(减量)再将结果返回原处。不影响进位CF标志,影响其他状态标志位
neg ax ;如果ax = 0,则CF标志位 = 0;若ax != 0, 则CF = 1
乘法除法指令
计算机的乘法指令分为无符号乘法指令和有符号乘法指令。
它们的唯一区别就在于: 数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。
功能:指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。
无符号乘法
mov ax, 5 ; 将 5 存储到累加器寄存器 ax 中
mov bx, 10 ; 将 10 存储到通用寄存器 bx 中
mul bx ; 用 bx 中的值乘以 ax 中的值,结果存储在寄存器组中
位数 | 隐含的被乘数 | 乘积的存放位置 | 举例 |
8位 | AL | AX | MUL BL |
16位 | AX | DX-AX | MUL BX |
32位 | EAX | EDX-EAX | MUL ECX |
影响标志位:CF 和 OF ; 利用CF和OF判断成绩的高位是否有效。
两种标志位情况:
- 要么CF = OF = 1;
-
- 8位:说明结果超过了8位
- 16位:说明结果超过了16位
- 要么CF = OF = 0
-
- 8位:都能存下
- 16位:都能存下
有符号乘法
mov eax, 5 ; 将 5 存储到累加器寄存器 eax 中
mov ebx, -10 ; 将 -10 存储到通用寄存器 ebx 中
imul ebx ; 用 ebx 中的值与 eax 中的值相乘,结果存储在寄存器组中
影响的标志位:
两种标志位情况:
- 如果成绩的高位是低位的符号扩展,则CF = OF = 0,否则CF = OF = 1
其他标志位:没有定义,不可预测的
无符号除法
除法也分为无符号除法和有符号除法。
除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。
除数位数 | 隐含的被除数 | 商 | 余数 | 举例 |
8位 | AX | AL | AH | DIV BH |
16位 | DX-AX | AX | DX | DIV BX |
32位 | EDX-EAX | EAX | EDX | DIV ECX |
指令的格式:DIV Reg/Mem指令的功能是用显式操作数去除隐含操作数(都作为无符号数)。
影响的标志位:指令对标志位的影响无定义。
有符号除法
指令的格式:DIV Reg/Mem指令的功能是用显式操作数去除隐含操作数(都作为无符号数)。
影响的标志位:指令对标志位的影响无定义。