汇编常用指令

汇编常用指令
汇编常用指令

学习汇编语言,最关键的就在于汇编指令集的掌握以及计算机工作方式的理解,以下是80X86汇编过程中经常用到的一些汇编指令。

从功能分类上来说,一共可分为

一、数据传送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。

二、算术指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。

三、逻辑指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。

四、控制转移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。

五、串操作指令:MOVS、LODS、STOS、CMPS、SCAS。

六、标志处理指令:CLC、STC、CLD、STD。

七、32位CPU新增指令(后续补充并完善)

除上述的一些指令外,还有许多32位80X86CPU新增指令,这些指令有时会简化程序设计,不过由于我也是刚刚学习汇编,这些都是从书上看到的,所以很多还不是十分了解,我写这些的目的仅仅是想让自己能更好的去记住这些指令的作用和用法,同事也希望和我一样刚入门的朋友能够多了解一些,并没有其他目的,所有的示例也并没有经过实际的代码测试,所以希望各位朋友,不管你喜欢不喜欢,反对不反对,请文明发言,谢谢!

------------------------------------------------数据传送指令开始

-------------------------------------------------------

1、MOV(传送)

指令写法:MOV target,source

功能描述:将源操作数source的值复制到target中去,source值不变

注意事项:1)target不能是CS(代码段寄存器),我的理解是代码段不可写,只可读,所以相应这地方也不能对CS执行复制操作。2)target和source不能同时为内存数、段寄存器(CS\DS\ES\SS\FS\GS)3)不能将立即数传送给段寄存器4)target和source必须类型匹配,比如,要么都是字节,要么都是字或者都是双字等。4)由于立即数没有明确的类型,所以将立即数传送到target时,系统会自动将立即数零扩展到与target数的位数相同,再进行传送。有时,需要用BYTE PTR 、WORD PTR、DWORD PTR明确指出立即数的位数

写法示例:MOV dl,01H;MOV eax,[bp]; eax =ss:[bp] 双字传送。

2、XCHG(交换)

指令写法:XCHG object1,object2

功能描述:交换object1与object2的值

注意事项:1)不能直接交换两个内存数的值2)类型必须匹配3)两个操作数任何一个都不能是段寄存器【看来段寄存器的写入的限制非常的严格,MOV指令也不能对段寄存器进行写入】,4)必须是通用寄存器(ax、bx、cx、dx、si、di)或内存数写法示例:XCHG ax,[bx][si]; XCHG ax,bx;

3、LEA(装入有效地址)

指令写法:LEZ reg16,mem

功能描述:将有效地址MEM的值装入到16位的通用寄存器中。

写法示例:假定bx=5678H,EAX=1,EDX=2

Lea si,2[bx] ;si=567AH

Lea di,2[eax][edx] ;di=5

注意,这里装入的是有效地址,并不是实际的内存中的数值,如果要想取内存中该地址对应的数值,还需要加上段地址才行,而段地址有可能保存在DS中,也有可能保存在SS 或者CS中哦:>不知道我的理解可正确。。。。

4、LDS\LES\LGS\LSS(注意,与LEA不同的是,这里是装入的值,而不是有效地址)

这几个指令,名称不同,作用差不多。

写法:LDS reg16,mem32

功能描述:reg16等于mem32的低字,而DS对应于mem32的高字(当为LES时,这里就是ES对应于mem32的高字)

用来给一个段寄存器和一个16位通用寄存器同时复制。

注意事项:第一个操作数必须是16位通用寄存器

在接着往下说之前,先熟悉下堆栈的概念。堆栈,位于内存的堆栈段中,是内存的一部分,具有“先进后出”的特点,堆栈只有一个入口,即当前栈顶,当堆栈为空时,栈顶和栈底指向同一内存地址,在WINDOWS中,可以把堆栈理解成一个倒着的啤酒瓶,上面的地址大,下面的地址小,当从瓶口往啤酒瓶塞啤酒时(进栈),栈顶就会往瓶口下移动,也就是往低地址方向移动,同理,出栈时,正好相反,把啤酒给倒出来,栈顶向高地址方向移动。这就是所谓的堆栈,哼哼,很Easy吧。

在汇编语言中,堆栈操作的最小单位是字,也就是说,只能以字或双字为单位,同时,SS:SP指向栈顶(SS为堆栈段寄存器,SP为堆栈指针,二者一相加,就构成了堆栈栈顶的内存地址)。

5、PUSH(进栈)

写法:PUSH reg16(32)/seg/mem16(32)/imm

功能描述:将通用寄存器/段寄存器/内存数/立即数的值压入栈中,即:

SP=SP-2 SS:[SP]=16位数值(当将32位数值压入栈中时,SP=SP-4,SS:[SP]=32为数值)

6、POP(出栈)

写法:POP reg16(32)/seg/mem16(32)【不能出栈到CS中】

功能描述:将堆栈口的16(32)位数据推出到通用寄存器/段寄存器/内存中,即:寄存器/段寄存器/内存= SS:[SP] SP=SP+2(当将32位数值出栈时,SP=SP+4)(注意,不能出栈给立即数哦,常量不可变嘛)

7、PUSHA、PUSHAD、POPA、POPAD

作用:将所有16/32位通用寄存器进栈/出栈

如:PUSHA ;将AX、CX、DX、BX、原SP、BP、SI、DI依次进栈。POPA出栈顺序正好相反,但要注意的是,弹出到SP的值被丢弃,SP通过增加16位来恢复(当然嘛,不然栈顶地址就被修改了,就会出息不对齐的情况,就有可能乱套了)

POPAD PUSHAD一样,只不过是32位的罢了。

8、PUSHF、PUSHFD、POPF、POPFD

功能描述:标志寄存器FLAGS(EFLAGS)进栈或出栈

如:PUSHF ;FLAGS进栈POPF;栈顶字出栈到FLAGS

总结下,POP 和PUSH通常可以用来交换两个寄存器的值,也可以用来保护寄存器的值,如下:

交换ax与cx的值:push ax;push cx;pop ax;pop cx;

保护寄存器:push ax;push cx;….中间有很多执行的代码…pop cx;pop ax;

9、LAHF\SAHF(标志寄存器传送指令)

写法:lahf;

作用:AH=FLAGS的低8位

写法:sahf;

作用:FLAGS的低8位=AH

10、符号扩展和零扩展指令

CBW;AL符号扩展为AX

CWD;AX符号扩展为32位数DX:AX

CWDE;AX符号扩展为EAX;

CDQ:EAX符号扩展为64位数EDX:EAX

MOVSX(符号扩展指令的一般形式)

写法:MOVSX reg16\32,reg8\reg16\mem8\mem16

作用:用来将8位符号扩展到16位,或者16位符号扩展到32位

MOVZX(零扩展指令)

写法:MOVZX reg16\32,reg8\reg16\mem8\mem16

零扩展,就是高位补0进行扩展。通常用在将数据复制到一个不同的寄存器中,如AL 零扩展为EBX。相同寄存器的零扩展,可以使用MOV 高位,0来实现。

11、BSWAP(字节交换)

写法:bswap reg32

作用:将reg32的第0与第3个字节,第1与第2个字节进行交换。

示例:设EAX=12345678h

执行bswap eax;后,eax=78563412H

12、XLAT(换码)

写法:XLAT;

作用:AL=DS:[bx+AL]

将DS:BX所指内存中的由AL指定位移处的一个字节赋值给AL。(貌似这是一个方便偷懒的指令哦。。),原来它的主要用途是查表。注意可以给它提供操作数,用来指定使用哪

个段地址,如:

XLAT ES:table;使用ES来作为段地址,table不起作用。

XLAT table ;使用table所在段对应的段寄存器作为段地址。

------------------------------------------------数据传送指令结束-------------------------------------------------------

----------------------------------算术指令开始-----------------------------------------------

13、ADD(加法)

写法:ADD reg/mem reg/mem/imm

作用:将后面的操作数加到前面的操作数中

注意:两个操作数必须类型匹配,并且不能同时是内存操作数

ADC (带进位加法)

写法:ADC reg/mem, reg/mem/imm ;

作用:dest=dest+src+cf

当CF=0时ADD与ADC的作用是相同的。

示例:实现64位数EDX:EAX与ECX:EBX的加法:

Add EAX,EBX;

ADC EDX,ECX;

14、INC(自加一)

写法:INC reg/mem;

作用:dest=dest+1;

15、XADD(交换加)

写法:XADD reg/mem,reg

作用:先将两个数交换,然将二者之和送给第一个数

16、SUB(减法)

写法:SUB reg/mem,reg/mem/imm;

作用:dest=dest-src;

SBB(带借位减法)

写法:SBB reg/mem,reg/mem/imm

作用:dest=dest-src-cf;

注意:两个操作数必须类型匹配,且不能同时是内存数

17、DEC(自减1)

写法:DEC reg/mem;

作用:dest=dest-1;

18、CMP(比较)

写法:CMP reg/mem,reg/mem/imm

作用:dest-src

注意:这里并不将结果存入dest中,而仅仅是执行相减的运算,达到依据运算结果去影响EFLAG标志位的效果

19、NEG(求补)

写法:NEG reg/mem

作用:求补就是求相反数,即:dest=0-dest;

20、CMPXCHG(比较交换)

写法:CMPXCHG reg/mem,reg;

作用:AL/AX/EAX-oprd1,如果等于0,则oprd1=oprd2,否则,AL/AX/EAX=oprd1;

即:比较AL/AX/EAX与第一个操作数,如果相等,则置ZF=1,并复制第二个操作数给第一个操作数;否则,置ZF=0,并复制第一个操作数给AL/AX/EAX。

说明:CMPXCHG主要为实现原子操作提供支持

CMPXCHG8B(8字节比较交换指令)

写法:CMPXCHG8B MEM64;

功能:将EDX:EAX中的64位数与内存的64位数进行比较,如果相等,则置ZF=1,并存储ECX:EBX到mem64指定的内存地址;否则,置ZF=0,并设置EDX:EAX为mem64的8字节内容

21、MUL(无符号乘法)

写法:MUL reg/mem;

作用:当操作数为8位时,AX=AL*src;

当操作数为16位时,DX:AX=AX*src;

当操作数为32位时,EDX:EAX=EAX*src;

22、IMUL(带符号位乘法)

写法:IMUL reg/mem;(作用同上)

IMUL reg16,reg16/mem16,imm16;

IMUL reg32,reg32/mem32,imm32;

IMUL reg16,imm16/reg16/imm16;

IMUL reg32,reg32/mem32/imm32;

注意:没有两个操作数均为8位的多操作数乘法。

对于同一个二进制数,采用MUL和IMUL执行的结果可能不同,设AL=0FF,BL=1,分别执行下面的指令,会得到不同的结果:

Mul bl;AX=0FFH(255);

Imul bl;AX=0FFFFH(-1)(高一半为低一半的扩展)

23、DIV(无符号除法)/IDIV(带符号数除法)

写法:DIV reg/mem;/IDIC reg/mem

作用:如果操作数是8位,AX%SRC,结果商在AL、余数在AH中;

如果操作数是16位,DX:AX%SRC,结果商在AX,余数在DX中;

如果操作数是32位,EDX:EAX%SRC,结果商在EAX,余数在EDX中;

注意:不能直接实现8位数除8位数、16位数除16位数、32除32,若需要这样,则必须先把除数符号扩展或零扩展到16、32、64位,然后用除法指令。

对于IDIV,余数和被除数符号相同,如:-5 IDIV 2 = 商-2,余数:-1;

在下列情况下,会使CPU产生中断:一:除数为0 ;二:由于商太大,导致EAX\AX 或AL不能容纳,从而产生了溢出。

-----------------BCD码调整指令(十进制调整指令)待补充

------------------------------------------------

24、关于BCD码:BCD码就是一种十进制数的二进制编码表示,分为压缩BCD码和非压缩BCD码,压缩BCD码用4个二进制位表示一个十进制位,即用0000B~1001B表示十进制0~9,如0110 0100 0010 1001B表示6429

用8位二进制来表示一个十进制叫非压缩BCD码,其中,低四位与压缩BCD码相同,高四位无意义。

压缩BCD码调整指令包括DAA(加法的压缩BCD码调整)和DAS(减法的压缩BCD 码调整)

写法:

DAA;

作用:调整AL中的和为压缩BCD码。

功能:使用DAA指令时,通常先执行ADD/ADC指令,将两个压缩BCD码相加,结果存放在AL中,然后使用该指令将AL调整为压缩BCD码格式。

DAA的调整算法:

IF(AL低4位>9 或AF=1)

THEN

AL=AL+6;

AF=1;

ENDIF

IF( AL高4位>9或CF=1)

THEN

AL=AL+60H;

CF=1;

ENDIF

说明:CF反映压缩BCD码相加的进位。

DAS;

作用:调整AL中的差为压缩BCD码。

功能:使用DAS指令时,通常先执行SUB/SBB指令,将两个压缩BCD码相减,结果存放在AL中,然后使用该指令将AL调整为压缩BCD码格式。

DAS的调整算法:

IF(AL低4位>9 或AF=1)

THEN

AF=1;

ENDIF

IF( AL高4位>9或CF=1)

THEN

AL=AL-60H;

CF=1;

ENDIF

说明:CF反映压缩BCD码相减的借位。

特别注意,如果使用DAA或DAS指令,则参加加法或减法运算的操作数应该是压缩BCD码,如果将任意两个二进制数相加或相减,然后调整,则得不到正确的结果。

关键是调整的规则,其中AF标志位就是专门为BCD码调整设计的,当低四位有向高四位进位或借位时,值为1。而CF就是最高位有进位或者借位时,为1.

非压缩BCD码调整指令,包括AAA,AAS,AAM,AAD。

写法:AAA ;

作用:调整AL中的和为非压缩BCD码;调整后,AL高4位等于0,AH=AH+产生的CF

功能:使用AAA指令时,通常先执行ADD/ADC指令,以AL为目的操作数,将两个非压缩BCD码(与高位无关)相加,然后使用AAA将AL调整为非压缩BCD码格式,且高4位等于0,同时,将调整产生的进位加到AH中。

AAA调整算法:

IF(AL低4位>9 或者AF=1)

THEN

AH=AH+1;

AF=1;

CF=1;

ELSE

AF=0;CF=0;

ENDIF

AL=AL AND OFH;;AL高4位清0

写法:AAS ;

作用:调整AL中的差为非压缩BCD码;调整后,AL高4位等于0,AH=AH-产生的CF

功能:使用AAS指令时,通常先执行SUB/SBB指令,以AL为目的操作数,将两个非压缩BCD码(与高位无关)相减,然后使用AAS将AL调整为非压缩BCD码格式,且高4位等于0,同时,将调整产生的借位从AH中减去。

AAA调整算法:

IF(AL低4位>9 或者AF=1)

THEN

AL=AL-6;

AH=AH-1;

AF=1;

CF=1;

ELSE

ENDIF

AL=AL AND OFH;;AL高4位清0

写法:AAM;

作用:AH=AX DIV 10, AL=AX MOD 10;

功能:使用AAM时,通常先执行MUL/IMUL指令,将两个一字节非压缩BCD码(高四位必须为0)相乘,结果存入AX.然后使用AAM指令将AX(AH=0)调整为两字节压缩BUC码格式。

写法:AAD;

作用:AL=AH*10+AL,AH=0;

功能:使用AAD时,通常先执行该指令,将AX中的两字节非压缩BCD码(AH与AL的高4位必须为0)调整为相应的二进制表示,然后使用DIV/IDIV指令,除以一个一字节的非压缩BCD码(高四位必须为0),可得到非压缩BCD码的除法结果。

特别注意,参加非压缩BCD码乘法或除法的操作数高4位必须为0。

-----------------------------算术指令结束

-----------------------------------------------------------------------------

-----------------------------------------位操作指令开始

-----------------------------------------------------

25、AND\OR\XOR\NOT\TEST

写法:

AND reg/mem,reg/mem/imm;

OR reg/mem,reg/mem/imm;

XOR reg/mem,reg/mem/imm;

NOT reg/mem;

TEST reg/mem,reg/mem/imm;

作用:AND\TEST\OR\XOR,两个操作数必须类型匹配,而且不能同时是内存操作数。

XOR通常用来将寄存器清0,如XOR AX,AX;

TEST与AND的关系类似于CMP与SUB。TEST的典型用法是检查某位是否为1,如:TEST DX,109H;

若DX的第0,3,8位至少有一位为1,则ZF=0,否则ZF=1;

26、移位指令

SHL(逻辑左移)

写法:SHL REG\mem,1\CL ;

作用:将dest的各个二进制位向左移动1(CL)位,并将DEST的最高位移出到CF,最低位移入0。

SAL(算术左移)

写法:SAL REG\mem,1\CL ;

作用:将dest的各个二进制位向左移动1(CL)位,并将DEST的最高位移出到CF,最低位移入0(同SHL)。

SHR(逻辑右移)

写法:SHR REG\mem,1\CL ;

作用:将dest的各个二进制位向左移动1(CL)位,并将DEST的最低位移出到CF,最高位移入0。

SAR(算术右移)

写法:SAR REG\mem,1\CL ;

作用:将dest的各个二进制位向左移动1(CL)位,并将DEST的最低位移出到CF,最高位不变。

SHLD(双精度左移)

写法:SHLD REG16/REG32/MEM16/MEM32, REG16/REG32, IMM8/CL;(类型须匹配)

作用:将OPRD1的各二进制左移,并将oprd1的最高位移到CF,oprd2的最高位移到oprd1的最低位,但是,oprd2的值不变。

SHRD(双精度右移)

写法与作用与双精度左移类似。注意移动方向为右移。

以上位移指令对标志位的影响:

若移位后符号位发生了变化,则OF=1,否则OF=0;CF为最后移入位;按一般规则影响ZF与SF。然而,若移位次数为0,则不影响标志位;若移位次数大于1,则OF无定义。

27、循环移位指令

ROL(循环左移)

写法:ROL REG\MEM, 1\CL;或ROL REG/MEM,IMM8;(类型可不匹配)

作用:将DEST的各二进制位向左移动,并将最高位移出到CF,并同时移入最低位。

ROR(循环右移)

写法:ROR REG\MEM, 1\CL;或ROR REG/MEM,IMM8;(类型可不匹配)

作用:将DEST的各二进制位向右移动,并将最低位移出到CF,并同时移入最高位。

RCL(带进位循环左移)

写法:RCL REG\MEM, 1\CL;或RCL REG/MEM,IMM8;(类型可不匹配)

作用:将DEST的各二进制位向左移动,并将最高位移出到CF,原CF移入最低位。

RCR(带进位循环右移)

写法:RCR REG\MEM, 1\CL;或RCR REG/MEM,IMM8;(类型可不匹配)

作用:将DEST的各二进制位向右移动,并将最低位移出到CF,原CF移入最高位。

28、位测试指令

BT(位测试)

写法:BT REG16/MEM16,REG16/IMM8;或BT REG32/MEM32,REG32/IMM8;

作用:CF=DEST的第index位,dest不变。

BTS(位测试并置位)

写法:BTS REG16/MEM16,REG16/IMM8;或BTS REG32/MEM32,REG32/IMM8;

作用:CF=DEST的第index位,dest的第index位=1;

BTR(位测试并复位)

写法:BTR REG16/MEM16,REG16/IMM8;或BTR REG32/MEM32,REG32/IMM8;

作用:CF=DEST的第index位,dest的第index位=0;

BTC(位测试并复位)

写法:BTC REG16/MEM16,REG16/IMM8;或BTC REG32/MEM32,REG32/IMM8;

作用:CF=DEST的第index位,dest的第index位取反;

说明:若dest为寄存器,则以index除以16(dest为reg16)或32(dest为reg32)的余数作为测试位。当然,index最好不要超出操作数的位数。

若dest为内存操作数,则无论其类型为字或双字,测试位为相对于起始地址的位移,例如,设BX=50,X为字类型的变量,则执行指令BT X,BX;后,CF=X+6单元的第2位,因为50%8=6余2.

BTS、BTC、BTR指令可用于并发程序设计。

29、位扫描指令

BSF(前向位扫描)

写法:BSF reg16/reg32,reg16/reg32/mem16/mem32;(类型须匹配)

作用:dest=src中值为1的最低位编号(从低位向高位搜索)

BSR(后向位扫描)

写法:BSR reg16/reg32,reg16/reg32/mem16/mem32;(类型须匹配)

作用:dest=src中值为1的最高位编号(从高位向低位搜索)

说明:BSF和BSR搜索SRC操作数中首次出现1的位置,BSF从低位向高位搜索,BSR反之。若找到一个1,则置ZF=0,并存储位编号到DEST操作数中。若SRC=0,即没有1出现,则置ZF=1,且dest的值不确定。

比如,有如下二进制数0111 1111 1010 0100

执行bsf后,位编号为2,执行bsr后,位编号为14.

30、条件置位指令

通用写法:SETcc reg8/mem8

作用:若条件cc成立,则dest=1,否则,dest=0;

SETcc有很多种命令形式,这里的cc只是一个描述符,具体的参见下面的三个表,其中,E(Equal)表示相等,G(Greatet)表示带符号大于,L(Less)表示带符号小于,A (Above)表示无符号大于,B(Below)表示无符号小于。

表一:测试单个标志位的SETcc指令:

SETcc指令描述置1条件

SETC,SETB,SETNA

有进位时置1 CF=1

E

SETNC,SETNB,SET

无进位时置1 CF=0

AE

SETZ,SETE 为0(相等)时置1 ZF=1

SETNA,SETNE 非0(不等)时置1 ZF=0

SETS 为负时置1 SF=1

SETNS 为正时置1 SF=0

SET0 溢出时置1 OF=1

SETNO 不溢出时置1 OF=0

SETP,SETPE …1?的个数为偶数时置1 PF=1

SETNP,SETPO …1?的个数为奇数时置1 PF=0

表二:用于带符号数比较的SETcc指令,这些指令常用在CMP指令之后,以判断带符号数的大小:

SETcc指令描述置1条件

SETG,SETNLE 大于(不小于等于)时置1 SF=OF且ZF=0 SETGE,SETNL 大于等于(不小于)时置1 SF=OF

SETL,SETNGE 小于(不大于等于)时置1 SF≠OF

SETLE,SETNG 小于等于(不大于)时置1 SF≠OF或ZF=1 表三:用于无符号数比较的SETcc指令,常用在CMP指令之后,用来判断无符号数的大小:

SETcc指令描述置1条件

SETA,SETNBE 大于(不小于等于)时置1 CF=0且ZF=0 SETAE,SETNB,SETN大于等于(不小于)时置1 CF=0

C

SETB,SETNAE,SETC 小于(不大于等于)时置1 CF=1

SETBE,SETNA 小于等于(不大于)时置1 CF=1或ZF=1 -----------------------------------------位操作指令结束

----------------------------------------------------

----------------------------------------------------

---------------------------控制转移指令开始--------------------------------------------------

31、JMP(无条件转移指令)

执行代码的跳转,分为两种,一:段内转移,即要跳过去的代码地址和当前地址在同一段,这时只要修改IP(专用寄存器--指令指针)即可;二:段间转移:即要跳过去的代码地址和当前代码地址不在同一段内,需要同时修改CS和IP的值。

写法:

1、JMP label;若label与该指令位于同一代码段内,IP=label的偏移地址,否则

CS:IP=label的分段地址,简单的说,就是跳到label的地址去。

2、JMP reg16/mem16;段内转移,偏移地址=reg16/[mem16]

3、JMP mem32;段间间接转移,段地址CS=mem32高字,偏移地址IP=mem32低字。

说明:当操作数是内存操作数时,若内存操作数是双字类型,则产生段间转移,若内存操作数是字类型,则产生段内间接转移。当不能确定类型时,编译器将报错。

32、Jcc(条件转移指令)

写法:Jcc label;

作用:若条件成立,则IP=label的偏移地址,否则,CPU将忽略该条件转移,继续执行下一条指令。

条件转移有以下几种形式:

表一:测试单个标志位的Jcc指令:

Jcc指令描述转移条件

JC,JB,JNAE 有进位时转移CF=1

JNC,JNB,JAE 无进位时转移CF=0

JZ,JE 为零(相等)时转移ZF=1

JNZ,JNE 非零(不等)时转移ZF=0

JS 为负时转移SF=1

JNS 为正时转移SF=0

JO 溢出时转移OF=1

JON 不溢出时转移OF=0

JP,JPE …1?的个数为偶数时转移PF=1

JNP,JPO …1?的个数为奇数时转移PF=0

表二:用于带符号数比较的Jcc指令(常用在CMP指令之后,以判断带符号数的大小)Jcc指令描述转移条件

JG,JNLE 大于(不小于等于)时转移SF=OF且ZF=0 JGE,JNL 大于等于(不小于)时转移SF=OF

JL,LNGE 小于(不大于等于)时转移SF<>OF

JLE,LNG 小于等于(不大于)时转移SF<>OF或

ZF=1

表三:用于无符号数比较的Jcc指令(常用在CNO指令之后,以判断无符号数的大小)Jcc指令描述转移条件

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

汇编指令和机器码的对应表

汇编指令和机器码的对应表 汇编2010-04-20 21:07:19 阅读259 评论0 字号:大中小订阅 一、汇编速查 MOV AA,BB 将BB 放到AA 里 CALL 调用子程序(相当于BASIC 的GOSUB) RET 与RETF 返回程序(相当于BASIC 的RETURN) CMP XX,YY 比较XX 与YY JZ 若相等则转移 JNZ 若不相等则转移 JB 若小于则转移 JG 若大于则转移 JMP 无条件转移 J??? (各种转移指令) LOOP 循环直到CX为0 INT XX 类似CALL 的中断涵数 PUSH 推入栈(STACK)ESP:PUSH AX POP 出栈ESP:POP CX XCHG 交换ESP:XCHG AX,BX IN、OUT 与PORT有关的IN/OUT XLAT 查表 LEA 段内偏移量。ESP:LEA AX,AREA1=MOV AX,OFFSET AREA1 LAHF、SAHF与棋标有关的寄存器AH PUSHF、POPF将棋标入/出栈 ADD ESP ADD AX,CX (AX=AX+CX) ADC 加入棋标C的ADD INC ESP INC AX(AX=AX+1) AAA 加法校正 SUB、SBB 减法 DEC ESP:DEC AX(AX=AX-1) NEG 去补, MUL、IMUL 乘 DIV、IDIV 除 SHR、SAR、SHL 算术、逻辑位移R=RIGHT L=LEFT OR、XOR、AND 逻辑运算ESP :XOR AX,AX(AX=0) 直接标志转移 指令格式机器码测试条件如...则转移 JC 72 C=1 有进位 JNS 79 S=0 正号 JNC 73 C=0 无进位 JO 70 O=1 有溢出 JZ/JE 74 Z=1 零/等于 JNO 71 O=0 无溢出

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

汇编语言指令表

汇编语言指令表文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

伪指令 1、定位伪指令 ORG m 2、定义字节伪指令 DB X1,X2,X3,…,Xn 3、字定义伪指令 DW Y1,Y2,Y3,…,Yn 4、汇编结束伪指令 END 寻址方式 MCS-51单片机有五种寻址方式: 1、寄存器寻址 2、寄存器间接寻址 3、直接寻址 4、立即数寻址 5、基寄存器加变址寄存器间接寻址 6、相对寻址 7、位寻址 数据传送指令 一、以累加器A为目的操作数的指令(4条) MOV A,Rn ;(Rn)→A n=0~7 MOV A,direct ;( direct )→A MOV A,@Ri ;((Ri))→A i=0~1 MOV A,#data ; data →A 二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)→ Rn MOV Rn ,direct;( direct )→ Rn MOV Rn ,#data; data → Rn 三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)→direct MOV direct,Rn;(Rn)→direct MOV direct,direct ;(源direct)→目的direct MOV direct,@Ri;((Ri))→direct MOV direct,#data; data→direct 四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)→(Ri) MOV @Ri,direct;(direct)→(Ri) MOV @Ri,#data; data→(Ri) 五、十六位数据传送指令(1条) MOV DPTR,#data16;dataH→DPH,dataL →DPL

STM 常用汇编指令

在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。 ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。 ARM指令使用的基本格式如下: 〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉} opcode操作码;指令助记符,如LDR、STR等。 cond可选的条件码;执行条件,如EQ、NE等。 S可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。 Rd目标寄存器。 Rn存放第1操作数的寄存器。 operand2第2个操作数 arm的寻址方式如下: 立即寻址 寄存器寻址 寄存器间接寻址 基址加偏址寻址 堆栈寻址 块拷贝寻址 相对寻址 这里不作详细描述,可以查阅相关文档。 数据处理指令 Load/Store指令 程序状态寄存器与通用寄存器之间的传送指令 转移指令 异常中断指令 协处理器指令 在S3C2410、S3C2440的数据手册中对各种汇编指令有详细的描述;这里只对较常见的作写介绍。 1、相对跳转指令:b、bl 这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。 这两条指令的可跳转范围是当前指令前后32M。 b funa .... funa: b funb ....

funb: .... 2、数据传送指令mov,地址读取伪指令ldr mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。 mov r1,r2 mov r1,#1024 mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。 ldr r1,=1024 3、内存访问指令ldr、str、ldm、stm ldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有'='时标伪指令,否则表内存访问指令。 ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。 ldr r1,[r2,#4] ldr r1,[r2] ldr r1,[r2],#4 str r1,[r2,#4] str r1,[r2] str r1,[r2],#4 寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下: LDM/STM{}Rn{!}, 4、加减指令add、sub add r1,r2,#1 sub r1,r2,#1 5、程序状态寄存器的访问指令msr,mrs ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。这两条指令分别是: 状态寄存器到通用寄存器的传送指令(MRS) 通用寄存器到状态寄存器的传送指令(MSR) 其汇编格式如下: MRS{}Rd,CPSR|SPSR 其汇编格式如下:

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

汇编语言指令

汇编语言指令集 数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2

格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL 影响标志: C,P,Z,S,O ROR,ROL,RCR,RCL

PIC16系列_单片机常用伪指令(汇编)

PIC 单片机端口电平变化中断使用必须注意的问题 PICC18使用说明 PIC 单片机常用伪指令 PIC单片机2009-02-19 11:16:40 阅读8 评论0 字号:大中小订阅 3.2.3 MPASM 的伪指令 我们在第一章中已经详细介绍了中档PIC 单片机的35 条指令,源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不亚于35 条正真的汇编指令。我们在此着重介绍最常用的几种 伪指令。 #include 或include #include 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。 被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM 能够识别的。最经常被“include”的是针对PIC 单片机内部特殊功能寄存器定义的包含头文件,在MPLAB 安装后它们全部放在路径“ C:\Program Files\MPLAB IDE\MCHIP_Tools”下,每一个型号的PIC 单片机都有一个对应的预定义包含头文件,扩展名是“.inc”。除了一些符号预定义文件,你也可以把现有的其它程序文件作为一个代码模块直接“包含”进来作为自己程序的一部分。见例3-01。 #include ;把预定义的PIC16F877A 寄存器符号包含到此处 #include ”math.asm” ;把现有的程序文件包含进来作为自己代码的一部分 例3-01 请注意被包含文件的引用方式。一种是<>尖括号引用,这种引用意味着让编译器去默认的路径下寻找该文件,MPASM 默认的寄存器预定义文件存放路径即为上面提及的MPLAB 安装后的目录;另一种是””双引号引用,这种引用方式的意思是指示编译器从引号中指定的全程文件路径下寻找该文件。例3-01 中”math.asm”没有指定路径,即意味着在当前项目路径下寻找math.asm 文件。如果编译器找不到被包含的文件,将会有错误信息告 知。 请在你的源程序中尽量用MPLAB 标准头文件定义的寄存器符号。一来这些被定义的寄存器符号和芯片数据手册上的描述一一对应,理解起来即直观又容易;二来如果用你自己定义符号就缺乏一个大家能一起交流的标准平台,其他人要解读你的代码时将费时费力。故例3-01 中的首行#include 包含引用伪指令可以说是PIC 单片机程序编写时的标准必备。

汇编指令大全

ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令 L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少) INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用 S001C: RRC A ;累加器A的内容带进位位右移(设A=11H,C=0 ;单步执行后查A和C内容为多少) DEC A ;A的内容减1 DEC 01H ;直接地址(01H)内容减1 DEC @R0 ;R0间址减1,即R0的内容为地址,该地址的内容减1 DEC @R1 ; R1间址减1 DEC R0 ; R0内容减1 DEC R1 ; R1内容减1 DEC R2 ; R2内容减1 DEC R3 ; R3内容减1 DEC R4 ; R4内容减1 DEC R5 ; R5内容减1 DEC R6 ; R6内容减1 DEC R7 ; R7内容减1 JB 20H,L002D;如果位(20H,即24H的0位)为1则转移 L002D: AJMP L0017 ;绝对转移 RET ;子程序返回指令 RL A ;A左移 ADD A,#01H ;A的内容与立即数(01H)相加 ADD A,01H ; A的内容与直接地址(01H内容)相加 ADD A,@R0 ; A的内容与寄存器R0的间址内容相加 ADD A,@R1 ; A的内容与寄存器R1的间址内容相加

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 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. 寄存器功能 . 寄存器的一般用途和专用用途 . CS:IP 控制程序执行流程 . SS:SP 提供堆栈栈顶单元地址 . DS:BX(SI,DI) 提供数据段内单元地址 . SS:BP 提供堆栈内单元地址 . ES:BX(SI,DI) 提供附加段内单元地址 . AX,CX,BX和CX寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅指令表)。. PSW程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。 2. 存储器分段管理 . 解决了16位寄存器构成20位地址的问题 . 便于程序重定位 . 20位物理地址=段地址* 16 + 偏移地址 . 程序分段组织: 一般由代码段,堆栈段,数据段和附加段组成,不设置堆栈段时则使用系统内部的堆栈。 3. 堆栈 . 堆栈是一种先进后出的数据结构, 数据的存取在栈顶进行, 数据入栈使堆栈向地址减小的方向扩展。 . 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果。 .堆栈总是以字为单位存取 指令系统与寻址方式 1. 指令系统 . 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。执行指令后,一般源操作数不变,目的操作数被计算结果替代。 . 机器指令由CPU执行,完成某种运算或操作,8086/8088指令系统中的指令分为6类: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。 2. 寻址方式 . 寻址方式确定执行指令时获得操作数地址的方法 . 分为与数据有关的寻址方式(7种)和与转移地址有关的寻址方式(4)种。 . 与数据有关的寻址方式的一般用途: (1) 立即数寻址方式--将常量赋给寄存器或存储单元 (2) 直接寻址方式--存取单个变量 (3) 寄存器寻址方式--访问寄存器的速度快于访问存储单元的速度 (4) 寄存器间接寻址方式--访问数组元素 (5) 变址寻址方式 (6) 基址变址寻址方式 (7) 相对基址变址寻址方式(5),(6),(7)都便于处理数组元素 . 与数据有关的寻址方式中,提供地址的寄存器只能是BX,SI,DI或BP . 与转移地址有关的寻址方式的一般用途: (1) 段内直接寻址--段内直接转移或子程序调用 (2) 段内间接寻址--段内间接转移或子程序调用

汇编语言的各条指令

常用命令 数据传送指令 一通用数据传送指令 MOV指令为双操作数指令,两个操作数中不能全为内存操作数 格式:MOV DST,SRC 执行操作:dst = src 注:1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作。 格式:PUSH SRC //Word 执行操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) 注:1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器。

2.入栈时高位字节先入栈,低位字节后入栈。 格式:POP DST //Word 执行操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 注:1.出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器。 2.执行POP SS指令后,堆栈区在存储区的位置要改变。 3.执行POP SP 指令后,栈顶的位置要改变。 XCHG(eXCHanG)交换指令: 将两操作数值交换。 格式:XCHG OPR1,OPR2 //Byte/Word 执行的操作:(OPR1)<-->(OPR2) 注:1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 存储器与存储器之间不能交换数据。 二累加器专用传送指令 IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节)

8088 汇编语言指令以及伪指令速查手册

数据传输指令 ───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里 ) XLAT 字节查表转换. ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 其范围是 0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI. 4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器. PUSHF 标志入栈. POPF 标志出栈. PUSHD 32位标志入栈.

汇编指令

?应用 注册 用户名密码 ?HOHO ?照片PK ?分享 ?投票 ?测试 ?礼物 ?开心部落 ?汽车工厂 ?七彩鱼 更多?网页游戏 分享 ?热门分享 ?最新分享 ?好友的分享 ?我的分享 如何分享?问题反馈 shxc_3的分享 分享 PIC常用汇编指令 PIC常用汇编指令 常用指令 1.寄存器加1指令:INCF 【格式】INCF F,d 【功能】寄存器F加1

【说明】 (1)INCF是Increment F的缩写; (2)在PIC系列8位单片机中,常用符号F代表片内的各种寄存器和F的序号地址;(3)d=0时,结果存入W;d=1时,结果存入F。 【实例】INCF PORTC,1 ;将PORTC加1 2.寄存器减1指令:DECF 【格式】DECF F,d 【功能】寄存器F减1 【说明】 (1)DECF是Decrement F的缩写; (2)d=0时,结果存入W;d=1时,结果存入F。 【实例】ENCODER EQU 0X21 …… DECF ENCODER,1 ;将ENCODER减1 3.寄存器清零指令:CLRF 【格式】CLRF F 【功能】寄存器清零 【说明】 (1)CLRF是Clear F的缩写; (2)F寄存器被清为全0,使状态位Z=1。 【实例】CLRF TRISC ;对TRISC 清零 4.W清零指令:CLRW 【格式】CLRW

【功能】寄存器W清零 【说明】 (1)CLRW是Clear W的缩写; (2)W为PIC单片机的工作寄存器; (3)W寄存器被清为全0,使状态位Z=1。 【实例】CLRW ;W=00H 5.F寄存器传送指令:MOVF 【格式】MOVF F,d 【功能】将F寄存器内容传送到F或W 【说明】 (1)MOVF是Move F的缩写; (2)当d=1时,传到F本身;当d=0时,传到W; (3)影响状态位Z 【实例】MOVF PORTB,0 ;PORTB口内容送W MOVWF PORTA;W内容即PORTB口内容送PORTA 6.W寄存器传送指令:MOVWF 【格式】MOVWF F 【功能】W寄存器传送 【说明】 (1)MOVWF是Move W to F的缩写; (2)将W寄存器内容传到F,W内容不变; (3)不影响状态位。

8088汇编语言指令

8088指令系统总结 预备知识:符号含意、数据传送原则 符号含意 符号含意 opr 操作数 src 源操作数 dst 目的操作数 mem 存储器 im 立即数 seg 段寄存器 reg 通用寄存器 EA 偏移地址 PA 物理地址 nn直接地址DISP8:8位偏移地址DISP16:16位偏移地址 数据传送原则 口诀数据传送原则 寄段储间互传数,seg、reg、mem之间的数据可以相互传送。 立即只入寄和储。im可入reg、mem 只有寄间互换数,reg之间的数据可以传送。Mem间、seg间不可自传CS立即不可目,CS和立即数不可入,不能当目的操作数 8088指令系统 8088指令系统分六大类 一、数据传送指令 二、算术运算指令 三、逻辑运算与位移指令 四、串操作指令 五、控制与转移指令 六、CPU控制指令 一、数据传送指令 1.通用传送指令 (1)传送指令MOV dst, src功能:dst←src (2)堆栈操作指令人W PUSH src作用:SP←SP-2 ((SP+1)+SP)←src src(reg seg mem) POP dst 作用:dst←((SP+1)+SP)SP←SP-2 dst(reg seg mem)

(3)交换指令XCHG OPR1,OPR2 OPR1←→OPR2 2.累加器传送指令 (1)输入输出指令 256B短格式:直接寻址,64K长格式:直接、间接寻址,PORT为8位口地址输入指令:直接寻址IN AX,PORT IN AL,PORT 间接寻址IN AX,DX IN AL,DX 输出指令:直接寻址OUT AX,PORT OUT AL,PORT 间接寻址OUT AX,DX OUT AL,DX (2)换码指令XLAT AL←(BX+AL)(BX)为mem地址 3.地址传送指令 (1)有效地址传送寄存器 LEA reg16, mem作用:mem的EA→reg16 (2)指针送寄存器和DS指令 LDS reg16, mem32 作用:reg16←mem32的低字高字→DS (3)指针送寄存器和有ES指令 LES reg16, mem32 作用:reg16←mem32的低字高字→ES 4.标志寄存器传送指令 (1)取标志指令:LAHF F的低字节→AH (2)置标志指令:SAHF AH→flag的低字节 (3)标志入栈指令:PUSHF SP-2→SP F→(SP+1):SP (4)标志出栈指令:POPF (SP+1):SP→F SP+2→SP 二、算术运算指令 1.加法类指令(Add)opr-reg mem B/W (1)不带进位加法ADD dst, src dst←dst+src 影响OSZAPC (2)带进位加法ADC dst, src dst←dst+src+CF影响OSZAPC (3)加1指令INC opr opr←opr+1影响OSZP (4)组合十进制调整DAA放在ADD后 (5)非组合十进制调整AAA放在ADC后 原理:2个十进制数相加,可能出现非法数(A到F),需用调整指令,进行加6调整变成合法十进制数。十进制=BCD组合=压缩组合BCD占4位非组合BCD占8位 2 . 减法类指令(substract) (1)减法指令SUB dst, src;dst←dst-src影响标志位OSZAPC (2)带借位减法指令SBB dst, src;dst←dst-src-CF影响标志位

常见汇编语言指令解释:

PC是一个16位的程序计数器。用于存放和指示下一条要执行的指令的地址。寻址范围达64KB。PC有自动加1功能,以实现程序的顺序执行。PC没有地址,是不可寻址的,无法用指令对它进行读写。但在执行转移、调用、返回等指令时能自动改变其内容,以改变程序的执行顺序。 参数代表的意义: 1、Rn 表示R0~R7中的一个 2、#data 表示8位的数值 00H~FFH 3、direct 表示8位的地址 00H~FFH(指的是内部RAM或SFR的地址) 4、@Ri 表示寄存器间接寻址只能是R0或者R1 5、@DPTR 表示数据指针间接寻址 6、bit 表示位地址 7、$ 表示当前地址 常见汇编语言指令解释: 寄存器寻址 MOV A,R1将R1中的数值赋予A 直接寻址 MOV A,3AH将地址3AH中的数值赋予A 立即寻址 MOV A,#3AH将3AH数值赋予A

寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A 变址寻址 MOVC A,@A+DPTR以A中的数值为地址偏移量进行查表 相对寻址 AJMP MATN跳转到行号为MATN处 位寻址 MOV C,7FH 将位地址7FH的数值赋予C MOV A,#3AH数据传输、赋值命令 PUSH direct将direct为地址的数值压入堆栈中 POP direct将direct为地址的数值弹出堆栈 XCH A,direct将direct中的数值与A进行交换 ADD A,direct将direct中的数值与 INC direct将direct中的数值加1 SUBB A,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零:CLR C DEC direct将direct中的数值减1 DA A 用于对BCD码加减法后进行10进制调整 MUL A B将A和B相乘,并把高八位放在B中,低八位放在A中 DIV A B将A和B相除,并把商放在A中,余数放在B中 ANL A,direct将A与direct中的数值进行与运算,结果保留在A 中(与运算规律:有0出0,全1出1) ORL A,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0) XRL A,direct将A与direct中的数值进行异或运算,结果保留在A 中(异或运算规律:全0出0,全1出0,01、10出1)

相关文档
最新文档