2.8 常用的汇编指令
2.8常用的汇编指令
本节必须掌握的知识点:
汇编指令
多动手实验,知道每个指令的功能
在此节之前汇编课程主要讲了两个问题,第一个问题是数据可以存哪?内存和寄存器。第二个问题是这些数据是如何存放的?我们介绍了两种模式:一个是小端存储,一个是大端存储。如果要处理数据,我们就要使用汇编指令。什么是汇编指令哪?在介绍汇编指令之前需要把它是什么搞清楚。
2.8.1【汇编指令】
汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,)。用于告诉【汇编程序】如何执行【汇编指令】,它既不控制机器的操作也不被汇编编成机器代码,只能被汇编程序所识别并指导汇编如何执行。如图2-8-1所示,用黑色框框选出来的,就是汇编区域,一行组合在一起就是汇编指令。
本节介绍MOV、LEA、ADD、SUB、AND、OR、XOR、NOT和XCHG指令。
【MOV指令】
图2-8-1黑色框选区域中,有MOVDWORDPTRSS:[ESP+8],EBX;这条指令无非就是将EBX的数据移动到[ESP+8]对应的内存地址中去,大家可以反复操作观察。到目前为止,我们已经接触了MOV指令。现在回顾一下MOV指令,MOV指令用于数据移动,既然是移动,那么目的操作数的作用应该相当于一个“容器”,必须是具有大小范围的内存单元或寄存器;源操作数也可以是和目的操作数具有相同数据宽度的通用寄存器和内存单元,也可以是立即数。移动的指令只影响目的操作数的内容,不改变源操作数的内容。具体的指令格式如下:
1.MOVr/m8,r8(r通用寄存器)
2.MOVr/m16,r16(m代表内存)
3.MOVr/m32,r32(imm代表立即数)
4.MOVr8,r/m8(r8代表8位通用寄存器)
5.MOVr16,r/m16(m8代表8位内存)
6.MOVr32,r/m32(imm8代表8位立即数)
7.MOVr8,imm8
8.MOVr16,imm16
9.MOVr32,imm32
【LEA指令】
介绍了MOV指令,看图2-8-1中有LEA指令,LEA指令和MOV指令一样是移动数据,但是与MOV不同的是,它移动的是“[]”里面的内容,例如:LEAEAX,[ECX]中,执行这条指令相当于MOVEAX,ECX。而MOVEAX,[ECX]是把“[]”里面的数据当成是内存地址编号,取地址里面的内容。
我们将MOVEAX,ECX,LEAEAX,[ECX]在软件中编写观察。
第一步:输入指令,如图2-8-2所示,当前EAX存储的数据为0x002D2BA2,ECA存储的数据为0x00000000。
第二步:按F8一次观察,如图2-8-3所示。
第三步:由于EAX和ECX存储的数据都一样,我们改ECX存储的数据,更改为0x11111111。
选中ECX存储的数据0x00000000,右键弹出对话框,选择Modify,弹出对话框如图2-8-4所示,在黑色框选部分修改成0x11111111,如图2-8-5所示。
第四步:按F8观察,如图2-8-6对比这两条指令是否做着同样的工作。
经过实验表明,两个指令干了同一件事。自己动手实验完成下面例题并观察EAX与EDX里面的数据是否相同,总结这些指令都做了什么。
例:
MOVECX,0x0012FF80【0x0012FF80,该内存地址是已经申请过的,所以只要堆栈窗口中出现的内存地址,都可以使用】
MOVEAX,DWORDPTRDS:[ECX]
LEAEDX,DWORDPTRDS:[ECX]
LEA指令格式如下:
1、LEAr16,m16
2、LEAr32,m32
LEA指令它的源操作数只能是内存,目标操作数就只能是寄存器,不能操作8位数。
【ADD指令】
ADD表示“加”,“ADD目标操作数,源操作数”:目标操作数+源操作数的结果保存在目标操作数中,举例说明ADDEAX,0x00000004,我们在软件中观察EAX的变化。
第一步:输入指令,为了方便观察我们手动更改EAX寄存器的数据,更改为:0x00000000,如图2-8-7所示。
第二步:按F8观察,EAX存储的数据的变化,如图2-8-8所示。
F8单步执行完,我们看到了EAX存储的数据发生了变化,变为了EAX原本存储的数据+0x00000004的数据。这就是ADD指令的大致做的工作。
ADD指令格式如下:
1.ADDr/m8,r8
2.ADDr/m16,r16
3.ADDr/m32,r32
4.ADDr8,r/m8
5.ADDr16,r/m16
6.ADDr32,r/m32
7.ADDr8/m8,imm8
8.ADDr16/m16,imm16
9.ADDr32/m32,imm32
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
ADDEAX,ECX寄存器到寄存器
ADDECX,DWORDPTRDS:[0x0012FFC4]内存到寄存器
ADDDWORDPTRDS:[0x0012FFC4],0x12立即数到内存
【SUB指令】
SUB表示“减”,“SUB目标操作数,源操作数”:目标操作数-源操作数的结果保存在目标操作数中,它的格式同MOV、ADD一样。举例说明SUBEAX,0x00000004,我们在软件中观察EAX的变化。
第一步:输入指令,EAX当前存储的数据为0x00000004如图2-8-9所示。
第二步:按F8执行之后观察EAX存储的数据变化,如图2-8-10所示。
F8单步执行完,我们看到了EAX存储的数据发生了变化,变为了EAX原本存储的数据-0x00000004的数据。这就是SUB指令的大致做的工作。
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
SUBEAX,ECX寄存器到寄存器
SUBECX,DWORDPTRDS:[0x0012FFC4]内存到寄存器
SUBDWORDPTRDS:[0x0012FFC4],0x12立即数到内存
【AND指令】
AND表示“与”,“AND目标操作数,源操作数”:目标操作数与源操作数做“与运算”,结果保存在目标操作数中。
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
MOVAL,0x01
ANDAL,0x10
【OR指令】
OR表示“或”,“OR目标操作数,源操作数”:目标操作数与源操作数做“或运算”,结果保存在目标操作数中。
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
MOVAL,0x11
ORAL,0x10
【XOR指令】
XOR表示“异或”,“XOR目标操作数,源操作数”:目标操作数与源操作数做“异或运算”,结果保存在目标操作数中。
例:
自己动手实验完成下面例题并观察总结这些指令都做了什么。
MOVAL,0x11
XORAL,0x11
【NOT指令】
这个指令和上面的指令有所区别,它的意思是对某个值求反,只涉及一个数,所以它的格式如下:
NOTr/m8
NOTr/m16
NOTr/m32
【XCHG指令】
CHG表示英文change,表示两个容器交换数据,源操作数不能是立即数,主要功能将一个字节或一个字的源操作数和目的操作数相交换。
交换指令可以在寄存器之间,寄存器与存储器之间进行,具体形式如下:
XCHGr8/m8,r8
XCHGr16/m16,r16
XCHGr32/m32,r32
XCHGr8,m8
XCHGr16,m16
XCHGr32,m32
自己动手实验完成下面例题并观察总结这些指令都做了什么。
注意XCHG指令在使用时记住以下几点:
1、不能同时都为内存操作数
2、任何一个操作数都不能为段寄存器
3、任何一个操作数不能为立即数
4、两个操作数的长度必须相等
下节介绍内存复制。
练习:
1、已知EAX=0x00000008,ECX=0x0000000F,执行下面语句后,求EDX的数据
LEAEDX,DWORDPTRDS:[EAX+ECX]
2、已知EAX=0xFFFFFFFF,ESP=0x00000002,执行下面语句后,求EDX的数据
LEAEDX,DWORDPTRDS:[EAX+ESP*2]
3、已知EAX=01011100ECX=11101111,EDX=11101110,执行下面语句后,求EDX的数据
LEAEDX,DWORDPTRDS:[EAX+ECX*2]
4、使用MOV指令、ADD指令、SUB指令、AND指令、OR指令、XOR指令和NOT指令中的每一种格式做一个实验观察执行后的效果。(本节内容中已经把格式写出来,主要目的是锻炼动手能力)。
推荐阅读
-
多倍效率提升!精灵4 RTK「一控多机」为国土航测按下加速键
目前,全域土地综合整治试点申报工作正在全国各地如火如荼开展。自然资源部印发的《关于开展全域土地综合整治试点工作的通知》明确要求:整治任务、指标和布局要落实到具体地块,确保新增耕地面积原则上不少于原有耕地面积的5%,确保新增永久基本农田面积原则上不少于调整面积的5%。因此,精准地获取地块使用及占比数据...
-
杭州卡艾视科技公司拟冲刺资本市场,辅导券商为太平洋证券
据知情人士了解,浙江省杭州卡艾视科技公司(以下简称“卡艾视”)响应浙江省杭州市深入推进经济高质量发展“凤凰行动”计划(2021—2025年)的扶持政策,拟冲刺资本市场,走向改制及券商入场阶段,梳理审计企业相关数据,辅导券商为太平洋证券。官网资料显示,卡艾视2013年成立于杭州滨江区,是一家国家级高新...
-
不同类型的嵌入式计算机及其用途
坚固耐用的工业盒式电脑坚固型工业和嵌入式计算机专门设计用于在恶劣的使用环境和条件下可靠运行,例如强烈振动、极端温度以及潮湿或多尘条件。它们用在哪里?海上石油钻井平台就是一个很好的例子,可以将坚固耐用的嵌入式系统(盒式)PC部署为有效的解决方案。设施通常位于偏远、无人值守的海洋地点,周围有重型机械(产...
-
倍压整流!
整流桥可以将交流电转换为直流电,如图1-1所示,但输出电压与输入电压基本保持一致,即使加上滤波电容,输出电压也不可能高于输入电压。▲图1-1整流桥整流原理那么问题来了,如果我们想让输出电压升高,又该怎么办呢?其实方法不一,例如在交流输入端通过变压器把电压升高再整流,或者在整流后的直流端通过斩波电路把...