指令合集
MOV OPD, OPS; MOVE DEST SRC
XLAT; TRANSLATE ([BX+AL])->AL
LEA OPD, OPS; LOAD EFFECTIVE ADDRESS 立即寻址 等价于 MOV OPD, OFFSET OPS, 其中 OPD 必须是 16/32 位寄存器
;标志位?
NEG OPD; NEGTIVE 将 OPD 的每一位取反最后加一, 包括符号位, 得到结论: 负数"取补码"得到绝对值
IMUL OPD, OPS;INTEGER MULTIPLICATION (OPD)*(OPS)->OPD
IMUL OPD, OPS, N; (OPS)*N->OPD
IMUL OPS;
(AL)*(OPS)->AX
(AX)*(OPS)->DX, AX
(EAX)*(OPS)->EDX, EAX
MUL
DIV OPS;
(AX)/(OPS)->AL 商, AH 余数
(DX, AX)/(OPS)->AX 商, AH 余数
(EDX, EAX)/(OPS)->EAX商, EDX余数
IDIV
NOT OPD; 取反
AND OPD, OPS; 逻辑与
TEST OPD, OPS
常见用法: TEST ECX, ECX 判断 ecx 是否为空, 如果为空则 zf=1
总结: test 是逻辑与运算, cmp 是 sub 运算, cmp a1, a2 执行操作 a1-a2
XOR OPD, OPS; 异或
SAL OPD, N 或者 SHL OPD, N; ARITHMATIC SHIFT LEFT, SHIFT LEFT 左移, 逻辑算数都一样
SHR OPD, N; 逻辑右移, 加 0
SAR OPD, N; 算数右移, 加符号位
ROL OPD, N; 循环左移
ROR OPD, N
RCL OPD, N; ROTATE LEFT WITH CARRY 带进位循环左移
RCR OPD, N
ABOVE, BELOW 无符号, GREATER LESS 有符号
JA; JUMP WHEN ABOVE
JNA; JUMP WHEN NOT ABOVE
JAE; JUMP WHEN ABOVE OR EQUAL
JNAE; JUMP WHEN NOT ABOVE OR EQUAL 不大于, 且不等于
JB; JUMP WHEN BELOW
JNB; JUMP WHEN NOT BELOW
JBE; JUMP WHEN BELOW OR EQUAL
JNBE;
JG; JUMP WHEN GREATER
JNG
JGE; JUMP WHEN GREATER OR EQUAL
JNGE; JUMP WHEN NOT GREATER OR EQUAL
JL; JUMP WHEN LESS
JNL; JUMP WHEN NOT LESS
JLE
JNLE; JUMP WHEN NOT LESS OR EQUAL
JE; JUMP WHEN EQUAL
JZ; JUMP WHEN HAS ZERO FLAG JZ=JE
JNE
JNZ
JO; JUMP WHEN HAS OVERFLOW FLAG
JC; JUMP WHEN HAS CARRY FLAG
;pf: 奇偶标志位, 结果中 1 为偶数 pf=1, 否则 0
JP; JUMP WHEN HAS PARITY(奇偶) FLAG
JPO; JUMP WHEN PARITY FLAG IS ODD, JP = JPE
JPE; JUMP WHEN PARITY FLAG IS EVEN, JNP = JPO
JS; JUMP WHEN HAS SIGN FLAG
INT; INTERRUPT
DW; DEFINE WORD
PROC; PROCEDURE
ENDS; END SEGMENT
PTR; POINTER
MOVSX; EXTENDED MOVE WITH SIGN DATA
MOVZX; EXTENDED MOVE WITH ZERO DATA
***********************
PUSH OPS; SP=SP-1
POP OPD; SP=SP+1
DIV;https://blog.csdn.net/loovejava/article/details/7044242
IMUL OPD, OPS; 有符号数乘法
IMUL OPD, OPS, N; OPS*N->OPD
IMUL OPS; AL*OPS->AX 字节
AX*OPS->DX,AX 字
EAX*OPS->EDX,EAX 双字
MUL;无符号乘法,用法同上
ADD AX,10;把 ax 加上 10 再存到 ax 里
SUB
LOOP 标号
逻辑移位, 总是用 0 补充
SHL EDX, 7;EDX 左移 7 位
shr ;右移
算数移位, 用符号位补充
sar;右移
CBW ;将 AL 中的符号扩展到 AH 里
;意义 无符号比较 有符号比较
> JA, JNBE JG, JNLE
>= JAE, JNB JNC, JGE, JNL
< JB, JNAE JC, JL, JN, JNGE
< JBE, JNA JLE, JNG
CMP BYTE PTR[SI],"#" ;ptr前面的类型有byte(字节)、word(字)、dword(双字)、qword(四字)、tbyte(十字节)、far(远类型)和near(近类型)
LEA
lea指令
load effective address, 加载有效地址,可以将有效地址传送到指定的的寄存器。指令形式是从存储器读数据到寄存器, 效果是将存储器的有效地址写入到目的操作数, 简单说, 就是C语言中的”&”.
mov指令
在CPU内或CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意立即数不能直接送段寄存器),从段寄存器到寄存器或存储单元。
但是注意
(1) MOV指令中的源操作数绝对不能是立即数和代码段CS寄存器;
(2) MOV指令中绝对不允许在两个存储单元之间直接传送数据;
(3) MOV指令中绝对不允许在两个段寄存器之间直接传送数据;
(4) MOV指令不会影响标志位
使用[]区别
第二操作数加不加中括号[]的区别就是:
lea对变量没有影响是取地址,对寄存器来说加[]时取值,第二操作数不加[]非法
mov对变量来说没有影响是取值,对寄存器来说是加[]时取地址,第二操作数不加[]是取值