数据传送类指令
通用数据传输
MOV
- 要注意的一点就是传送时的寻址方式的组合
- 要注意的一点就是传送时的寻址方式的组合
XCHG
- 可以在通用寄存器之间,或者寄存器、存储器之间,使其内容交换
- 值得注意的是 XCHG eax,eax 相当于 NOP
- NOP 即空指令,但处理器处理它的时候会花费时间,而且在主存中也会占用一字节
- 有时会利用NOP来实现短时间延时,或临时占用代码空间以便以后填入需要的指令代码
堆栈操作
push
- 将 寄存器、内存 中16位的数据,或者 段寄存器 的数据压入栈,
- 或者将 寄存器、内存、立即数 中32位的数据压入栈
- push eax 相当于 sub ip,4 \ mov [esp],eax
pop
- 参数方面同上
- pop eax 相当于 add ip,4 \ mov eax,[esp]
堆栈的应用
存数据、函数传参、中断保存寄存器数据等注意:
堆栈操作提供了16位和32位的堆栈操作,但在32位平台还是应该尽量使用32位的堆栈操作
算数运算类指令
- 关于状态标志
在算数运算类指令中很多指令将会影响状态标志,或者读取状态标志。
主要的状态标志有CF、OF、ZF、SF、PF ADD
- 将目的操作数加上源操作数,结果送入目的操作数
- 它支持寄存器与寄存器、立即数、存储单元之间的加法运算
- 可进行8、16、32位运算
ADC
- 在ADD的基础上,再加上当前CF(进位标志)
- 可以实现较大数据的加法
INC
- 只有一个操作数,将操作数增1
- 不会改变cf标志位
SUB
- 将目的操作数减去源操作数,差送入目的操作数
- 支持的寄存器同ADD
SBB
- 在完成SUB的基础上,减去CF标志位
- 可以实现位数较大数的减法
DEC
- 只有一个操作数,将其减1
- 不会改变cf
NEG
- 求补指令,只有一个操作数,对它进行求补,即,用零减去操作数
- 可以用于对负数求补码,或者由附属的补码求其绝对值
CMP
- 进行差值不送入目的操作数的减法操作
- CMP会影响ZF、SF、CF、OF,通过这些标志位可以判断两个操作数的大小关系
- 利用CMP可以实现跳转
MUL
- 可以进行8、16、32位操作数与累加寄存器(AX)的无符号乘法
- 8位乘法用操作数乘al,将积放入ax
- 16位乘法用操作数乘ax,将积的高16位放入dx,低16位放入ax
- 32位乘法,乘eax,将积高32位放入edx,低32位放入eax
IMUL
- 与MUL两点不同,一方面它是有符号乘法、
- 同时它除了可以单操作数(与ax),还可以双操作数,三操作数(必有一个立即数)
- 积溢出则丢掉高位,并设置CF=OF=1,否则CF=OF=0
- DIV
- 进行16,32,64位无符号数的除法
- 16位除法:ax除以操作数,商放入al,余数放入 ah
- 32位除法:被除数高16位放入DX,低16位放入AX,除以操作数,商放入AX,余数放入DX
- 64位除法:被除数高32位放入EDX,低32位放入EAX,除以操作数,商放入EAX,余数放入EDX
- 除法指令对状态标志没有定义,但可能引起0号中断,即除数位零
- 这个问题应由实际应用处理,操作系用只提示错误
- IDIV
- 进行有符号数的DIV
- MOZX
- 将寄存器、内存中的8位或16位无符号数转化为16位或32位数
- MDSX
- 将寄存器、内存中的8位或16位有符号数转化为16位或32位
- CBW
- 进行符号数的扩展,将al扩展为AX
- CWD
- 进行符号数扩展,将AX扩展为DX、AX
- CWDE
- 进行符号数扩展,将AX扩展为EAX
- CDQ
- 进行符号数扩展,将EAX扩展为EDX、EAX
- 十进制调整命令
- 让BCD码的二进制运算跳过6个舍弃的编码,正确反映BCD码运算结果
- 包括AAA、AAS、AAM、AAD对应加减乘除
位操作指令
- 逻辑运算指令
- 包括AND、OR、NOT、XOR,即按位与、或、非、亦或(比较简单)
- TEST 进行不返回结果(只影响状态标志的AND)
- 移位命令
- 分为逻辑移位和算数移位
- SHL、SHR分别是逻辑左、右移位,空位补零,移出位进入CF
- SAL、SAR分别是算数左、右移位,SAL与SHL相同,SAR**高位不变、低位进入CF**
- 循环位移
- rol、ror不带进位循环位移,移出位给cf
- rcl、rcr带进位循环位移,用cf补位,移出位给cf