《汇编指令汇总》由会员分享,可在线阅读,更多相关《汇编指令汇总(25页珍藏版)》请在金锄头文库上搜索。
1、通用寄存器及标志寄存器1 通用寄存器:寄存器是学习汇编知识时的第一课,常用寄存器如下:AX/EAX BX/EBX CX/ECX DX/EDX 是通用的数据寄存器 用于暂时存放计算过程中的 操作数结果 或者其他信息。他们可以分为两个独立的 8 位寄存器使用, AL/AH BL/BH CL/CH DL/DH,除了通用功能之外还有以下用途:AX/EAX 作为累加器用,是算数运算的主要寄存器,在乘除指令中用来存放操作数,另外,所有的IO指令都是用AX或AL与外部设备传送信息。BX/EBX在计算存储器地址的时候,可以作为基址寄存器使用。CX/ECX常用来保存计数值,比如移位指令,循环指令和串处理指令中用
2、作隐含的计数器。DX在做双字节长运算的时候,可以把DX和AX组合在一起存放一个双字长数,DX存放 高16位数据,对于某些IO操作,DX还常常存放IO的端口地址。SP/ESP BP/EBP SI/ESI DI/EDI 四个16/32 位寄存器可以像数据寄存器一样在运算过程中 存放操作数,但是他们只能以字(16/32 位)为单位来使用,他们的主要用途是在存储器寻 址时,提供偏移地址,因此他们可称为指针或变址寄存器。SP/ESP 称为堆栈指针寄存器,用来指出栈顶的偏移地址。BP/EBP 称为基址指针寄存器,用来在寻址的时候作为基地址存放的地方,但他必须和堆栈 段寄存器 SS 联用来确定堆栈段中的存储
3、单元地址。2 标志寄存器 条件码标志是用来记录程序中运行结果的状态信息,他们是根据有关指令的运行结果由 CPU 自动设置的,由于这些状态信息往往作为后续条件转移指令的转移控制条件,所以称 为条件码。1 进位标志 CF 记录运算时最高有效位产生的进位值2 符号标志 SF 记录运算结果的符号 1 表示负数 0 表示正数3零标志 ZF运算结果为0时ZF为1否则为04 溢出标志 OF 在运算中如操作数超出了机器可表示数的范围称为溢出 溢出时为 1 否则为 05 辅助进位标志 AF 记录运算时第3位产生的进位值6 奇偶标志 PF 用来为机器中传送信息时可能产生的代码出错情况提供检验条件,当 结果操作数中
4、 1的个数为偶数时置1 否则为0常用指令(传送 交换 取地址 取段 栈操作)先写几个英文简写及含义。reg - 寄存器mem- 内存lmm - 立即数1. 传送指令 MOV reg/mem reg/mem/lmm传送指令,相当于高级语言的赋值语句,把源操作数(reg/mem/1 mm)传送到前面的寄存器 和内存地址中。2. 传送填充指令 MOVSX/MOVZX reg/mem reg/mem/lmm传送填充指令,和MOV语句具有相同功能的基础上,对目的操作数的高位进行填充,又分 为符号填充(MOVSX)和零(MOVZX)填充。(1) 符号填充指令: MOVSX用源操作数的符号位填充目的操作数的
5、高位数据位。比如AL = 87H 则 MOVSX CX AL指令执行之后 CX就是0FF87H零填充指令:MOVZX用0来填充目的操作数的高位数据位。比如AL = 87H 则 MOVZX CX AL指令执行之后 CX就是0087H3. 交换指令 XCHG reg/mem reg/mem交换指令 XCHG 是交换两个寄存器,寄存器和内存变量之间内容的指令,两个操作数的数 据类型要相同。4. 取有效地址指令 LEA reg mem 是把一个内存变量的有效地址传送到寄存器中5. 取段寄存器指令 LDS/LES/LFS/LGS/LSS reg memLDS 是把内存单元的一个“低字”传送到指定的寄存器
6、,并把“高字”传送到段寄存器 DS 中。 LES,LFS,LGS,LSS 是把高字传送到相应的段寄存器 ES,FS,GS,SS 中。6. 栈操作指令 栈的实质是一块内存空间,栈的标准访问形式不同于一般的内存访问形式(用内存地址去 访问),而是通过入栈(压栈)与出栈(弹栈)指令进行访问,且栈是后进先出的。(也可以用内 存地址的形式去访问栈中的内容,但这属于特殊手段),以下就是栈操作指令(1)压栈指令: PUSH, PUSHA, PUSHAD- PUSH reg/mem: 把寄存器和内存单元中的值压入栈中- PUSHA: 依次把 AX,CX,DX,BX,SP,BP,SI,DI 等压入栈中- PUS
7、HAD: 依次把 EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 等压入栈中(2)弹栈指令: POP, POPA, POPAD- POP reg/mem: 弹出栈首的值到指定的寄存器和内存单元中-POPA:把栈中的值依次弹到DI,SI,BPSP,BX,DX,CX,AX等寄存器中-POPAD:把栈中的值依次弹到EDI,ESI,EBPESP,EBX,EDX,ECX,EAX等寄存器中 压栈与弹栈的补充说明:ESP/SP寄存器始终指向栈首,所以在PUSH时,SP=SP-2或4, *SP =操作数(C语法,就是 SP寄存器先向前移动两位和四位,然后将值写入指向的内存区域),POP 一个项
8、的时候,操 作数 = *SP, SP = SP+ 2或4在16位操作系统使用SP,AX等寄存器,在32位操作系统则应该使用ESREAX系列的寄存 器,在64位操作系统则可以使用RSP寄存器。VC+编译器生成的汇编代码使用栈的时候,并不是按标准做法PUSH和POP,而是PUSH 多个项目后,用 ESP 做为基址,向后偏移四位来寻找第二个项,直到访问结束后一次性的 把栈清空,这样省略了多次弹栈。算术运算指令算术运算指令是反映CPU运算能力的指令,也是编程时候最常用到的一组指令,包括加减 乘除以及相关的辅助指令。该组指令的操作数可以是8 位, 16位, 32位(80386+),当存储单元是该类指令的
9、操作数的 时候,该操作数的寻址方式可以是任何一种存储单元的寻址方式。1. 加法指令ADD reg/mem, reg/mem/imm - 加法指令 受影响的标志位: AF CF OF PF SF ZF 功能:把源操作数的值加到目标操作数INC reg/mem受影响的标志位:AF、OF、PF、SF和ZF,不影响CF功能:把操作数的值+1ADC reg/mem, reg/mem/imm - 带进位加指令(较少使用)受影响的标志位: AF CF OF PF SF ZF功能:把源操作数和进位标志位CF的值一起加到目的操作数中XADD reg/mem reg(较少使用)受影响的标志位: AF CF OF
10、PF SF ZF功能:先交换两个操作数 然后执行加法运算以上指令的ADC和XADD在标准VC+编译后的汇编代码中不出现。2. 减法指令SUB reg/mem reg/mem/imm受影响的标志位: AF CF OF PF SF ZF功能:把源操作数的值减去目的操作数DEC reg/mem受影响的标志位:AF、OF、PF、SF和ZF,不影响CF功能:把操作数的值-1SBB reg/mem reg/mem/imm受影响的标志位: AF CF OF PF SF ZF功能:把源操作数和进位标志位CF的值从目的操作数一起减去NEG reg/mem受影响的标志位: AF CF OF PF SF ZF功能:
11、 操作数 = 0 - 操作数, 改变操作数的正负号。3. 乘法指令 计算机的乘法指令分为无符号指令和有符号指令两种,他们的区别在于:数值的最高位是做 为“数值”参与运算还是做为“符号”参与运算。乘法指令的被乘数都是做为隐含操作数,乘数在指令中显示的写出来,CPU会根据乘数是8 位,16位,32位来自动选用被乘数:AL,AX或EAX。指令的功能是把显示操作数和隐含 操作数相乘,并把乘积存入AL,AX或EAX中。(现在的80386+般都是用EAX做为被乘 数)MUL/FMUL reg/mem - 无符号整数/浮点数乘法指令受影响的标志位:CF和OF功能:把显示操作数和隐含操作数都做为无符号数相乘。
12、比如MUL 5就是eax = eax * 5IMUL/FIMUL reg/mem - 有符号整数/浮点数乘法指令IMUL/FIMUL reg, immIMUL/FIMUL reg,mem功能:把两个操作数做为有符号数相乘。4. 除法指令DIV,无符号数的除法指令,和8086 一样,指令给出一个操作数,被除数已默认。如果指 令中给出的操作数为32位,那么被除数将是EDX: EAX,最终的商将存放在EAX,余数 将存放在EDX中。如果指令给出操作数为16位,那么被除数为EAX,最终得到的商放在 AX,余数放在EAX的高16位。如果指令中给出的操作数为8位,那么被除数是16位, 最终得到的商将放在A
13、L中,余数放在AH中。IDIV,有符号数的除法指令,用法和8086相同,不过支持32位操作逻辑运算指令逻辑运算指令是另外一组重要的常用指令,包括逻辑与AND,逻辑或OR,逻辑非NOT,和 异或指令 XOR。1. AND reg/mem, reg/mem/imm - 逻辑与指令受影响的标志位:CF,OF,PF,SF,ZF 功能:把源操作数和目的操作数进行二进制位的与操作,结果存入源操作数中。2. OR reg/mem, reg/mem/imm - 逻辑或指令受影响的标志位: CF,OF,PF,SF,ZF 功能:把源操作数和目的操作数进行二进制位的或操作,结果存入源操作数中。3. NOT reg/
14、mem 不影响任何标志位 功能:把操作数的每个二进制位取反4. XOR reg/mem, reg/mem/imm受影响的标志位 CF,OF,PF,SF,ZF 功能:把源操作数和目的操作数进行每个二进制位的异或操作,结果存入源操作数中。跳转指令及循环指令1. TEST reg/mem, reg/mem/imm - 检测位指令受影响标志位:CF(0),OF(0),PF,SF和ZF功能:检测位指令会将源操作数和目标操作数进行逻辑与操作,根据运算结果设置标志位, 但是并不保存运算结果到源操作数,只是设置标志位。该指令执行后通常是一条 JE,JNE,JZ 或 JNZ 等条件转移指令。2. 循环指令循环指
15、令的执行本身并不影响任何标志位,以CX或ECX做为计数器。LOOP/LOOPW/LOOPD 标号LOOP:在实地址模式下使用CX寄存器而不是ECX寄存器。LOOPW:在任何模式下都会使用CX寄存器作为计数器。LOOPD:在任何模式下都会使用ECX寄存器作为计数器。3. 转移指令 转移指令是汇编语言程序员经常使用的一组指令。在高级语言中,时常有“尽量不要使用转 移语句”的劝告,但如果在汇编语言的程序中也尽量 不用转移语句,那么该程序要么无法编 写,要么没有多少功能,所以,在汇编语言中,不但要使用转移指令,而且还要灵活运用, 因为指令系统中有大量的转移指令。转移指令分无条件转移指令和有条件转移指令两大类。 无条件转移指令:包括 JMP 指令,子程序的调用和返回,中断的调用和返回。JMP 标号/reg/memJMP 指令是从程序当前执行的地方无条件转移到另外一个地方执行,这种执行可以是一个 短(short)转移(偏移量在-128到127范围内),近(near)转移(偏移量在正负32K范围内), 或者远(FAR)转移(在不同的代码段内跳转。) 短转移和近转移只是代码段内的转移,仅仅需要把偏移量入栈,远转移需要把要跳转的代码 段的地址和偏移量入栈。转移指令本身不影响标志位。子程序的定义 调用及返回1. 子程序的定义