010-【X86-汇编语言】-MOV指令,变量,立即数

MOV指令

MOV是汇编中最常用的指令没有之一(这么说虽然违反了广告法)。MOV指令的作用是赋值,相当于高级语言中的“=”,即将源操作数的值赋值给目的操作数,原操作数的值不变。 MOV指令的格式如下:

MOV 目的操作数,源操作数

目的操作数可以是寄存器,变量(可以理解为内存地址)

源操作数可以是寄存器,变量,立即数

目的操作数和源操作数不可以同时为变量,目的操作数和源操作数的bit位数必须相同。

变量

变量实质是在内存中存储数据位置的标记,这样程序员们就不需要直接记住数据所在的内存地址了,而直接使用这些标记来操作内存数据。数据原则上要保存到数据段中也就是【.data】之后【.code】之前,但MASM支持一种叫局部变量的东西,可以将变量定义在过程内。当前我们还是将变量定义在【.data】之内。关于局部变量先挖个坑放在这里,以后再填。

定义变量的语法如下:

[变量名] 数据类型 初始值 [,初始值]

用[]括起来的部分为可选部分。变量名是可选部分。如果用一个变量名定义多个数据的话可以在数据类型后填写多个初始值。下列代码 用 mydw的变量名定义两个类型是DWORD的数据,值分别为1234h和ABCDh。数据类型可以参见004-【X86-汇编语言】-信息的形式&整数中的数据类型,当然数据类型不止于此,今后还会使用更多的数据类型

mydw DWORD 1234h,0ABCDh

立即数

立即数是指直接在代码中写明的固定数据,如1234h,10101b

编码实战

定义两个DWORD类型的变量 dwS和dwD,将dwS的值赋值给dwD

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExistCode:DWORD

.data
dwS	DWORD	01234ABCDh
dwD	DWORD	?

.code
TestMov PROC
MOV EAX,dwS
MOV dwD,EAX
INVOKE ExitProcess,0
TestMov ENDP
END TestMov

由于MOV的源操作数和目的操作数不可以同时为变量,所以必须使用一个寄存器座位中介,现将dwS的值赋值给EAX,然后将EAX的值赋值给dwD。

dwD 的初始值是【?】表示我们不设置它的初始值,MASM会将dwD的初始值设置成0。

单步调试

程序任然没有输入输出,所以需要我们进行单步调试,之前介绍过监视寄存器的方式,这次介绍一下监视变量的方式

在【调试状态】下在变量上点击右键选择添加监视

010-【X86-汇编语言】-MOV指令,变量,立即数

在监视窗口就会显示变量的当前值,不过是用十进制显示的,我们可以在监视窗口上点击右键选择【十六进制显示】

010-【X86-汇编语言】-MOV指令,变量,立即数

010-【X86-汇编语言】-MOV指令,变量,立即数

接下来就可以单步调试,查看运行结果了。

进一步实验

下面这些实验大家可自行操作

1.将EAX替换成其他通用寄存器,.386的通用寄存器都是32bit的对应的数据类型是DWORD

2.将dwS和dwD换成其他数据类型

3.用MOV直接操作两个变量,"MOV dwS,dwD"

4.将立即数赋值给寄存器和变量,"MOV dwS,1234ABCDh", "MOV EAX,1234ABCDh"