80X86常用汇编指令集

80X86常用汇编指令集
80X86常用汇编指令集

80X86常用汇编指令集ZZ

作者 : 赵振东ZZD

学习汇编语言,最关键的就在于汇编指令集的掌握以及计算机工作方式的理解,以下是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

AL=AL-6;

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

AL=AL+6;

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

AF=0;CF=0;

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位取反;

通常,程序内部的跳转,用JMP或CALL,并且JMP和CALL得参数是要跳转的过程的入口指令地址,而INT则是调用系统提供的中断服务程序,并且参数是中断号,然后由CPU根据中断号去计算中断服务程序的入口地址,MS DOS使用中断号21H 作为系统调用,一般INT中断的步骤如下:

(1)由AH给出中断号

(2)根据相应功能的要求,设置入口参数

(3)INT 21H

(4)分析和使用出口参数

比如如下代码实现程序的退出并返回DOS:

Mov ah,4ch;-----给出中断号

Int 21h;-----开始中断

说明:除了直接以AL或AX返回出口参数外,INT 21H还是用AL或AX作为返回码,对于功能号0~2eh,由AL返回0(表示成功)或1(表示失败);其余功能号则由CF返回0或者1,并由AX返回错误码。

---------------------------控制转移指令结束--------------------------------------------------

-----------------------------标志处理指令开始-----------------------------------------------------------

37、标志处理指令

CLC ; CF=0

STC ; CF=1

CMC ; CF=NOT CF

CLD ; DF=0

STD ; DF=1

CLI ; IF=0(应慎用)

STI ; IF=1

-----------------------------标志处理指令结束-----------------------------------------------------------

---------------------------串操作指令开始--------------------------------------------------

到这为止,所涉及的指令都是处理一个操作数,如果要处理连续内存单元的一批数据,通常需借助于循环。而串操作指令就可以用来处理内存中的数据串,并在助记符后面加上B、W、D分别表示操作类型为字节、字或双字

38、MOVS(串传送)

写法:

MOVSB/MOVSW/MOVSD

功能:

ES:[DI]=DS:[SI]

If(DF=0)

Then

SI=SI+size;

DI=DI+size;

Else

SI=SI-size;

DI=DI-size;

Endif

其中,size等于1(B)、2(W)、4(D).

作用:将DS:SI所指源串的一个字节/字/双字复制到ES:DI所指的内存单元,然后,若DF=0,则SI和DI增加1、2、4,否则减少1、2、4.

现在有点明白为什么SI为源变址寄存器,而DI为目标变址寄存器了,而DS为数据段寄存器,ES为附加段寄存器了。

(完整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段寄存器中。

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

(完整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):堆栈段寄存器;

汇编语言知识大全

第一章基础知识: 一.机器码: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

汇编语言指令汇总

汇编语言程序设计资料简汇 通用寄存器 8位通用寄存器8个:AL、AH、BL、BH、CL、CH、DL、DH。 16位通用寄存器8个:AX、BX、CX、DX、SI、DI、BP、SP。 AL与AH、BL与BH、CL与CH、DL与DH分别对应于AX、BX、CX和DX的低8位与高8位。专用寄存器 指令指针:IP(16位)。 标志寄存器:没有助记符(FLAGS 16位)。 段寄存器 段寄存器:CS、DS、ES、SS。 内存分段:80x86采用分段内存管理机制,主要包括下列几种类型的段: ?代码段:用来存放程序的指令序列。 ?数据段:用来存放程序的数据。 ?堆栈段:作为堆栈使用的内存区域,用来存放过程返回地址、过程参数等。 物理地址与逻辑地址 ?物理地址:内存单元的实际地址,也就是出现在地址总线上的地址。 ?逻辑地址:或称分段地址。 ?段地址与偏移地址都是16位。 ?系统采用下列方法将逻辑地址自动转换为20位的物理地址: 物理地址= 段地址×16 + 偏移地址 ?每个内存单元具有唯一的物理地址,但可由不同的逻辑地址描述。 与数据有关的寻址方式 立即寻址方式 立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位数或16位数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。 例:MOV AL,18 指令执行后,(AL)= 12H 寄存器寻址方式 在寄存器寻址方式中,操作数包含于CPU的内部寄存器之中。这种寻址方式大都用于寄存器之间的数据传输。 例3:MOV AX,BX 如指令执行前(AX)= 6789H,(BX)= 0000H;则指令执行后,(AX)= 0000H,(BX)保持不变。 直接寻址方式 直接寻址方式是操作数地址的16位偏移量直接包含在指令中,和指令操作码一起放在代码段,而操作数则在数据段中。操作数的地址是数据段寄存器DS中的内容左移4位后,加上指令给定的16位地址偏移量。直接寻址方式适合于处理单个数据变量。 寄存器间接寻址方式 在寄存器间接寻址方式中,操作数在存储器中。操作数的有效地址由变址寄存器SI、DI或基址寄存器BX、BP提供。 如果指令中指定的寄存器是BX、SI、DI,则用DS寄存器的内容作为段地址。 如指令中用BP寄存器,则操作数的段地址在SS中,即堆栈段。

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 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:

PIC8位单片机汇编语言常用指令的识读

PIC8位单片机汇编语言常用指令的识读(上) 各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。 PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC 系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。 在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。 一、PIC汇编语言指令格式 PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下: 标号操作码助记符操作数1,操作数2;注释 指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。 1 标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。 书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。 2 操作码助记符该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。 3 操作数由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。在这里PIC 8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。 指令的操作数项也是可选项。 PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。 4 注释用来对程序作些说明,便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。 二、清零指令(共4条) 1 寄存器清零指令 实例:CLRW;寄存器W被清零 说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。 2 看门狗定时器清零指令。 实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)

汇编语言指令分类详解

3.1 8086/8088寻址方式 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在 操作码的后面,与操作码一起放在代码段区域中。 如图所示。 例如:MOV AX,3000H 立即数可以是8位的,也可以是16位的。若 是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如:MOV AX,DS:[2000H];

图2-2 (对DS来讲可以省略成MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以 分成两种情况: (1)以SI、DI、BX间接寻址,则 通常操作数在现行数据段区域 中,即数据段寄存器(DS)*16 加上SI、DI、BX中的16位偏移 量,为操作数的地址, 例如:MOV AX,[SI] 操作数地址是:(DS)*16+(SI) (2)以寄存器BP间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS)*16与BP的内容相加作为操作数的地址, 例如:MOV AX,[BP] 操作数地址是:(SS)*16+(BP)若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。 例如:MOV AX,DS:[BP] 操作数地址是:(DS)*16+(BP)5.变址寻址 由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个

MIPS 指令系统和汇编语言

第四章MIPS指令系统和汇编语言 1.考研预测:出题特点总结 本章是对统考408内容来说,本章是新增的章节。此外北航961大纲中制定了要考MIPS 指令集,从15年961真题来看MIPS是重中之重。但是今年计组并没有指定具体的教材,但大纲明确要求掌握MIPS指令集,所以还是建议考生将《计算机组成与设计:硬件/软件接口》中文版(原版第三版或第四版)作为本章的参考书籍。 本章大致内容是MIPS的基础知识,难度并不大。考生应该将重点放在MIPS指令集的基础上,考察C语言中的语句转换为对应的MIPS指令,所以需要熟练掌握C语言中一些语句对应的MIPS指令实现。本章出题很大可能就是C语言和MIPS汇编语言之间的转换,也可能涉及到第五章CPU指令流水线等内容。 2.考研知识点系统整理:梳理考点,各个击破 3.1 指令系统概述 机器指令要素 操作码:指明进行的何种操作 源操作数地址:参加操作的操作数的地址,可能有多个。 目的操作数地址:保存操作结果的地址。 下条指令的地址:指明下一条要运行的指令的位置,一般指令是按顺序依次执行的,所以绝大多数指令中并不显式的指明下一条指令的地址,也就是说,指令格式中并不包含这部分信息。只有少数指令需要显示指明下一条指令的地址。

指令执行周期 3.2 指令格式 一台计算机指令格式的选择和确定要涉及多方面的因素,如指令长度、地址码结构以及操

作码结构等,是一个很复杂的问题,它与计算机系统结构、数据表示方法、指令功能设计等都密切相关。 指令的基本格式 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下: ( 其中A1为第一操作数地址,A2为第二操作数地址,A3为操作结果存放地址。 这条指令的含义:(A1)OP(A2)→A3 式中OP表示双操作数运算指令的运算符号,如“+”或“–”等。 (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)(字节)

汇编语言指令

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的间址内容相加

常见汇编语言指令解释:

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)

汇编语言常见指令

?PTR?操作符:强制类型转换 MOV BYTE PTR [BX], 20H ;1B立即数20H送DS:[BX] MOV WORD PTR [BX], 20H ;立即数20H送DS:[BX], ;00H送DS:[BX+1] 2.LEA(Load Effective Address) 设:变量X的偏移地址为1020H , (BP)=0020H 执行指令后: LEA DX, X LEA BX, [BP] ; 执行后, (DX) = 1020H ; 执行后, (BX) = 0020H 3.地址传送指令LDS,LES LDS REG16, MEM ; 从存储器取出4B,送入REG16和DS LES REG16, MEM ; 从存储器取出4B,送入REG16和ES 4.符号扩展指令CBW,CWD CBW ;将AL寄存器内容符号位扩展到AH CWD ;将AX寄存器内容符号位扩展到DX 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CBW ;(AX)= 0060H 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CWD ;(DX)= 0FFFFH,(AX)= 8060H 5.交换指令XCHG 例如,(AX)= 5678H 执行下面指令后 XCHG AH, AL ;(AX)= 7856H 6.换码指令XLAT XLAT ;AL←DS: [BX+AL] 表格的首地址事先存放在内存逻辑地址DS: BX中, AL的内容是相对于表格的位移量, 把对应内存的内容取出放在AL寄存器。 7.逻辑运算符 SHR(右移) SHL(左移) AND(与) OR(或) XOR(异或)

反汇编语言常用指令

内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址, 在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。 3、指针寄存器

汇编语言指令详解

练习题 1、8086CPU向0052H单元写入一个字,写入过程中BHE和A0的逻辑电平是()。 A、0和0 B、0和1 C、1和0 D、1和1 2、8086CPU用()信号的下降沿在T1结束时将地址信息锁存在地址锁存器中。 A、M/IO B、BHE C、ALE D、READY 3、下列8086CPU标志寄存器FR的标志位中,不属于状态标志位的 是( ) A、OF B、IF C、AF D、PF 4、8086CPU在进行读内存操作时,控制信号M/IO 和DT/R的状态是 ( ) A、00 B、01 C、10 D、11 5、当8086CPU采样到READY=0,则CPU将( ) A、执行停机指令 B、插入等待周期 C、执行空操作指 令 D、重新发送地址码 6、在8086CPU的标志寄存器中,控制标志位占() A、3位 B、9位 C、4位 D、16位 7、8086 CPU内有指示下条指令有效地址的指示器是() A、IP B、SP C、BP D、SI 8、现行数据段位于存储器B0000H到B0FFFH字节单元,则段寄存器

DS的内容及该段长度(字节数)分别为() A、B000H,1000H B、0000H,0FFFH C、B000H,0FFFH D、B000H,00FFH 9、指令MOV BX,[BP]中,约定的段寄存器是( ) A、ES B、SS C、DS D、CS 10、下列指令有语法错误的是() A、MOV [SI],[DI] B、IN AL,DX C、MOV AX,[0100H+BX+SI] D、PUSH BX 11、堆栈操作时,段内偏移量由()寄存器指出。 A、SP B、BP C、SI D、DI 12、地址总线的“宽度”决定了计算机系统内存的最大容量,8086有20根地址线,可寻址()字节的存储单元。 A、512K B、1M C、2M D、4M 13、条件转移指令JZ的测试条件() A、CF=0 B、CF=1 C、ZF=0 D、ZF=1 14、INC指令不影响()标志 A、OF B、CF C、ZF D、SF 15、寄存器间接寻址方式中,操作数在()中。 A、通用寄存器 B、堆栈 C、存储单元 D、段寄存器 16、假设(SS)=2000H,(SP)=0012H,(AX)=1234H,执行PUSH AX后,()=12H

汇编语言常用指令大全解释

常用汇编指令: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段寄存器中。 LES (Load ES with pointer) 指针送寄存器和ES指令 LES REG , SRC //常指定DI寄存器 执行操作: REG=(SRC) , ES=(SRC+2) //与LDS大致相同,不同之处是将ES代替DS而已. LAHF( Load AH with Flags ) 标志位送AH指令

汇编语言实战经验

汇编语言实战经验 “ 哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%& “醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情

相关文档
最新文档