数据传送指令
mov: 传送 mov dst,sec => 就是把SRC的内容传送到DST中
push: 进栈 push SRC => 就是把SRC压入堆栈(目的操作数),目的操作数地址由SS:SP指定,指令中无需给出
pop:出栈 pop DST将源操作数弹出到目的操作数,源操作数由SS:SP指定,无需给出
xchg: 交换
我们这里简单的演示一下入栈和出栈操作
执行后效果如下
这个程序本质上就是我们先给bx寄存器赋值1234然后bx的值入栈,最后值出栈并赋值给ax,所以ax也就变成了1234
下面我们演示一下change指令,我们在执行前ax=1234 bx=2333。然后交换一下,可以看到ax和bx的值交换了一下
累加器专用指令
这里端口是CPU与外设传送数据的接口,单独编址,不属于内存,端口地址范围是0000-FFFFH,这组指令只限于AX,AL
IN: 输入 IN AL,PORT/DX 这里把port或者DX的值输入到累加器中(一个是长格式,一个是短格式)
OUT: 输出 OUT PORT/DX,AL 这里把port的数据输出到端口
XLAT: 换码,这个用于转换编码
地址传送指令
LEA 有效地址传送(这个就是用来取变量的有效地址的)
这里我们bx就直接变成了2333这个地址
LDS 指针送寄存器和DS(这个暂时不知道干嘛的,先跳过)
标志寄存器传送指令
这里感觉没啥用,应该用的不多
LAHF 标志送AH寄存器
SAHF AH送标志寄存器
PUSHF 标志入栈
POPF 标志出栈
类型扩展指令
这个是为了解决操作数长度不一致的问题
CBW: 字节扩展成字(这里默认会把低位寄存器(al)扩展到ax中)
CWD:字扩展成双字
我们来个代码测试一下,使用r可以查看当前寄存器的状态,首先我们在内存中输入下面这些指令
AH,11(就是AX的高位赋值为11)
此时寄存器的值如下所示
我们执行CBW效果如下
ax自动获取了低位的数据,执行CBW后效果如下
这里我们可以看到bx变成0了,这里其实就是自动把ax寄存器的内容扩展到(dx,ax)这两个寄存器中,dx存放高位,ax存放低位
加法指令
ADD DST,SRC =》 这里就是把SRC加到DST中
ADC 带进位加发
INC 加1
比如我们初始的时候ax为 6,然后我们给寄存器+1
减法指令
SUB 减法
SBB 带错位减法
DEC 减一
BEG求补
CMP比较
这个我就不过多介绍,操作和上面的一样
乘法指令
MUL 无符号数乘法
IMUL 有符号数乘法
在乘法指令中,目的操作数默认为累加器AX,我们先给ax置为2然后在给bx置为3,然后进行乘法运算测试
可以看到,ax变成了6
除法指令
DIV 无符号数除法
IDIV 有符号数除法
在除法指令中,目的操作数必须是累加器ax和dx,同样不需要给出,下面我们继续用ax测试,ax为3,执行指令后ax变成了2
逻辑与移位指令
AND 与
OR 或
NOT 非
XOR 异或
TEST 测试
移位指令
SHL 逻辑左移
SAL 算数左移
SHR 逻辑右移
SAR 算数右移
ROL 循环左移
ROR 循环右移
RCL 带进位的循环左移
RCR 带进位的循环右移
移位指令都是双操作数指令
前面那个是寄存器后面是移动的位数,(注意,如果位数为1,那么就直接填1,如果大于1那么就是要cl寄存器),我们先把bx寄存器的值设为3,然后向cl寄存器中写入3,然后对bx寄存器进行移位操作,效果如下
可以看到bx的寄存器数据变成了0030,成功向左移动了4位
串操作指令
MOVS 串传送
CMPS 串比较
SCAS 串扫描
STOS 存入串
LODS 从串取
串只能处理单个字节或单个串,所以我们需要使用前缀指令来处理比较长的字符串
REP 重复,REPE/REPZ 相等/为0则重复,REPNE/REPNZ 不相等/不为0则重复
程序转移指令
无条件转移
JMP 无条件转移到指令指定的地址去执行程序
条件转移
有10种指令,这里就懒得写了
循环指令
LOOP OPR玄幻
LOOPZ/LOOPE 当为0/当相等时循环
LOOPNZ/LOOPNE 当不为0/当不相等时循环