汇编语言not指令(汇编语言NOP指令的用法)

本文目录
- 汇编语言NOP指令的用法
- 汇编neg指令是什么
- 汇编语言的助记符
- 汇编语言中ah和AH代表什么
- 汇编语言执行XOR,OR,AND,NOT,TEST逻辑指令的时候标志位如何变化请举出例子,万分感谢!!
- 汇编语言中,如何将一个单元的内容取反
- 汇编语言中哪些指令影响标志位cf
- 汇编语言NOP指令的用法
- 【一些常用的汇编语言指令】汇编语言cli指令
汇编语言NOP指令的用法
1、占用一个字节的程序存储空间:这是在对微机与单片机进行汇编指令指令编程时常用的手法,例如,为了刻意使某个程序段在一个特定的地址开始,或在某个程序段中删除了一些指令而还刻意要求地址不变,基于这些的需求,通常是应用NOP指令汇编指令来充填空闲的地址;
2、产生微小延迟:这是在微机与单片机进行汇编指令指令编程时常用的手法,微机与单片机的编程并非是周期扫描的执行机制,例如,在读取某个外围通道输入值时,先发出一个请求命令,带一定延时后,再读其数值,通常是应用NOP指令来进行延时;
3、常用来做代码地址对齐:这个纯粹是对与对微机与单片机进行汇编指令指令编程来讲的。这与上述的1中占用一个字节的程序存储空间的作用相同,即汇编编译后生成机器代码的效果。
汇编neg指令是什么
汇编NEG指令在16位汇编语言中,NEG命令无论你是否为正负数,都会按照取反+1或用0减去这个数的二进制的办法去计算。
neg指令详细解释如下:
一、规则:
neg reg (对寄存器操作);
2. neg mem(对内存操作);
二、 作用:将目的操作数的所以数据位取反加1;
三、影响的标志:进位标志(CF),零标志(ZF),符合标志(SF),溢出标志(OF),辅助进位标志(AF),奇偶标志(PF) ;
四、当操作数为0时,置CF位为0 当操作数不为0时,置CF位为1。
汇编语言的助记符
8086/8088指令系统
一、数据传送指令
1.通用数据传送指令
MOV(Move)传送
PUSH(Push onto the stack)进栈
POP(Pop from the stack)出栈
XCHG(Exchange)交换
.MOV 指令
格式为: MOV DST,SRC
执行的操作:(DST)《-(SRC)
.PUSH 进栈指令
格式为:PUSH SRC
执行的操作:(SP)《-(SP)-2
((SP)+1,(SP))《-(SRC)
.POP 出栈指令
格式为:POP DST
执行的操作:(DST)《-((SP+1),(SP))
(SP)《-(SP)+2
.XCHG 交换指令
格式为:XCHG OPR1,OPR2
执行的操作:(OPR1)《--》(OPR2)
2.累加器专用传送指令
IN(Input) 输入
OUT(Output) 输出
XLAT(Translate) 换码
这组指令只限于使用累加器AX 或AL 传送信息.
.IN 输入指令
长格式为: IN AL,PORT(字节)
IN AX,PORT(字)
执行的操作: (AL)《-(PORT)(字节)
(AX)《-(PORT+1,PORT)(字)
短格式为: IN AL,DX(字节)
IN AX,DX(字)
执行的操作: AL《-((DX))(字节)
AX《-((DX)+1,DX)(字)
.OUT 输出指令
长格式为: OUT PORT,AL(字节)
OUT PORT,AX(字)
执行的操作: (PORT)《-(AL)(字节)
(PORT+1,PORT)《-(AX)(字)
短格式为: OUT DX,AL(字节)
OUT DX,AX(字)
执行的操作: ((DX))《-(AL)(字节)
((DX)+1,(DX))《-AX(字)
在IBM-PC 机里,外部设备最多可有65536个I/O 端口,端口(即外设的端口地址)为
0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此
时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定
端口号,但只限于前256个端口.当端口号》=256时,只能使用短格式,此时,必须先把端口号放到
DX 寄存器中(端口号可以从0000到0FFFFH),然后再用IN 或OUT 指令来传送信息.
.XLAT 换码指令
格式为: XLAT OPR
或: XLAT
执行的操作:(AL)《-((BX)+(AL))
3.有效地址送寄存器指令
LEA(Load effective address)有效地址送寄存器
LDS(Load DS with Pointer)指针送寄存器和DS
LES(Load ES with Pointer)指针送寄存器和ES
.LEA 有效地址送寄存器
格式为: LEA REG,SRC
执行的操作:(REG)《-SRC
指令把源操作数的有效地址送到指定的寄存器中.
.LDS 指针送寄存器和DS 指令
格式为: LDS REG,SRC
执行的操作:(REG)《-(SRC)
(DS)《-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS 寄存器中.该指令常指定
SI 寄存器.
.LES 指针送寄存器和ES 指令
格式为: LES REG,SRC
执行的操作: (REG)《-(SRC)
(ES)《-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及ES 寄存器中.该指令常指定
DI 寄存器.
4.标志寄存器传送指令
LAHF(Load AH with flags)标志送AH
SAHF(store AH into flags)AH 送标志寄存器
PUSHF(push the flags) 标志进栈
POPF(pop the flags) 标志出栈
.LAHF 标志送AH
格式为: LAHF
执行的操作:(AH)《-(PWS 的低字节)
.SAHF AH 送标志寄存器
格式为: SAHF
执行的操作:(PWS 的低字节)《-(AH)
.PUSHF 标志进栈
格式为: PUSHF
执行的操作:(SP)《-(SP)-2
((SP)+1,(SP))《-(PSW)
.POPF 标志出栈
格式为: POPF
执行的操作:(PWS)《-((SP)+1,(SP))
(SP)《-(SP+2)
二、算术指令
1.加法指令
ADD(add)加法
ADC(add with carry)带进位加法
INC(increment)加1
.ADD 加法指令
格式: ADD DST,SRC
执行的操作:(DST)《-(SRC)+(DST)
.ADC 带进位加法指令
格式: ADC DST,SRC
执行的操作:(DST)《-(SRC)+(DST)+CF
.ADD 加1指令
格式: INC OPR
执行的操作:(OPR)《-(OPR)+1
2.减法指令
SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(Negate)求补
CMP(Compare)比较
.SUB 减法指令
格式: SUB DST,SRC
执行的操作:(DST)《-(DST)-(SRC)
.SBB 带借位减法指令
格式: SBB DST,SRC
执行的操作:(DST)《-(DST)-(SRC)-CF
.DEC 减1指令
格式: DEC OPR
执行的操作:(OPR)《-(OPR)-1
.NEG 求补指令
格式: NEG OPR
执行的操作:(OPR)《- -(OPR)
.CMP 比较指令
格式: CMP OPR1,OPR2
执行的操作:(OPR1)-(OPR2)
该指令与SUB 指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半
球.
3.乘法指令
MUL(Unsigned Multiple)无符号数乘法
IMUL(Signed Multiple)带符号数乘法
.MUL 无符号数乘法指令
格式: MUL SRC
执行的操作:
字节操作数:(AX)《-(AL)*(SRC)
字操作数:(DX,AX)《-(AX)*(SRC)
.IMUL 带符号数乘法指令
格式: IMUL SRC
执行的操作:与MUL 相同,但必须是带符号数,而MUL 是无符号数.
4.除法指令
DIV(Unsigned divide)无符号数除法
IDIV(Signed divide)带符号数除法
CBW(Convert byte to word)字节转换为字
CWD(Contert word to double word)字转换为双字
.DIV 无符号数除法指令
格式: DIV SRC
执行的操作:
字节操作:(AL)《-(AX)/(SRC)的商
(AH)《-(AX)/(SRC)的余数
字操作: (AX)《-(DX,AX)/(SRC)的商
(AX)《-(DX,AX)/(SRC)的余数
.IDIV 带符号数除法指令
格式: DIV SRC
执行的操作:与DIV 相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号
与被除数的符号相同.
.CBW 字节转换为字指令
格式: CBW
执行的操作:AL 的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最
高有效位为1,则(AH)=0FFH
.CWD 字转换为双字指令
格式: CWD
执行的操作:AX 的内容符号扩展到DX.即如(AX) 的最高有效位为0, 则(DX)=0;否则
(DX)=0FFFFH.
这两条指令都不影响条件码.
三、逻辑指令
1.逻辑运算指令
AND(and) 逻辑与
OR(or) 逻辑或
NOT(not) 逻辑非
XOR(exclusive or)异或
TEST(test) 测试
.AND 逻辑与指令
格式: AND DST,SRC
执行的操作:(DST)《-(DST)^(SRC)
.OR 逻辑或指令
格式: OR DST,SRC
执行的操作:(DST)《-(DST)V(SRC)
.NOT 逻辑非指令
格式: NOT OPR
执行的操作:(OPR)《-(OPR)
.XOR 异或指令
格式: XOR DST,SRC
执行的操作:(DST)《-(DST)V(SRC)
.TEST 测试指令
格式: TEST OPR1,OPR2
执行的操作:(DST)^(SRC)
两个操作数相与的结果不保存,只根据其特征置条件码
2.移位指令
SHL(shift logical left) 逻辑左移
SAL(shift arithmetic left) 算术左移
SHR(shift logical right) 逻辑右移
SAR(shift arithmetic right) 算术右移
ROL(Rotate left) 循环左移
ROR(Rotate right) 循环右移
RCL(Rotate left through carry) 带进位循环左移
RCR(Rotate right through carry) 带进位循环右移
格式: SHL OPR,CNT(其余的类似)
其中OPR 可以是除立即数以外的任何寻址方式.移位次数由CNT 决定,CNT 可以是1或CL.
循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.
其中算术移位指令适用于带符号数运算,SAL 用来乘2,SAR 用来除以2;而逻辑移位指令则用
来无符号数运算,SHL 用来乘2,SHR 用来除以2.
四、串处理指令
1.与REP 相配合工作的MOVS,STOS 和LODS 指令
.REP 重复串操作直到(CX)=0为上
格式: REP string primitive
其中String Primitive 可为MOVS,LODS 或STOS 指令
执行的操作:
1)如(CX)=0则退出REP,否则往下执行.
2)(CX)《-(CX)-1
3)执行其中的串操作
4)重复1)~3)
.MOVS 串传送指令
格式:可有三种
MOVS DST,SRC
MOVSB(字节)
MOVSW(字)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是
字节操作,例如:
MOVS ES:BYTE PTR
执行的操作:
1)((DI))《-((SI))
2)字节操作:
(SI)《-(SI)+(或-)1,(DI)《-(DI)+(或-)1
当方向标志DF=0时用+,当方向标志DF=1时用-
3)字操作:
(SI)《-(SI)+(或-)2,(DI)《-(DI)+(或-)2
当方向标志DF=0时用+,当方向标志DF=1时用-
该指令不影响条件码.
.CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;
.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量.
.STOS 存入串指令
格式: STOS DST
STOSB(字节)
STOSW(字)
执行的操作:
字节操作:((DI))《-(AL),(DI)《-(DI)+-1
字操作: ((DI))《-(AX),(DI)《-(DI)+-2
该指令把AL 或AX 的内容存入由(DI)指定的附加段的某单元中,并根据DF 的值及数据类型
修改DI 的内容,当它与REP 联用时,可把AL 或AX 的内容存入一个长度为(CX)的缓冲区中.
.LODS 从串取指令
格式: LODS SRC
LODSB
LODSW
执行的操作:
字节操作:(AL)《-((SI)),(SI)《-(SI)+-1
字操作: (AX)《-((SI)),(SI)《-(SI)+-2
该指令把由(SI)指定的数据段中某单元的内容送到AL 或AX 中,并根据方向标志及数据类型
修改SI 的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.
一般说来,该指令不和REP 联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使
用本指令.
2.与REPE/REPZ 和REPNZ/REPNE 联合工作的CMPS 和SCAS 指令
.REPE/REPZ 当相等/为零时重复串操作
格式: REPE(或REPZ) String Primitive
其中String Primitive 可为CMPS 或SCAS 指令.
执行的操作:
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
2)(CX)《-(CX)-1
3)执行其后的串指令
4)重复1)~3)
.REPNE/REPNZ 当不相等/不为零时重复串操作
格式: REPNE(或REPNZ) String Primitive
其中String Primitive 可为CMPS 或SCAS 指令
执行的操作:
除退出条件(CX=0)或ZF=1外,其他操作与REPE 完全相同.
.CMPS 串比较指令
格式: CMP SRC,DST
CMPSB
CMPSW
执行的操作:
1)((SI))-((DI))
2)字节操作:(SI)《-(SI)+-1,(DI)《-(DI)+-1
字操作: (SI)《-(SI)+-2,(DI)《-(DI)+-2
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)
相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS 指令的规定相同.
.SCAS 串扫描指令
格式: SCAS DST
SCASB
SCASW
执行的操作:
字节操作:(AL)-((DI)),(DI)《-(DI)+-1
字操作: (AL)-((DI)),(DI)《-(DI)+-2
该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存
结果,只根据结果置条件码.指令的其他特性和MOVS 的规定相同.
五、控制转移指令
1.无条件转移指令
.JMP(jmp) 跳转指令
1)段内直接短转移
格式:JMP SHORT OPR
执行的操作:(IP)《-(IP)+8位位移量
2)段内直接近转移
格式:JMP NEAR PTR OPR
执行的操作:(IP)《-(IP)+16位位移量
3)段内间接转移
格式:JMP WORD PTR OPR
执行的操作:(IP)《-(EA)
4)段间直接(远)转移
格式:JMP FAR PTR OPR
执行的操作:(IP)《-OPR 的段内偏移地址
(CS)《-OPR 所在段的段地址
5)段间间接转移
格式:JMP DWORD PTR OPR
执行的操作:(IP)《-(EA)
(CS)《-(EA+2)
2.条件转移指令
1)根据单个条件标志的设置情况转移
.JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移
格式:JE(或JZ) OPR
测试条件:ZF=1
.JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移
格式:JNZ(或JNE) OPR
测试条件:ZF=0
.JS(Jump if sign) 结果为负则转移
格式: JS OPR
测试条件:SF=1
.JNS(Jump if not sign) 结果为正则转移
格式:JNS OPR
测试条件:SF=0
.JO(Jump if overflow) 溢出则转移
格式: JO OPR
测试条件:OF=1
.JNO(Jump if not overflow) 不溢出则转移
格式: JNO OPR
测试条件:OF=0
.JP(或JPE)(Jump if parity,or parity even) 奇偶位为1则转移
格式: JP OPR
测试条件:PF=1
.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0则转移
格式: JNP(或JPO) OPR
测试条件:PF=0
.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或进位
位为1则转移
格式:JB(或JNAE,JC) OPR
测试条件:CF=1
.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,
或进位位为0则转移
格式:JNB(或JAE,JNC) OPR
测试条件:CF=0
2)比较两个无符号数,并根据比较的结果转移
.JB(或JNAE,JC)
格式:同上
.JNB(或JAE,JNC)
格式:同上
.JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移
格式:JBE(或JNA) OPR
测试条件:CFVZF=1
.JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移
格式:JNBE(或JA) OPR
测试条件:CFVZF=0
3)比较两个带符号数,并根据比较的结果转移
.JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移
格式:JL(或JNGE) OPR
测试条件:SFVOF=1
.JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移
格式:JNL(或JGE) OPR
测试条件:SFVOF=0
.JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移
格式:JLE(或JNG) OPR
测试条件:(SFVOF)VZF=1
.JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移
格式:JNLE(或JG) OPR
测试条件:(SFVOF)VZF=0
4)测试CX 的值为0则转移指令
.JCXZ(Jump if CX register is zero) CX 寄存器的内容为零则转移
格式:JCXZ OPR
测试条件:(CX)=0
注:条件转移全为8位短跳!
3.循环指令
.LOOP 循环指令
格式: LOOP OPR
测试条件:(CX)《》0
.LOOPZ/LOOPE 当为零或相等时循环指令
格式: LOOPZ(或LOOPE) OPR
测试条件:(CX)《》0且ZF=1
.LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式: LOOPNZ(或LOOPNE) OPR
测试条件:(CX)《》0且ZF=0
这三条指令的步骤是:
1)(CX)《-(CX)-1
2)检查是否满足测试条件,如满足则(IP)《-(IP)+D8的符号扩充.
4.子程序
.CALL 调用指令
.RET 返回指令
5.中断
.INT 指令
格式: INT TYPE
或INT
执行的操作:(SP)《-(SP)-2
((SP)+1,(SP))《-(PSW)
(SP)《-(SP)-2
((SP)+1,(SP))《-(CS)
(SP)《-(SP)-2
((SP)+1,(SP))《-(IP)
(IP)《-(TYPE*4)
(CS)《-(TYPE*4+2)
.INTO 若溢出则中断
执行的操作:若OF=1则:
(SP)《-(SP)-2
((SP)+1,(SP))《-(PSW)
(SP)《-(SP)-2
((SP)+1,(SP))《-(CS)
(SP)《-(SP)-2
((SP)+1,(SP))《-(IP)
(IP)《-(10H)
(CS)《-(12H)
.IRET 从中断返回指令
格式: IRET
执行的操作:(IP)《-((SP)+1,(SP))
(SP)《-(SP)+2
(CS)《-((SP)+1,(SP))
(SP)《-(SP)+2
(PSW)《-((SP)+1,(SP))
(SP)《-(SP)+2
六、处理机控制指令
1.标志处理指令
.CLC 进位位置0指令(Clear carry)CF《-0
.CMC 进位位求反指令(Complement carry)CF《-CF
.STC 进位位置1指令(Set carry)CF《-1
.CLD 方向标志置0指令(Clear direction)DF《-0
.STD 方向标志置1指令(Set direction)DF《-1
.CLI 中断标志置0指令(Clear interrupt)IF《-0
.STI 中断标志置1指令(Set interrupt)IF《-0
2.其他处理机控制指令
NOP(No Opreation) 无操作
HLT(Halt) 停机
WAIT(Wait) 等待
ESC(Escape) 换码
LOCK(Lock) 封锁
这些指令可以控制处理机状态.这们都不影响条件码.
.NOP 无操作指令
该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定
的存储单元,以便在正式运行时用其他指令取代.
.HLT 停机指令
该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束
后可继续执行下面的程序.
.WAIT 等待指令
该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回
WAIT 指令继续德行.
.ESC 换码指令
格式ESC mem
其中mem 指出一个存储单元,ESC 指令把该存储单元的内容送到数据总线去.当然ESC 指令
不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作
时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.
.LOCK 封锁指令
该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令
执行完为止.当CPU 与其他处理机协同工作时,该指令可避免破坏有用信息.
汇编语言中ah和AH代表什么
ah和AH是一个意思,只是大小写区分
意思是AX(16位)寄存器的高八位,低八位是AL寄存器/al
逻辑运算
这部分指令用于执行算术和逻辑运算,包括加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、逻辑运算指令NOT/AND/OR/XOR/TEST等。
移位指令
这部分指令用于将寄存器或内存操作数移动指定的次数。包括逻辑左移指令SHL、逻辑右移指令SHR、算术左移指令SAL、算术右移指令SAR、循环左移指令ROL、循环右移指令ROR等。
扩展资料:
控制转移
这部分包括无条件转移指令JMP、条件转移指令Jcc/JCXZ、循环指令LOOP/LOOPE/LOOPNE、过程调用指令CALL、子过程返回指令RET、中断指令INTn、INT3、INTO、IRET等。
串操作
这部分指令用于对数据串进行操作,包括串传送指令MOVS、串比较指令CMPS、串扫描指令SCANS、串加载指令LODS、串保存指令STOS,这些指令可以有选择地使用REP/REPE/REPZ/REPNE和REPNZ的前缀以连续操作。
输入输出
这部分指令用于同外围设备交换数据,包括端口输入指令IN/INS、端口输出指令OUT/OUTS。
汇编语言执行XOR,OR,AND,NOT,TEST逻辑指令的时候标志位如何变化请举出例子,万分感谢!!
1、 test al,02h ;若AL中的D1位是‘1’。则ZF=0,否则为1;CF和OF都为0
2、 not 对所有标志位都没有影响
3、xor or and 都使 cf=of=0 其他位 要看具体情况
汇编语言中,如何将一个单元的内容取反
方法1.用逻辑非运算指令(not指令,指令格式:NOT OPRD),可以对目标操作数的二进制全部位取反,比如取反ax,则not ax即可.
方法2.用异或逻辑(xor指令,指令格式:XOR OPRD1,OPRD2,异或逻辑就是两个逻辑值不同则输出结果为真,相同则输出假).与非运算一般区别是:可用于对特定位取反.
把目标操作数(即要取反的对象)要取反的二进制位与1进行异或逻辑即可实现,比如对ax寄存器内容低8位取反则可以:xor ax,00ff;实现.
汇编语言中哪些指令影响标志位cf
1.加法指令:ADD、ADC、INC、XADD,除了INC不影响CF标志位外,都影响条件标志位。
2.减法指令:SUB、SBB、DEC、NEG、CMP、CMPXCHG、CMPXCHG8B,前六种除了DEC不影响CF标志外都影响标志位。
3.乘法指令:MUL、IMUL,
MUL:如果乘积高一半为0,则CF和OF位均为0,否则CF和OF均为1。
IMUL:如果高一半是低一半符号的扩展,则CF位和OF位均为0,否则就均为1。
4.除法指令:DIV、IDIV对所有条件位均无定义。
5.逻辑指令:AND、OR、NOT、XOR、TEST。
6.定位扫描指令:BSF正向位扫描、BSR反向位扫描。
源操作数可以是除立即数以外的任一种寻址方式,目的操作数必须是寄存器,影响ZF位。
汇编语言NOP指令的用法
nop--空语句的作用:
1、nop指令执行时花去一个时钟周期,所以可用把它用在延时程序中作为循环体,用以估计一个延时时间;
2、用于程序指令的对齐,比如字对齐--以便于反汇编时容易读懂。
【一些常用的汇编语言指令】汇编语言cli指令
汇编语言常用指令
大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助!
数据传送指令
MOV :寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器CS 不能作为目的;指令指针IP 不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。
XCHG 交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。
LEA 16位寄存器 存储器操作数 传送有效地址指令:必须是一个16位寄存器和存储器操作数。
LDS 16位寄存器 存储器操作数 传送存储器操作数32位地址,它的16位偏移地址送16位寄存器,16位段基值送入DS 中。
LES :同上,只是16位段基址送ES 中。
堆栈操作指令
PUSH 操作数,操作数不能使用立即数,
POP 操作数, 操作数不能是CS 和立即数
标志操作指令
LAHF :把标志寄存器低8位,符号SF ,零ZF ,辅助进位AF ,奇偶PF ,进位CF 传送到AH 指定的位。不影响标志位。
SAHF :与上相反,把AH 中的标志位传送回标志寄存器。
PUSHF :把标志寄存器内容压入栈顶。
POPF :把栈顶的一个字节传送到标志寄存器中。
CLC :进位位清零。
STC :进位位为1。
CMC :进位位取反。
CLD :使方向标志DF 为零,在执行串操作中,使地址按递增方式变化。
STD :DF 为1。
CLI :清中断允许标志IF 。Cpu 不相应来自外部装置的可屏蔽中断。
STI :IF 为1。
加减运算指令
注意: 对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。
ADD 。
ADC :把进位CF 中的数值加上去。
INC :加1指令
SUB 。
SBB :把进位CF 中数值减去。
DEC :减1指令。
NEG 操作数:取补指令,即用0减去操作数再送回操作数。
CMP :比较指令,完成操作数1减去操作数2,结果不送操作数1,但影响标志位。可根据ZF (零)是否被置1判断相等;如果两者是无符号数,可根据CF 判断大小;如果两者是有符号数,要根据SF 和OF 判断大小。
乘除运算指令
MUL 操作数 :无符号数乘法指令。操作数不能是立即数。操作数是字节与AL 中的无符号数相乘,16位结果送AX 中。若字节,则与AX 乘,结果高16送DX ,低16送AX 。如乘积高半部分不为零,则CF 、OF 为1,否则为0。所以CF 和OF 表示AH 或DX 中含有结果的有效数。 IMUL 操作数 :有符号数乘法指令。基本与MUL 相同。
DIV 操作数 :被除数是在AX (除数8位)或者DX 和AX (除数16位),操作数不能是立即数。如果除数是0,或者在8(16)位除数时商超过8(16)位,则认为是溢出,引起0号中断。IDIV :有符号除法指令,当除数为0,活着商太大,太小(字节超过127,-127字超过32767,-32767)时,引起0号中断。
符号扩展指令
CBW ,CWD : 把AL 中的符号扩展到寄存器AH 中,不影响各标志位。CWD 则把AX 中的符号扩展到DX ,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用XOR 清高8位或高16位。
逻辑运算指令与位移指令
注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。
NOT :取反,不影响标志位。
AND 操作数1 操作数2:操作结果送错作数1,标志CF (进位)、OF (溢出)清0,PF (奇偶)ZF (0标志) SF(符号)反映运算结果,AF (辅助进位)未定义。自己与自己AND 值不变,她主要用于将操作数中与1相与的位保持不变,与0相与清0。(都为1时为1) OR 操作数1 操作数2:自己与自己OR 值不变,CF (进位)、OF (溢出)清0,PF (奇偶)ZF (0标志)SF (符号)反映运算结果,AF (辅助进位)未定义。她使用于将若干位置1:
与1相或为1,保持不变的位与0相或。(都为0时为0)
XOR 操作数1 操作数2:自己与自己异或结果为0,标志CF (进位)、OF (溢出)清0,PF (奇偶)ZF (0)SF (符号)反映运算结果,AF (辅助进位)未定义。主要用于将若干位取反的操作:与1异或取反,与0异或保持不变。(相同为0,不同为1)
TEST 操作数1 操作数2:测试指令,和AND 相同,但结果不送操作数1,各标志位同AND 操作。
位移指令
SAL/SHL 操作数 1或CL :算术左移与逻辑左移进行相同的动作,操作数是通用寄存器或者存储器操作数,位移数为1或为CL ;最高位移CF (进位),右边用0补位。左移一次相当源操作数乘2。
SAR 操作数 1或CL :算术右移,位移数为1或为CL ;操作数是通用寄存器或者存储器操作数,左符号位保持不变,移出最低位进CF (进位)。相当源操作数除2。
SHR 操作数 1或CL :逻辑右移,操作数是通用寄存器或者存储器操作数,位移数为1或为CL ;左边用0补足,移出的最低位进CF (进位)对于无符号数,右移一位相当于除2。 ROL/ROR 操作数 1或CL : 不带进位左移/右移,操作数是通用寄存器或者存储器操作数,位移数为1或为CL 。
RCL/RCR 操作数 1或CL : 带进位左移/右移,CF (进位)参与循环。操作数是通用寄存器或者存储器操作数,位移数为1或为CL 。
转移指令
注意:由于代码段可分为多个段,所以根据转移时是否重置代码段寄存器CS 内容,可分为段内转移和段间转移。段内转移仅重置IP 的转移,转移后指令仍在同一代码段中。段间转移重置CS ,所以转移后继续执行的指令在另一个段中。
JMP 标号 :无条件跳转到标号位置执行,段内直接转移指令。地址差用一个字节表示为短转移,用一个字表示为近转移。
JMP 通用寄存器/存储单元:无条件段间间接转移指令,操作数给定的是目标地址处。 JMP FAR PTR 标号:无条件段间直接转移指令,她的具体动作是把指令中包含的目标地址的段值和偏移分别置茹CS 和IP 。
JMP 操作数:无条件段间间接转移指令,操作数是双字存储单元,给定目标地址,低字节送IP ,高字节送CS 。
条件转移指令:所有的条件转移指令都是段内转移。她是由J 加上相应的含义字母组合成。有符号数关系G (大于),E (等于),L (小于);无符号数关系A (高于)、E (等于)和B (低于);字母N 表示“不”:NB (不小于),NE (不等于)。
循环指令
LOOP 标号:她使寄存器CX 减1,若结果不等于0则转到标号,否则顺序执行LOOP 指令后的指令。最多循环65536次。
LOOPE/LOOPZ 标号:等于/全零循环指令。CX 的值减1,如果结果不等于0,并且ZF (0标志)等于1,则转移到标号。
LOOPNE/LOOPNZ 标号:不等于/非零循环指令,CX 的值减1,如果结果不等于0,并且ZF (0标志)等于0,则跳转到标号。
JCXZ 标号: 该指令实现当寄存器CX 的值等于0转移到标号,否则顺序执行。通常该指令用在循环开始前,以便在循环次数位0时,跳过循环体。

本文相关文章:
执行汇编指令(【一些常用的汇编语言指令】汇编语言cli指令)
2025年11月1日 05:45
汇编语言指令fcomp(为什么汇编语言实现循环语句要写两个cmp)
2025年10月15日 19:15
汇编语言教程全集(ARM9嵌入式系统设计基础教程的第9章 ARM汇编语言程序设计基础)
2025年9月2日 23:00
更多文章:
hibernate的sql语句在哪(hibernate中如何执行sql语句)
2026年1月5日 18:15
免费下载ppt模板网站建筑公司简介(求一款介绍公司简介的PPT模板,稍微好看一点详细一点的!)
2025年9月12日 18:45
springboot对应的spring版本(spring-boot集成spring-data-redis哪个版本)
2025年7月30日 01:45
asp可视化建站(关于建网站的(用asp做的)问题,请大家帮忙在线等)
2025年7月30日 22:00
2022pubg全球总决赛(绝地求生2022全球总决赛时间)
2025年8月11日 14:30
eclipse2020需要jdk什么版本(最新eclipse和jdk10可以一起用吗)
2025年8月26日 11:15
多线程线程池哪几种(什么是线程池为什么要使用线程池如何使用)
2025年10月15日 04:45
性格用英语怎么说personality(相貌和问性格的用英语怎么说)
2026年1月25日 00:45













