1. ADD r/m8,r8 2. ADD r/m16,r16 3. ADD r/m32,r32 4. ADD r8,r/m8 5. ADD r16,r/m16 6. ADD r32,r/m32 7. ADD r8/m8,imm8 8. ADD r16/m16,imm16 9. ADD r32/m32,imm32 例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
ADD EAX,ECX 寄存器到寄存器 ADD ECAX,DWORD PTR DS:[0x0012FFC4] 内存到寄存器 ADD DWORD PTR DS:[0x0012FFC4],0x12 立即数到内存 【SUB指令】
SUB表示“减”,“SUB 目标操作数,源操作数”:目标操作数-源操作数的结果保存在目标操作数中,它的格式同MOV、ADD一样。举例说明SUB EAX,0x00000004,我们在软件中观察EAX的变化。
第一步:输入指令,EAX当前存储的数据为0x00000004如图2-8-9所示。
第二步:按F8执行之后观察EAX存储的数据变化,如图2-8-10所示。
F8单步执行完,我们看到了EAX存储的数据发生了变化,变为了EAX原本存储的数据-0x00000004的数据。这就是SUB指令的大致做的工作。
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
SUB EAX,ECX 寄存器到寄存器 SUB ECAX,DWORD PTR DS:[0x0012FFC4] 内存到寄存器 SUB DWORD PTR DS:[0x0012FFC4],0x12 立即数到内存 【AND指令】
AND表示“与”,“AND 目标操作数,源操作数”:目标操作数与源操作数做“与运算”,结果保存在目标操作数中。
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
MOV AL, 0x01 AND AL, 0x10
【OR指令】
OR表示“或”,“OR 目标操作数,源操作数”:目标操作数与源操作数做“或运算”,结果保存在目标操作数中。
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
MOV AL, 0x11 OR AL, 0x10
【XOR指令】
XOR表示“异或”,“XOR 目标操作数,源操作数”:目标操作数与源操作数做“异或
运算”,结果保存在目标操作数中。
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
MOV AL, 0x11 XOR AL, 0x11
【NOT指令】
这个指令和上面的指令有所区别,它的意思是对某个值求反,只涉及一个数,所以它的 格式如下:
NOT r/m8 NOT r/m16 NOT r/m32 【XCHG指令】
CHG表示英文change,表示两个容器交换数据,源操作数不能是立即数,主要功能将一个字节或一个字的源操作数和目的操作数相交换。
指令格式:XCHG OPRD1, OPRD2
目的操作数 源操作数
交换指令可以在寄存器之间,寄存器与存储器之间进行,具体形式如下: XCHG r8/m8,r8 XCHG r16/m16,r16 XCHG r32/m32,r32 XCHG r8,m8 XCHG r16,m16 XCHG r32,m32
自己动手实验完成下面例题并观察总结这些指令都做了什么。 例:
XCHG AL,CL XCHG AX,BX XCHG SI,BX
注意XCHG指令在使用时记住以下几点: 1、不能同时都为内存操作数
2、任何一个操作数都不能为段寄存器 3、任何一个操作数不能为立即数 4、两个操作数的长度必须相等 下节介绍内存复制
练习:
1、已知EAX=0x00000008,ECX=0x0000000F,执行下面语句后,求EDX的值 LEA EDX,DWORD PTR DS:[EAX+ECX]
2、已知EAX=0xFFFFFFFF,ESP=0x00000002,执行下面语句后,求EDX的值 LEA EDX,DWORD PTR DS:[EAX+ESP*2]
3、已知EAX=01011100 ECX=11101111,EDX=11101110,执行下面语句后,求EDX的值 LEA EDX,DWORD PTR DS:[EAX+ECX*2]
4、使用 MOV指令、ADD指令、SUB指令、AND指令、OR指令、XOR指令和 NOT指令 中的每一种格式做一个实验观察执行后的效果。(本节内容中已经把格式写出来,主要目的是锻炼动手能力)