assembly 自定义结构MASM Windows API数组

zz2j4svz  于 2023-01-17  发布在  Windows
关注(0)|答案(1)|浏览(115)

这是我一直在尝试弄清楚的事情。我想做一个MASM程序,它有一个自定义结构体和一个这些结构体的数组,然后将其保存到一个文件中。我找不到任何关于应该/可以如何完成的好信息。我认为resb半指令可能会有帮助。无论如何,这是我到目前为止所做的。但显然有麻烦。基本上长期我想做一个简单的DB一样的MASM程序,但这是一个出路,仍然在学习阶段。

.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc

.data?
MyStruct STRUCT
    string db 4 dup(0)
    dw1 DWORD ?
    dw2 DWORD ?
    dw3 DWORD ?
MyStruct ENDS

;MyArray MyStruct 20 dup(?)
MyArray resb 10*sizeof MyStruct  ; not sure of how to go about creating an array of structs

.data
    fileName db "myfile.dat"
    properNouns db "John", "Mike", "Emily", "Mary", "David",0
    
.code
        
    ; open the file for writing
    invoke CreateFile,fileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    mov handle,eax

    ; write the array to the file
    invoke WriteFile,handle,MyArray,sizeof MyArray,written,NULL

    ; close the file
    invoke CloseHandle,handle
pgky5nke

pgky5nke1#

您需要在MyStruct中将dup(0)更改为未初始化的dup(?)

.data?
MyStruct STRUCT
    string db 4 dup(?)
    dw1 DWORD ?
    dw2 DWORD ?
    dw3 DWORD ?
MyStruct ENDS

在未初始化的.data?段中,可以用途:

MyArray MyStruct 20 dup (<>)

这将为20个MyStruct结构的数组创建空间。

注解

  • resb不起作用,因为它是NASM指令,而不是MASM指令。
  • Windows PE可执行文件中的.data?(BSS)段将由Windows程序加载程序清零。
  • 在DOS中,.Data?(BSS)段必须在程序启动后由程序员设置为零。如果您没有将.data?内存清零,则未初始化的数据可能包含垃圾,这些垃圾可能包含零,也可能不包含零。

相关问题