使用 MASM 在 win32 汇编编程中初始化结构体

逆向工程 视窗 结构 反汇编者 结构体
2021-07-11 01:19:51

我正在尝试创建一个演示程序来演示 MASM 中的结构,

我写了这样的代码:

struct1 struct
first db ?
second dw ?
struct1 EndS

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc ; holds predifned structures

include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
MessageTitle  db "The title",0
MessageText   db "The first program which shows simple messagebox",0


.code
start:

Initializedstructure struct1 <'A',1024>
;invoke MessageBox, NULL, addr MessageText, addr MessageTitle, MB_OK
mov eax, struct1.first 
;invoke ExitProcess, NULL
end start

但是当我反汇编程序时,我发现了一些不适合初始化程序结构的指令:

.text:00401000 start:
.text:00401000                 inc     ecx
.text:00401001                 add     [eax+edi*4], al
.text:00401001 ; ---------------------------------------------------------------------------
.text:00401004                 dd 7Fh dup(0)
.text:00401200                 dd 380h dup(?)
.text:00401200 _text           ends

为什么 MASM 会这样组装代码?我想我在代码中犯了一些错误,不是吗?我认为没有关于它的解释清楚的文件......

2个回答

您需要Initializedstructure struct1 <'A',1024>在您的.data细分市场中,而不是在您的.code细分市场中。

Masm 使用 0 和 1 作为地址常量:您告诉它这样做是因为您告诉它使用结构中的偏移量,而不是内存位置。实际上,字段“first”位于偏移量 0 处并占用一个字节。这使得“second”的偏移量等于 1。您可能想要访问您的结构实例化,您将其放置在名为 Initializedstructure 的地址处。在这种情况下,您将不得不使用

mov eax, [Initializedstructure].First

访问该 Initializedstructure 的“first”字段。而且,顺便说一句,如果您尝试使用向量指令(SSE,AVX)访问此类结构,Masm 经常完全丢失它,您需要另外指定操作数大小,例如

vmovdqu xmm0, xmmword ptr [Initializedstructure].Some128bitField

希望能帮助到你。