std在汇编语⾔是什么指令_详解汇编语⾔各种指令的解释与⽤
法
【数据传输指令】
⼀、通⽤数据传送指令
1、传送指令MOV(move)
指令的汇编格式:MOV DST,SRC 指令的基本功能:(DST)
2、进栈指令 PUSH(push onto the stack)
出栈指令 POP (pop from the stack) 指令的汇编格式:PUSH SRC ;POP DST 指令的基本功能:PUSH指令在程序中常⽤来暂存某些数据,⽽POP指令⼜可将这些数据恢复。PUSH SRC (SP)
3、交换指令 XCHG(exchange)
指令的汇编格式:XCHG OPR1,OPR2 指令的基本功能:(OPR1)(OPR2) 指令⽀持的寻址⽅式:⼀个操作数必须在寄存器中,另⼀个操作数可以在寄存器或存储器中。指令对标志位的影戏:不影响标志位。
指令的特殊要求:不允许使⽤段寄存器。
⼆、累加器专⽤传送指令
4、输⼊指令 IN(input)
输出指令 OUT (output) 指令的汇编格式:IN ac,port port<=0FFH IN ac,DX port>0FFH OUT port,ac port<=0FFH OUT DX,ac port>0FFH 指令的基本功能:对8086及其后继机型的微处理机,所有I/O端⼝与CPU之间的通信都由输⼊输出指令IN和OUT来完成。IN 指令将信息从I/O输⼊到CPU,OUT指令将信息从CPU输出到I/O端⼝,因此,IN和OUT指令都要指出I/O端⼝地址。 IN ac,port
port<=0FFH (AL)0FFH (AL)0FFH (DX)
5、换码指令 XLAT(translate)
指令的汇编格式:XLAT opr 或 XLAT 指令的基本功能:这条指令根据AL寄存器提供的位移量,将BX指使的字节表格中的代码换存在AL 中。 (AL)
三、地址传送指令
6、有效地址传送器 LEA(load effective address)star movies
指令的汇编格式:LEA reg,src 指令的基本功能:LEA指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由src选定的⼀种存储器寻址⽅式确定的。指令⽀持的寻址⽅式:各种存储器寻址⽅式。指令对标志位的影响:不影响标志位。指令的特出要求:指令中reg 不能是段寄存器;
7、指针送寄存器和DS LDS(load DS with point)
指针送寄存器和ES LES (load ES with point) 指令的汇编格式:LDS reg,src LES reg,src 指令的基本功能:LDS和LES指令把确定内存单元位置的偏移地址送寄存器,段地址DS或ES。这个偏移地址和段地址(也称地址指针)是由src指定的两个相继字单元提供的。 LDS reg,src (reg)
四、标志寄存器传送指令
8、标志寄存器的低字节送AH LAHF(load AH with FLAGS)
指令的汇编格式:LAHF 指令的基本功能:(AH)
opening9、AH送标志寄存器低字节 SAHF(store AH into FLAGS) 指令的格式:SAHF 指令的基本功能:(FLAGS)0-7
10、标志进栈 PUSHF(push the flags)
大写字母表指令的汇编格式:PUSHF 指令的基本功能:(SP)
11、标志出栈 POPF(pop the FLAGES)
指令的汇编格式:POPF 指令的基本功能:(FLAGS)0-15
【算术指令】
⼀、加法指令
12、加法指令 ADD(addition)
指令的汇编格式:add dst,src 指令的基本功能:(dst)
13、带进为加法指令 ADC(add with carry)
指令的汇编格式:ADD dst,src 指令的基本功能:(dst)
super junior 6辑14、加1指令 INC(increament)
指令的汇编格式:INC opr 指令的基本功能:(opr)
⼆、减法指令
15、减法指令 SUB(subtract) 指令的汇编格式:SUB dst,src 指令的基本功能:(dst)
16、带借位减法指令 SBB(subtract with borrow)
指令的汇编格式:SBB dst,src 指令的基本功能:(dst)
17、减1指令 DEC(decrement)
altogether
指令的汇编格式:DEC opr 指令的基本功能:(opr)
18、⽐较指令 CMP(compare)
指令的汇编格式:CMP opr1,opr2 指令的基本功能:(opr1)-(opr2),根据相减结果设置条件码,但不回送结果。指令⽀持的寻址⽅式:他们两个操作数不能同时为存储器寻址。即为除源操作数为⽴即数的情况外,源操作数和⽬地操作数必须有⼀个寄存器寻址⽅式。指令对标志位的影响:
SF=1 减法结果为负数(符号位为1) SF=0 减法结果为正数(符号位为0) ZF=1 减法结果为零 ZF=0 减法结果不为零 CF=1 ⼆进制减法运算中audrey hepburn
最⾼有效位向⾼位有借位(被减数⼩于减数,不够减的情况) CF=0 ⼆进制减法运算中最⾼有效为向⾼位⽆借位(被减数〉=减数,够减的情况) OF=1 两数符号相反(正数-负数,或负数-正数),⽽结果符号与减数相同。 OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
19、求补指令 NEG(negate)
指令的汇编格式:NEG opr 指令的基本功能:(opr)
20、⽆符号乘法指令 NUL(unsigned multiple)
有符号乘法指令 IMUL(signed muliple) 指令的汇编格式:NUL src IMUL src 指令的基本功能:(AX)
四、符号扩展指令
charge是什么意思
21、节扩展为字 CBW(convert byte to word)
指令的汇编格式:CBW 指令的基本功能:(AH)=00H 当(AL)的最⾼有效位为0时 (AH)=FFH 当(AL)的最⾼有效位为1时指令对标志位的影响:不影响标志位指令的特殊要求:这是条⽆操作数的指令,进⾏符号扩展的操作数必须存放在AL寄存器 AX寄存器中。
witch是什么意思22、字扩展为双字 CWD(convert word to double word)
指令的汇编格式:CWD 指令的基本功能:(DX)=0000H 当(AX)的最⾼有效位为0时 (DX)=FFFFH 当(AX)的最⾼有效位为1时指令对标志位的影响:不影响标志位指令的特殊要求:这是条⽆操作数的指令,进⾏符号扩展的操作数必须存放在AL寄存器或AX寄存器中。
五、除法指令
23、⽆符号数除法 DIV(unsigned divide) 带符号数除法 IDIV (singed divide) 指令的汇编格式:DIV src IDIV src 指令的基本功能:字操作 (AL)
六、⼗进制调整指令
【逻辑指令】
⼀、逻辑运算
指令的格式:ANDdst,src 指令的基本功能:(dst)
⼆、移位指令
29、逻辑左移 SHL(shift logical left) 指令的汇编格式:SHL dst,cnt 指令的基本功能:SHL指令向左逐
位移动cnt次,每次逐位移动后,最低位⽤0来补充,最⾼位移⼊CF。指令⽀持的寻址⽅式:⽬的操作数dst可以是除⽴即数外的任何寻址⽅式。移位次数(或位
数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放⼊CL寄存器中。指令对标志位的影响:CF=移⼊的数值 OF=1 当cnt=1时,移动后最⾼位的值发⽣变化。 OF=0 当cnt=1时,移动时最⾼位的值未发⽣变化。 SF、ZF、PF根据移动后的结果设置
30、逻辑右移 SHR (shift logical right) 指令的汇编格式:SHR dst,cnt 指令的基本功能:SHR指令向右逐位移动cnt次,每次逐位移动后,最⾼位⽤0来补充,最低位移⼊CF。指令⽀持的寻址⽅式:⽬的操作数dst可以是除⽴即数外的任何寻址⽅式。移位次数(或位
数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放⼊CL寄存器中。指令对标志位的影响:CF=移⼊的数值 OF=1 当cnt=1时,移动后最⾼位的值发⽣变化。 OF=0 当cnt=1时,移动时最⾼位的值未发⽣变化。 SF、ZF、PF根据移动后的结果设置。 31、算术左移SAL(shift arithmetic left) 指令的汇编格式:SAL dst cnt 指令的基本功能:SAL指令向左逐位移动cnt次,每次逐位移动后,最低位⽤0来补充,最⾼位移⼊CF。指令⽀持的寻址⽅式:⽬的操作数dst可以是除⽴即数外的任何寻址⽅式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放⼊CL寄存器中。指令对标志位的影响:CF=移⼊的数值 OF=1 当cnt=1时,移动后最⾼位的值发⽣变化。 OF=0 当cnt=1时,移动
时最⾼位的值未发⽣变化。 SF、ZF、PF根据移动后的结果设置。 32、算术右移 SAR(shift arithmetic right) 指令的汇编格式:SAR dst,cnt 指令的基本功能:SAR指令向右逐位移动cnt次,每次逐位移动后,最⾼位⽤符号位来补充,最低位移⼊CF。指令⽀持的寻址⽅式:⽬的操作数dst可以是除⽴即数外的任何寻址⽅式。移位次数(或位数)cnt=1时,1可以直接写在指令
中,cnt〉1时,cnt必须放⼊CL寄存器中。指令对标志位的影响:CF=移⼊的数值 OF=1 当cnt=1时,移动后最⾼位的值发⽣变化。
OF=0 当cnt=1时,移动时最⾼位的值未发⽣变化。 SF、ZF、PF根据移动后的结果设置。 33、循环左移 ROL(rotate left) 指令的汇编格式:ROL dst,cnt 指令的基本功能:ROL 对由dst指定的寄存器或存储器操作数左移循环移动cnt所指定的次数,每左移⼀次,把最⾼位同时移⼊CF和操作数最低位。指令⽀持的寻址⽅式:⽬的操作数dst可以是除⽴即数外的任何寻址⽅式。移动次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放⼊CL寄存器中。指令对标志位的影响:CF=移⼊的数值 OF=1 当cnt=1时,移动后最⾼位的值发⽣变化。 OF=0 当cnt=1时,移动时最⾼位的值未发⽣变化。 SF、ZF、PF根据移动后的结果设置。 34、循环右移 ROR(rotate right)指令的汇编格式:ROR dst,cnt 指令的基本功能:ROR 对由dst指定的寄存器或存储器操作数右移循环移动cnt所指定的次数,每右移⼀次,把最低位同时移⼊CF和操作数最⾼位。指令⽀持的寻址⽅式:⽬的操作数dst可以是除⽴即数外的任何寻址⽅式。移动次数(或位
数)cnt=1时,1可以直接写在指令中,cnt>1时,cnt必须放⼊CL寄存器中。指令对标志位的影响:CF=移⼊的数值 OF=1 当cnt=1时,移动后最⾼位的值发⽣变化。 OF=0 当cnt=1时,移动时最⾼位的值未发⽣变化。 SF、ZF、PF根据移动后的结果设置。 35、带进位的循环左移RCL(rotate left through carry) 指令的汇编格式:RCL dst,cnt 指令的基本功能:RCL 对由dst指定的寄存器或存储器操作数,连同进位标志CF左循环移动,m所指定的次数,每左移⼀次,把操作数的最⾼位移⼊CF,⽽CF中原有内容移⼊操作数的最低位。指定⽀持的寻址⽅式:⽬的操作数dst可以是除⽴即数外的任何寻址⽅式。移动次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放⼊CL寄存器中。指令对标志位的影响:CF=移⼊的数值。 OF=1 当cnt=1时,移动后最⾼位的值未发⽣变化。 OF=0 当cnt=1时,移动后最⾼位的值发⽣变化。 SF、ZF、PF标志位不受影响。 36、带进位的循环右移 RCR(rotate right through carry) 指令的汇编格式:RCR dst,cnt 指令的基本功能:RCR 对由dst指定的寄存器或存储器操作数,连同进位标志CF右循环移动,m所指定的次数,每右移⼀次,把操作数的最⾼低位移⼊CF,⽽CF中原有内容移⼊操作数的最⾼位。指令⽀持的寻址⽅式:⽬的操作数dst可以是除⽴即数外的任何寻址⽅式。移动次数(或位数)cnt=1时,1可以直接写⼊指令中,cnt〉1时,cnt必须放⼊CL寄存器中。指令对标志位的影响:CF=移⼊的数值。 OF=1 当cnt=1时,操作数最⾼位的值未发⽣变化。 OF=0 当cnt=1时,操作数最⾼位的值发⽣变化。 SF、ZF、PF标志位不受影响。
【串处理指令】
⼀、设置⽅向标志指令
37、DF置零 CLD(clear direction flag) DF置⼀ STD (t direction flag) 指令的汇编格式:CLD STD 指令的基本功能:CLD DF=0 STD DF=1 ⼆、串处理指令 38、串传送 MOVSB / MOVSW(move string byte/word) 指令的汇编格式:MOVSB MOVSW 指令的基本功能:(ES:DI)
三、串重复前缀
43、重复执⾏串 REP 指令的汇编格式:REP (CX)=重复次数指令的基本功能:① (CX)=0时,串指令执⾏完毕,否则执⾏② ~ ④ ②(CX)←(CX)-1③ 执⾏串指令(MOVS或STOS)④ 重复执⾏① 44、相等/为零时重复执⾏串指令 REPE/REPZ 指令的汇编格式:REPE / REPZ (CX)=⽐较/扫描的次数指令的基本功能:① (CX)=0或ZF=0时,结束执⾏串指令,否则继续② ~ ④ ② (CX)←(CX)-1③ 执⾏串指令(CMPS或SCAS)④ 重复执⾏① 45、不等/不为零时重复执⾏串指令 REPNE / PEPNZ 指令的汇编格式:REPNE / PEPNZ (CX)=⽐较/扫描的次数指令的基本功能:① (CX)=0或ZF=1,结束执⾏串指令,否则继续② ~ ④ ② (CX)←(CX)-1③ 执⾏串指令(CMPS或SCAS)④ 重复执⾏①
【控制转移指令】
⼀、⽆条件转移指令
46、短转移 JMP SHORT label(short jump) 指令的汇编格式:JMP SHORT label 指令的基本功能:(IP)
⼆、条件转移指令
指令的汇编格式及功能根据条件码的值转移: 49、JZ(JE) OPR ZF=1 ZF=0(运算结果为0,ZF就置1) 50、JNZ(JNE) OPR ZF=0 51、JS OPR SF=1 SF=0(⼆进制最⾼位是什么,SF就是什么,如最⾼位为1则SF=1) 52、JNS OPR SF=0 53、JO OPR OF=1 OF=1 (两个负数相加变成正数,溢出) 54、JNO OPR OF=0 55、JP OPR PF=1 PF=0 (反映结果“1”的个数,奇数☞0 偶数个☞1) 56、JNP OPR PF=0 57、JC OPR CF=1CF=1(最⾼位有进位或借位就置1) 58、JNC OPR CF=0 ⽐较两个⽆符号数,根据⽐较的结果转移
59、JB(JNAE,JC) OPR CF=1 被减数⼩于减数则转移 60、JNB(JAE,JNC) OPR CF=0 被减数⼤于或等于减数则转移 61、JBE(JNA) OPR CF或ZF=1 被减数⼩于或等于减数则转移 62、JNBE(JA) OPR CF或ZF=0 被减数⼤于减数则转移⽐较两个带符号数,根据⽐较结果转移 63、JL/JNGE OPR SF异或OF=1 被减数⼩于减数则转移 64、JNL/JGE SF异或OF=0 被减数不⼩于减数则转移 65、JLE/JNE (SF异或OF)与ZF=1 被减数不⼤于减数则转移 66、JNLE/JG (SF异或OF)与ZF=0 被减数⼤于减数则转移根据CX寄存器的值转移 67、JCXZ (CX)=0 CX内容为零则转移指令的特殊要求:所有条件转移指令都是短转移指令,转移的⽬标地址必须在当前IP地址的-128⾄
+127字节范围之内,因此条件转移指令是2字节指令。
三、循环指令
68、循环LOOP(loop) 指令的汇编格式:LOOP label 指令的基本功能:① (CX)←(CX)-1 ② 若(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是⽤8位带符号数来表⽰的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。 69、为零/相等时循环 LOOPZ/LOOPE(loop while nonzero or equal) 指令的汇编格式:LOOPNZ/LOOPNE label 指令的基本功能:① (CX)←(CX)-1 ② 若ZF=1且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是⽤8位带符号数来表⽰的,转向地址在相对于当前IP 值的-128 ~ +127字节范围之内。 70、不为零/不相等时循环 LOOPNZ/LOOPNE(loop while nonzero or not equal) 指令的汇编格式:LOOPNZ/LOOPNE label 指令的基本功能:① (CX)←(CX)-1 ② 若ZF=0且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是⽤8位带符号数来表⽰的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。
四、⼦程序调⽤
71、段内直接近调⽤ CALL SUBROUT 指令的基本功能:(SP)
五、返回指令
73、段内返回(近返回) RET 指令的基本功能:(IP)
② 修改堆栈指针:(SP) ← (SP)+N
六、中断及中断返回指令
74、INT n 中断指令(interrupt),n为中断类型号 执⾏操作:① ⼊栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)
② ⼊栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS) (SP) ← (SP)-2,((SP)) ← (IP)
③ 转中断处理程序:(IP) ← (n×4) (CS) ← (n×4+2) 75、IRET 中断返回指令(return from interrupt) 执⾏操作:① 返回地址出栈:(IP) ← ((SP)),(SP) ← (SP)+2 (CS) ←((SP)),(SP) ← (SP)+2 ② FLAGS出栈:(FLAGS) ← ((SP)),(SP) ← (SP)+2 76、INTO 溢出则中断(中断类型为4) 执⾏操作:若OF=1(有溢出),则: ① ⼊栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS) ② ⼊栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS) (SP) ← (SP)-2,((SP)) ← (IP) ③ 转中断处理程序:(IP) ← (4×4)= (10H) (CS) ← (4×4+2)= (12H
HELLO,WORLD进阶汇编程序系列
Editor:admin Time:2004-3-21 12:49 Read:9785 Score:8 Print Writer:LLUCT
Excerpt:80x86汇编⼩站
Preface:
感谢⽹友lluct为本站提供原创......适合初学者学习哦
中国新年 bbc
Content:
TITLE ***HELLO,WORLD进阶程序之选择分⽀ BY LLUCT***
DATA SEGMENT ;定义数据段
afl
MSG1 DB '***WELCOME TO MY PROGRAM BY LLUCT***','$'
;定义输出的第⼀个字符串信息,字符串必须⽤DB定义,$为结束标志MSG2 DB '1:BASIC MESSAGE 2:ADVANCED MESSAGE','$'
;定义输出的字符串信息:选择菜单
MSG3 DB 'PLEASE CHOOSE:','$'
;定义输出的字符串信息:选择前缀
MSG4 DB 'HELLO,WORLD!^-^','$'
;定义输出的字符串信息:分⽀1的信息
MSG5 DB 'THIS IS MY FIRST ASM_86 PROGRAM! @^-^@','$' ;定义输出的字符串信息:分⽀2的信息
ERRMSG DB 'CHOOSE ERROR! -_-b','$'
;定义输出的字符串信息:选择错误信息
DATA ENDS ;数据段结尾
CODE SEGMENT ;定义代码段
ASSUME CS:CODE ;规定CS的内容
ASSUME DS:DATA ;规定DS的内容
START: MOV AX,DATA ;程序从START开始
MOV DS,AX ;DS置初值,DATA的段地址
CALL ENTER ;调⽤显⽰回车换⾏⼦程序
LEA DX,MSG1 ;输出第⼀个字符串的偏移地址
CALL DISPCHS ;调⽤显⽰字符串⼦程序
CALL ENTER ;调⽤显⽰回车换⾏⼦程序
CALL ENTER ;这个...同上啊^-^
LEA DX,MSG2 ;输出第⼆个字符串的偏移地址
CALL DISPCHS ;调⽤显⽰字符串⼦程序
AGAIN: CALL ENTER ;定义AGAIN标号.⽤于选择错误循环