Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在MASM程序集中初始化本地结构_Assembly_Struct_X86_Masm - Fatal编程技术网

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