最近正在学汇编呀,但每次编程时总发现一些 指令 忘 了 , 于是天天翻书好烦呀,就把大多数指令给收集起来 ,每条指令都有详细的说明 ,注意事项呀 不错哦
常用指令集
一、 传送类指令
MOV opd,ops 传送指令——-1,位数一致2,不能传送到DS 3,不能同时为M,不能同时为SR,不能传送到4,不影响标志位
PUSH ops 入栈指令——-1,SP-2–>sp ops—>[sp]
POP ops 出栈指令——-1,SP+2–>sp ops—>[sp]
pusha 入栈指令——-压入八个通用寄存器依次为AX,BX,CX,DX, (TEMP=SP,SP-16)—>SP, BP,SI,DI
popa 出栈指令——-弹出八个通用寄存器 ,顺序与PUSHA相反
XCHG opd ops 交换指令—-opd和ops中有一个是R另一个是R/M;且两个长度必须一致;
LEA opd,ops 有效地址送寄存器指令—ops的EA送到opd,opd是16/32位的R
,OPS是M,对标志位没有影响
LDS opd,ops 指针送寄存器和DS指令—EA=ops,ops为R(16位),OPS为M(32位),
结果对标志位无影响,结果(EA)–>R,(EA+2)–>ds
LES) opd,ops 指针送寄存器和ES指令—EA=ops,ops为R(16位),OPS为M(32位),
结果对标志位无影响,结果(EA)–>R,(EA+2)–>ds
LAHF 标志位送AH指令———标志寄存器的低8位依次—->AH,
顺序(MSB到LSB)分别为:SF|ZF|不定|AF|不定|PF|不定|CF| 不影响标志位
SAHF 送标志寄存器指令——-AH依次—->FLAGS的低8位,
顺序(MSB到LSB)分别为:SF|ZF|不定|AF|不定|PF|不定|CF| 不影响标志位
PUSHF 标志进栈指令———–flags—->堆栈,不影响标志位
POPF 标志出栈指令———–从当前堆栈—–>flasg
二、算术类指令
(双操数指令中两个操作数中除源操作数可以是立即数外必须有一个操作数在寄存器中。
单操作数指令不允许使用立即数寻址方式,算术运算类指令的寻址方式均遵循这一规则)
ADD opd,ops 加法指令—————-opd+ops—>opd,会影响标志位
ADC opd,ops 带进位加法指————opd+ops+CF—>opd,会影响标志位
INC ops 加1指令—————–opd+1——->opd,不会影响标志位
XADD opd,ops 交换并相加指令———-opd+ops—–>temp,opd—>ops,temp—>opd,
该指令只能用于486机型以上
SUB opd,ops 不带借位的减法指令——opd-ops—>opd,会影响标志位
SBB opd,ops 带借位的减法指令——–opd-ops-CF—>opd,会影响标志位
DEC ops 减1指领—————–opd+1——->opd,不会影响标志位
NEG ops 求补指令—————-操作数按位求反后末位加1,
等价于 0FFFFH-OPD+1—>OPD
CMP opd,ops 比较指令—————-OPD-OPS ,结果不保存,只是根据结果设置标志位,CMP后往往跟随一条转移指令
MUL OPS 无符号数乘法指令———字节操作数AL*OPS—>AX,字操作数: AX*OPS—->DX:AX,双字操作数:EAX*OPS–>EDX:EAX
IMUL 有符号数乘法指令———与MUL一致,只是有带符号
说明:乘法指令:8位*8位=16位,16位*16位=32位,
ops可以是除了立即数以外的任何一种寻址方式.
DIV ops 无符号数除法指令———ax/ops(8位)的商—–>al,
ax/ops(8位)的余数—–>ah
———dx:ax/ops(16位)的商—>AX
,DX:AX/OPS的余数—>DX
IDIV ops 有符号数除法指令——与MUL一致,只是有带符号,商和余数也是有符号的,且余数的符号与被除数的符号相同
说明:寻址方式和乘法指令相同
CBW 字节转换为字指令——–AL内容符号扩展到AH,形成AX中的字
.即AL的最高有效为0,则AH=0,al的最高位为1,则AH=0FFH
CWD 字转换为双字指令——–AX内容符号扩展到DX,形成DX中的字.
即AX的最高有效为0,则DX=0,al的最高位为1,则DX=0FFH
DAA 压缩的BCD码加法十进制调整指令—-把AL中的两个压缩BCD码之和调整为压缩BCD码的格式—>AL
DAS 压缩的BCD码减法十进制调整指令—-同上
AAA 非压缩的BCD码加法十进制调整指令–把AL中的两个非压缩BCD码之和调整为非压缩BCD码的格式–AL,AH+调整产生的进位值–>ah
AAS 非压缩的BCD码加法十进制调整指令–同上
三、逻辑与移位指令
AND opd,ops 逻辑与指令—-opd∧ops—>opd
OR opd,ops 逻辑或指令—-opd∨ops—>opd
XOR opd,ops 逻辑异或指令—opd异或OPS–>OPD
NOT ops 逻辑非指令—–OPD求反—->OPD
TEST 测试指令——-OPD∧OPS,仅建立结果特征标志
说明:opd和OPS均可以是八位,十六位,三十二位的R/M;ops 可以是八,十六,三十二位的D,如同时有OPD和OPS,其长度一致,不能同时为M
SAL opd,ops 逻辑左移指令——OPD是8/16/32位的R/M;OPS是计数值(即移位的次数),有三种情形:OPS可是是1,8位的立即数 或CL的内容(移位前次数–>CL),并将结果送回OPD,最低位补0,最后移出的最高难度位保存在CF中;
SHL OPD,OPS 算术左移指令——-与SAL 相同
SHR OPD,OPS 逻辑右移指令——-OPD是8/16/32位的R/M;OPS是计数值(即移位的次数),有三种情形:OPS可是是1,8位的立即数 或CL的内容(移位前次数–>CL),并将结果送回OPD,最高位补0,最后移出的最低位保存在CF中
SAR OPD,OPS 算术右移指令——–与SHR相似只是最高位保持不变戏法
ROL OPD,OPS 循环左移指令————-OPD和OPS同移位指令相同,CF不参与循环,MSB<-..-LSB<–MSB,且MSB—>CF
ROR OPD,OPS 循环右移指令————-OPD和OPS同移位指令相同,CF不参与循环,MSB-..->LSB–>MSB,且LSB—>CF
RCR OPD,OPS 带进位循环左移————OPD和OPS同移位指令相同,CF也参与循环,CF—>MSB…..LSB—–>CF
RCL OPD,OPS 带进位循环左移————OPD和OPS同移位指令相同,CF也参与循环,CF<—MSB…..LSB<—-CF
四、控件条件移指令
JMP opd 无条件转移指令
1.简单的条件转移指令
JZ(或jE) OPR—————结果为零转移, 测试条件ZF=1
JNZ(或jNE) OPR ————–结果不为零转移,测试条件ZF=0
JS OPR———————-结果为负转移, 测试条件SF=1
JNS OPR———————结果为正转移, 测试条件SF=0
JO OPR——————— 溢出转移, 测试条件OF=
JNO OPR ——————–不溢出转移 , 测试条件SF=0
JP OPR ———————结果为偶转移, 测试条件SF=1
JNP OPR ——————–结果为奇转移 , 测试条件SF=0
JC OPR ——————– 有进位转移 , 测试条件SF=1
JNC OPR ——————–无进位转移, 测试条件SF=0
2.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移)
JB(或JNAE) opd ————–小于或者不大于等于则转移
JNB(或JAE) opd—————不小于或者大于等于则转移
JA(或NJBE) OPD—————大于或者不小于等于则转移
JNA(或JBE) OPD—————不大于或者小于等于则转移
3.带符号比较条件转移指令
JL(或JNGE) ————–小于或者不大于等于则转移
JNL(或JGE)————–不小于或者大于等于则转移
JG(或NJLE)—————大于或者不小于等于则转移
JNG(或JLE)—————不大于或者小于等于则转移
4.测试CX为0则转移的指令
JCXZ OPD ————CX=0 则转移
5.循环指令
loop ——–cx-1–>cx!=0时执行循环
LOOPZ/E ——–ZF=1且CX-1!=0时执行循环
LOOPNZ/LOOPNE—-ZF=0且CX-1–>CX!=0时执行循环
五、标志位处理指令
CLC———-进位位清0指令,0–>CF
CMC———-进位位求反指令,并送CF
STC———-进位位置1指令,1–>CF
CLD——— 方向位清0指令,0–>DF
STD——— 方向们置1指令,1–>DF
CLI———中断标志位清0指令,0–>IF
STI———中断标志位置1指令,1–>IF
六、调用子程序与返回指令
CALL 子程序调用指令
RET 子程序返回指令
七、串操作指令
1.MOVS OPD,OPS 串传送指令—两串元素类型必须一致,根据类型执行MOVSB(传送字节串元素)/MOVSW(传送字串元素)
该指令将DS:SI指向的源串OPS中的一个字节/字传送到ES:DI指定的目的串OPD,并自动修改指针,不影响标志位,当DF=0时,SI和DI增量1(字节)/2(字),当DF=1时,SI和DI减量1(字节)/2(字)
2.CMPS opd,ops 串比较指令—两串元素类型必须一致,根据类型执行MOVSB(传送字节串元素)/MOVSW(传送字串元素),
该指令将DS:SI指向的源串OPS中的一个字节/字传减ES:DI指定的目的串OPD,根据结果修改标ZF,OF,AF,CF,PF,SF, 并自动修改指针,不影响标志位,当DF=0时,SI和DI增量1(字节)/2(字),当DF=1时,SI和DI减量1(字节)/2(字)
3.LODS OPS 从源串取指令—- 根据类型执行LODSB/LODSW,将OPS 送隐含操作数al(字节)/ax(字),并自动修改指针,不影响标志位,当DF=0时,SI增量1(字节)/2(字),当DF=1时,SI和DI减量1(节)/2(字)
4.STOS OPD 存入串指令—根据类型执行STOSB/STOSW,将隐含操作数al(字节)/ax(字)送入 OPD串,并自动修改指针,不影响标志位,当DF=0时,和DI增量1(字节)/2(字),当DF=1时,DI减量1(节)/2字)
5.SCAS———串扫描指令— 根据类型执行SCASB/SCASW,AL—>ES:[DI],当DF=0时,SI和DI增量1(字节)/2(字),当DF=1时,SI和DI减量1(字节)/2(字)
REP 无条件重复CX中指定的次数,如 REP CX=4,REP MOVSB;表示重复MOVSB操作四次,即取到4个字符.
REPE/REPZ cx!=0且ZF=1时重复;否则停止;
REPNE/REPNZ cx!=0且ZF=0时重复;否则停止;
八、其它指令
OFFSET ——————– 返回偏移地址
SEG ——————– 返回段地址
EQU(=) ——————– 等值语句
PURGE ——————– 解除语句
DUP ——————– 操作数字段用复制操作符
SEGMENT,ENDS ——————– 段定义指令
ASSUME ——————– 段地址分配指令
ORG ——————– 起始偏移地址设置指令
$ ——————–地址计数器的当前值
PROC,ENDP ——————– 过程定义语句
NAME,TITLE,END ——————– 程序开始结束语句
MACRO,ENDM ——————–宏定义指令
XLAT (TRANSLATE) ——————– 换码指令—-
IN 输入指令
OUT 输出指令
九、条件标志
ZF 零标志 — 当结果为负时,SF=1,否则,SF=0.
AF 辅助进位标志—运算过程中第三位有进位值,置AF=1,否则,AF=0
PF 奇偶标志——当结果操作数中偶数个”1″,置PF=1,否则,PF=0
SF 符号标志—-当结果为负时,SF=1;否则,SF=0.溢出时情形例外
CF 进位标志—– 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,置CF=1;否则,CF=0.
OF 溢出标志—–若操作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0
附录: M—-内存,R—为寄存吕,D—-立即数,SR—-段寄存器,OPS—源操作数,OPD—–目的操作数