[汇编]指令总结

本文详细介绍了汇编语言中的各种指令,包括数据传送指令、地址传送指令、堆栈操作指令、算术指令、位操作指令以及特殊指令如BCD码调整和符号扩展。通过实例解释了每种指令的功能和使用方法,帮助读者理解和掌握汇编语言的基本操作。
摘要由CSDN通过智能技术生成

Z目录

 

数据传送指令

MOV指令:

XCHG(交换)

LEA(装入有效地址)

LDS\LES\LGS\LSS

堆栈:

PUSH(进栈)

POP(出栈)

PUSHA、PUSHAD、POPA、POPAD

PUSHF、PUSHFD、POPF、POPFD

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

符号扩展和零扩展指令

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

MOVSX reg16\32,reg8\reg16\mem8\mem16

MOVZX(零扩展指令)

BSWAP(字节交换)

XLAT(换码)

算术指令

ADD(加法)

ADC (带进位加法)

INC(自加一)

XADD(交换加)

SUB(减法)

SBB(带借位减法)

DEC(自减1)

CMP(比较)

NEG(求补)

CMPXCHG(比较交换)

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

MUL(无符号乘法)

IMUL(带符号位乘法)

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

BCD码:

DAA;

DAS;

AAA ;

AAM;

AAD;

位操作指令

AND\OR\XOR\NOT\TEST

移位指令

SHL(逻辑左移)

SAL(算术左移)

SHR(逻辑右移)

SAR(算术右移)

SHLD(双精度左移)

SHRD(双精度右移)

27、循环移位指令

ROL(循环左移)

ROR(循环右移)


1数据传送指令

1.1MOV指令:

把源操作数的值resourse复制到目的操作数

MOV target,resourse;

注意:

1target不可为CS(代码段不可写,只可读)

2target和source不能同时为内存数、段寄存器(CS\DS\ES\SS\FS\GS)

3不能将立即数传送给段寄存器

4target和source必须类型匹配,比如,要么都是字节,要么都是字或者都是双字等。

1.2XCHG(交换)

两个寄存器,寄存器和内存变量之间内容的交换 

XCHG object1,object2;交换object1与object2的值

注:

1)不能直接交换两个内存数的值

 2)类型必须匹配

3)两个操作数任何一个都不能是段寄存器

4)必须是通用寄存器(ax、bx、cx、dx、si、di)或内存数

XCHG  ax,[bx][si];

XCHG ax,bx;

2地址传送指令

2.1LEA(装入有效地址)

LEZ reg16,mem;

将把存储单元的16位有效偏移地址MEM的值装入到16位的通用寄存器中。

假定bx=5678H,EAX=1,EDX=2

LEA si,2[BX]            ;SI=BX+2=5678X+2=567AH     

LEA di,2[EAX][EDX]      ;DI=EAX+EDX+2=1+2+2=5

这里装入的是有效偏移地址,并不是实际的内存中的数值,如果要想取内存中该地址对应的数值,还需要加上段地址才行

2.2LDS(取数据段寄存器指令)

有效地址MEM的值,到16位的通用寄存器中。将双字指针送到寄存器和DS

这里装入的是值,不是有效地址把内存4个单元的32位数,分别送到段寄存器DS和由DST指出的偏移量寄存器。

LDS reg16,mem32 ;

reg16等于mem32的低字,而DS对应于mem32的高字

2.2LES(取附加段寄存器指令)

LES reg16,mem32  ;

reg16等于mem32的低字,ES对应于mem32的高字

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

3堆栈操作指令

位于内存的堆栈段中,是内存的一部分,具有“先进后出”的特点,

堆栈只有一个入口,即当前栈顶,

当堆栈为空时,栈顶和栈底指向同一内存地址

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

3.1PUSH(进栈)

将通用寄存器/段寄存器/内存数/立即数的值  压入栈中

PUSH reg16(32)/seg/mem16(32)/imm;

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

3.2POP(出栈)

将堆栈口的16(32)位数据推出到通用寄存器/段寄存器/内存中,

POP reg16(32)/seg/mem16(32);//不能出栈到CS中

寄存器/段寄存器/内存= SS:[SP]   SP=SP+2(当将32位数值出栈时,SP=SP+4)(注意,不能出栈给立即数哦,常量不可变嘛)

3.3PUSHA、PUSHAD、POPA、POPAD

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

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

3.4PUSHF、PUSHFD、POPF、POPFD

标志寄存器FLAGS(EFLAGS)进栈或出栈

  PUSHF ;FR寄存器推入堆栈

  POPF; 栈顶字出栈到FLAGS

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

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

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

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

4 算术指令

4.1ADD(加法)

ADD reg/mem,reg/mem/imm;

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

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

OPRD1: REG、 MEM
OPRD2: REG、 MEM、 im

4.2ADC (带进位加法)

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;

4.3INC(自加一)

将操作数的内容加1后,再送回该操作数中。

INC reg/mem;

dest=dest+1;

4.4XADD(交换加)

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

XADD reg/mem, reg;

4.5SUB(不带借位减法)

两个操作数相减&

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值