16asm -指令
文章目录
- 前言
- 指令种类
- 数据传送指令
- 通用传送指令
- 堆栈操作指令
- 标志寄存器进出堆栈指令
- 地址传送指令
- 算术运算指令
- 比较指令
- 加法
- 减法
- 乘法
- 除法
- 逻辑恒等式
- 符号拓展指令
- 位运算指令
- 移位指令
- 总结
前言
- 各位师傅大家好,我是qmx_07,今天给大家讲解指令的相关知识
指令种类
- 数据传送指令
- 算术运算指令
- 位操作类指令
- 控制转移类指令
- 处理器控制类指令
数据传送指令
通用传送指令
- mov 指令:把一个字节或字的操作数从源地址传送至目的地址,不支持存储器到存储器(内存 到 内存)
例子:
mov ax,es //ax<-es
mov ds,ax //ds<-ax<-es
mov word ptr[si+2],0bh
演示:
- xchg 指令:把两个地方的数据进行互换,不存在存储器到存储器(内存 到 内存)
例子:
xchg al,bl
演示:
应用场景:
1.寄存器与寄存器之间对换数据
2.寄存器与存储器之间对换数据
效率: xchg > mov XCHG使用了内部暂存器
- xlat指令:将BX指定的缓冲区中、AL指定的位偏移的一个字节数据取出赋给AL
例子:
mov ax,9 //偏移9位
xlat
//AL <- DS:[BX+AL]
找到bx的缓冲区 //红线
通过al偏移 //橙线
提取内容赋值给al //绿线
应用场景:数组遍历
宽度:8位
堆栈操作指令
- push指令:将标志寄存器的内容压入堆栈,同时栈顶指针SP减2
//模拟
mov [sp],reg
sub sp,2
演示:
- pop指令:将栈顶单元内容送到标志寄存器,同时栈顶指针SP 加 2
//模拟
add sp,2
movreg, [sp]
演示:
标志寄存器进出堆栈指令
- 介绍: 用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作
地址传送指令
介绍:将存储器单元的逻辑地址送至指定的寄存器
lea 指令:将存储器操作数的有效地址传送至指定的16位寄存器中
例子: lea bx,[bx + si] // 相当于 bx = bx + si
演示:
作用:
- 取全局变量的地址
- 代替加法指令表,如:多个寄存器做加法运算
算术运算指令
比较指令
- cmp指令: 目的操作数-源操作数,根据结果设置标志位,结果不存入目的地址
cmp OPD,OPS
演示:
作用:一般用于程序分支结构
进位标志反映无符号整数运算结果是否超出范围有进位,加上进位或借位后运算结果仍然正确
溢出标志反映有符号整数运算结果是否超出范围有溢出,运算结果已经不正确
- 介绍: 实现二进制 和十进制 数据的四则运算
加法
//reg寄存器
//imm立即数
//mem内存
例子:
add ax,12
add [si],ax
演示:
- 演示:
- CY 表示有进位,溢出
inc指令: +1,不改变CF位
减法
- 演示:
例子:
dec指令:-1,不改变CF位
例子:
neg 指令: 如果ax = 0,则CF标志位 = 0;若ax != 0, 则CF = 1
并且让通用寄存器 取反
例子:
乘法
- 乘法指令分为无符号乘法指令和有符号乘法指令
- 功能:显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中
无符号乘法:
例子:
mov ax, 5 ; 将 5 存储到累加器寄存器 ax 中
mov bx, 10 ; 将 10 存储到通用寄存器 bx 中
mul bx ; 用 bx 中的值乘以 ax 中的值,结果存储在寄存器组中
演示:
有符号乘法:
如果乘积的高一半位(AH,DX,EDX)不是低位的符号拓展,则:
两种标志位情况:
CF = OF = 1;
- 8位:说明结果超过了8位
- 16位:说明结果超过了16位
CF = OF = 0
- 8位:都能存下
- 16位:都能存下
除法
除法也分为无符号除法和有符号除法
无符号除法:
例子:
有符号除法:
逻辑恒等式
符号拓展指令
- 符号拓展:用一个操作数的符号位(最高位)形成另一个操作数
- 结果:后一个操作数个位是0或者1
cbw 指令:将AL中的符号拓展位拓展至AH中,操作数是隐含固定的(字节转换为字)
- 例子:
cwd 指令:将AX中的符号拓展位拓展至DX中,操作数是隐含固定的(字节转换为双字)
位运算指令
逻辑与 and:
and Reg/Mem,Reg/Mem/imm
演示:
逻辑或 or:
and Reg/Mem,Reg/Mem/imm
例子:
逻辑非 not:
not reg/mem
演示:
异或 xor:
xor reg/mem ,reg/mem/imm
移位指令
移位:
shl、sal指令:左移一位,补0
shl(sal) reg/mem, 1立即数 或者 存储在cl里
例子:
sar 指令:算术右移,高位补位
sar reg/mem, 1立即数 或者 存储在cl里
例子:
shr 指令:右移一位,补0
例子
循环移位:
rol 指令:循环左移,高位补位
演示:
ror指令: 循环右移,高位补位
rcl指令:进位循环左移,CF位补位
rcr:进位循环右移,CF位补位
总结
- 介绍了数据传送指令,算术运算指令,符号拓展指令,位运算指令