Assembly 如何在MASM程序集中初始化本地结构
我想初始化堆栈上的本地结构Assembly 如何在MASM程序集中初始化本地结构,assembly,struct,x86,masm,Assembly,Struct,X86,Masm,我想初始化堆栈上的本地结构 Records STRUCT data1 DWORD ? data2 DWORD ? data3 DWORD ? data4 DWORD ? Records ENDS .CODE main: mov ebp, esp sub es
Records STRUCT
data1 DWORD ?
data2 DWORD ?
data3 DWORD ?
data4 DWORD ?
Records ENDS
.CODE
main:
mov ebp, esp
sub esp, SIZEOF Records
如何创建struct Records
的命名实例,然后使用该实例初始化数据成员?我想对点运算符使用struct
指令,而不是指针加法
我首先为结构分配空间,然后我该怎么做?我将使用
PROC
指令的功能定义函数1,并使用LOCAL
指令在函数中分配变量。汇编器将处理序言和尾声代码,您可以将类型与本地代码相关联
您可以编写一个如下所示的函数:
main PROC
LOCAL rec1: Records
mov rec1.data1, 1
mov rec1.data2, 2
mov rec1.data3, 3
mov rec1.data4, 4
ret
main ENDP
代码将在堆栈上为名为rec1
的变量分配空间,其余行使用值1,2,3,4初始化结构字段。生成的汇编代码如下所示:
汇编程序创建了一个堆栈帧,并计算了堆栈上相对于EBP的所有偏移量。如果要将rec1
的地址放入寄存器并将其作为结构使用,可以使用LEA
获取堆栈上变量的有效地址,并使用假设
对其应用指针类型:
main PROC
LOCAL rec1: Records
lea eax, [rec1]
ASSUME eax: ptr Records
mov [eax].data1, 1
mov [eax].data2, 2
mov [eax].data3, 3
mov [eax].data4, 4
ret
main ENDP
生成的汇编代码将是:
您还可以使用LOCAL
指令创建类型数组。然后可以初始化数组中单个记录的元素。此示例在堆栈上为名为rec1
的4个记录的数组分配空间,并初始化第三个元素(数组索引2,因为数组元素编号是基于零的):
生成的汇编代码将是:
我将LEA
和ADD
拆分为单独的指令,以更好地说明发生了什么。通过删除ADD
并使用LEA
将偏移量直接添加到rec1
数组的基指针,可以简化该操作。最好将其写为:
lea eax, [rec1 + 2*(SIZEOF Records)]
ASSUME eax: ptr Records
全球范围的结构
如果在全局范围(而不是堆栈上的局部区域)创建结构,则可以通过以下方式声明和初始化它们:
.DATA
rec2 Records <1,2,3,4>
数据以字节为单位打印。每个单独的DWORD显示为LSB(最低有效字节)到MSB(最高有效字节)。如果显示为DWORDs,则显示为
脚注
- 1默认情况下,我在程序集文件顶部使用了
.MODEL
指令来假定C样式调用约定:
.386
.model flat, C
很好的例子展示了MASM高级东西实际上编译成了什么:)@PeterCordes:一般来说,我不必这么做,但当汇编程序为您生成代码时,重要的是要看看幕后发生了什么。我没有特别提到尾声(leave
ret
)实际上是在汇编程序看到ret
指令并对其进行转换时生成的。
Segment: _TEXT DWORD USE32 00000038 bytes
0000 _main:
0000 55 push ebp
0001 8B EC mov ebp,esp
0003 83 EC 40 sub esp,0x00000040
0006 8D 45 C0 lea eax,-0x40[ebp]
0009 83 C0 20 add eax,0x00000020
000C C7 00 01 00 00 00 mov dword ptr [eax],0x00000001
0012 C7 40 04 02 00 00 00 mov dword ptr 0x4[eax],0x00000002
0019 C7 40 08 03 00 00 00 mov dword ptr 0x8[eax],0x00000003
0020 C7 40 0C 04 00 00 00 mov dword ptr 0xc[eax],0x00000004
0027 C9 leave
0028 C3 ret
lea eax, [rec1 + 2*(SIZEOF Records)]
ASSUME eax: ptr Records
.DATA
rec2 Records <1,2,3,4>
Segment: _DATA DWORD USE32 00000010 bytes
0000 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 ................
0000 00000001 00000002 00000003 00000004
.386
.model flat, C