常用指令系统介绍


数据传送指令

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/当不相等时循环


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录