原标题:常用的汇编命令
来源:爱的达人编程达人
在此之前主要谈了两个问题,第一个问题是数据可以保存在哪里。 存储器和寄存器。 第二个问题是这些数据是如何存储的。 介绍了两种模型。 一个是小印第安人和大印第安人。 要处理数据,请使用汇编指令。 汇编指令是什么? 在介绍汇编命令之前,需要弄清楚它是什么。
2.8.1【汇编指令】
汇编指令是汇编语言中使用的运算符和助记符,也包括伪指令,如assume、end等。 用于告诉【汇编器】如何执行【汇编指令】。 它既不会控制机器的操作,也不会在组件中创建机器代码,只能被组件识别并指导如何执行组件。 用黑色边框选中的是组件区域,组合一行就是组件命令,如图2-8-1所示。
本节介绍MOV、yjdyb、ADD、SUB、AND、OR、XOR、NOT和XCHG命令。
【MOV指令】
在图2-8-1的黑色边框选择区域,输入MOV DWORD PTR SS:[ESP 8],EBX; 只要将EBX的数据移动到与[ESP 8]对应的内存地址,就可以反复观察该命令。 到目前为止,我们都接触到了MOV指令。 回顾MOV指令,MOV指令用于移动数据。 既然是移动,目标操作数的作用必须相当于“容器”,是具有大小范围的存储单元或寄存器。 源操作数可以是具有与目标操作数相同的数据宽度的通用寄存器和存储器单元,也可以是即时数。 移动命令仅影响所需操作数的内容,源操作数的内容保持不变。 具体的命令格式如下。
1. MOV r/m8、r8(r通用寄存器) ) )。
2. MOV r/m16,r16(m表示内存) )。
3. MOV r/m32,r32(IMM表示即时数) ) ) ) ) ) ) ) )。
4. MOV r8,r/m8(r8表示8位通用寄存器) )。
5. MOV r16、r/m16(m8表示8位存储器) ) ) ) ) ) ) )。
6. MOV r32、r/m32(IMM8表示8位的即时数) )。
7. MOV r8、imm8
8. MOV r16、imm16
9. MOV r32、imm32
【这些格式来源于英特尔的白皮书。 若要详细了解MOV和其他汇编指令的格式和用法,请在Intel白皮书第2卷、第3章和第4章中介绍汇编指令。 所有英特尔的命令都在这里。 虽然Intel和AMD是不同的处理器,但它们遵循80X86体系结构,大多数指令相同。 】
【yjdyb指令】
介绍了MOV命令。 在图2-8-1中有yjdyb命令。 yjdyb命令与MOV命令一样是移动数据,但与MOV不同,[ ]的内容会移动。 例如,在yjdyb EAX,[ECX]中,运行此命令相当于MOV EAX,ECX。 MOV EAX、[ECX]将“[ ]”中的数据视为存储器地址编号,取地址中的内容。
在软件中创建并观察MOV EAX、ECX、yjdyb EAX和[ECX]。
步骤1 :输入命令后,当前EAX中的数据为0x002D2BA2,ECA中的数据为0x00000000,如图2-8-2所示。
第2步:按F8观察一次。 如图2-8-3所示。
第3步(eax和ECX中存储的数据相同,因此将ECX中存储的数据更改为0x11111111。
选择存储在ECX中的数据0x00000000,右键单击以显示对话框,然后选择“修改”。 对话框在黑色框选择部分中更改为0x11111111,如图2-8-4所示。 如图2-8-5所示。
步骤4 :在F8观察,如图2-8-6比较这两个指令是否有相同的功能。
实验结果表明,两个指令做了同样的事。 自己做实验完成以下例题,观察EAX和EDX中的数据是否相同,然后总结这些命令做了什么。
示例:
MOV ECX,0x0012FF80 【0x0012FF80,此内存地址已经申请,只要是显示在堆栈窗口中的内存地址就可以使用】
MOV EAX,DWORD PTR DS:[ECX]
yjdyb EDX,DWORD PTR DS:[ECX]
yjdyb指令的格式如下。
1、yjdyb r16、m16
2、yjdyb r32、m32
yjdyb指令的源操作数只有内存,目标操作数只有寄存器,不能进行8位操作。
【ADD指令】
ADD表示“加法”、“添加目标操作数、源操作数”。 目标操作数源操作数的结果存储在目标操作数中,例如ADD EAX,0x00000004。 用软件观察EAX的变化。
第一步:输入命令,更改为0x00000000,如图2-8-7所示,以便更容易看到我们手动更改EAX寄存器中的数据。
r”>
第二步:按F8观察,EAX存储的数据的变化,如图2-8-8所示。
F8单步执行完,我们看到了EAX存储的数据发生了变化,变为了EAX原本存储的数据+0x00000004的数据。这就是ADD指令的大致做的工作。
ADD指令格式如下:
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 ECX,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 ECX,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 r8/m8,r8
XCHG r16/m16,r16
XCHG r32/m32,r32
XCHG r8,m8
XCHG r16,m16
XCHG r32,m32
自己动手实验完成下面例题并观察总结这些指令都做了什么。
注意XCHG指令在使用时记住以下几点:
1、不能同时都为内存操作数
2、任何一个操作数都不能为段寄存器
3、任何一个操作数不能为立即数
4、两个操作数的长度必须相等
下节介绍内存复制。
练习:
1、已知EAX=0x00000008,ECX=0x0000000F,执行下面语句后,求EDX的数据
yjdyb EDX,DWORD PTR DS:[EAX+ECX]
2、已知EAX=0xFFFFFFFF,ESP=0x00000002,执行下面语句后,求EDX的数据
yjdyb EDX,DWORD PTR DS:[EAX+ESP*2]
3、已知EAX=01011100 ECX=11101111,EDX=11101110,执行下面语句后,求EDX的数据
yjdyb EDX,DWORD PTR DS:[EAX+ECX*2]
4、使用 MOV指令、ADD指令、SUB指令、AND指令、OR指令、XOR指令和 NOT指令 中的每一种格式做一个实验观察执行后的效果。(本节内容中已经把格式写出来,主要目的是锻炼动手能力)。
声明:【版权归作者所有。若未能找到作者和原始出处,还望谅解,如原作者看到,欢迎联系盟君认领(可发邮至3173886122@qq.com或直接在公众号留言),盟君会在后续文章声明中标明。如觉侵权,盟君会在第一时间删除。多谢!】
致敬:向本文原创者致以崇高敬意!
版权声明为粉丝提供创业平台
责任编辑: