1 声明并初始化数组
.386
.model flat, stdcall
option casemap :none
include S:\masm32\include\windows.inc
include S:\masm32\include\user32.inc
include S:\masm32\include\kernel32.inc
include S:\masm32\include\gdi32.inc
includelib S:\masm32\lib\user32.lib
includelib S:\masm32\lib\kernel32.lib
includelib S:\masm32\lib\gdi32.lib
include S:\masm32\include\masm32.inc
include S:\masm32\include\debug.inc
includelib S:\masm32\lib\masm32.lib
includelib S:\masm32\lib\debug.lib
.data
;声明并初始化有五个元素的 DWORD 数组; 该数组每个元素是 4 字节
val dd 11,22,33,67,93
.code
start:
mov eax, val
PrintDec eax ;11
mov eax, val[4]
PrintDec eax ;22
mov eax, val[8]
PrintDec eax ;33
mov eax, val[12]
PrintDec eax ;33
mov eax, val[16]
PrintDec eax ;33
ret
end start
运行如下;
2 使用dup伪指令
.386
.model flat, stdcall
option casemap :none
include S:\masm32\include\windows.inc
include S:\masm32\include\user32.inc
include S:\masm32\include\kernel32.inc
include S:\masm32\include\gdi32.inc
includelib S:\masm32\lib\user32.lib
includelib S:\masm32\lib\kernel32.lib
includelib S:\masm32\lib\gdi32.lib
include S:\masm32\include\masm32.inc
include S:\masm32\include\debug.inc
includelib S:\masm32\lib\masm32.lib
includelib S:\masm32\lib\debug.lib
.data
;声明有三个元素的 DWORD 数组, 并把每个元素初始化为 7
arr1 dd 3 dup(7)
;声明有三个元素的 DWORD 数组, 无初始化; 对全局变量, 没有初始化的将用 0 填充
arr2 dd 3 dup(?)
.data?
;声明有三个元素的 DWORD 数组
arr3 dd 3 dup(?)
.code
start:
DumpMem offset arr1, 12 ;07 00 00 00 - 07 00 00 00 - 07 00 00 00
DumpMem offset arr2, 12 ;00 00 00 00 - 00 00 00 00 - 00 00 00 00
DumpMem offset arr3, 12 ;00 00 00 00 - 00 00 00 00 - 00 00 00 00
ret
end start
运行如下;
3 未初始化的变量在 .data 段和 .data? 的区别
.386
.model flat, stdcall
option casemap :none
include S:\masm32\include\windows.inc
include S:\masm32\include\user32.inc
include S:\masm32\include\kernel32.inc
include S:\masm32\include\gdi32.inc
includelib S:\masm32\lib\user32.lib
includelib S:\masm32\lib\kernel32.lib
includelib S:\masm32\lib\gdi32.lib
include S:\masm32\include\masm32.inc
include S:\masm32\include\debug.inc
includelib S:\masm32\lib\masm32.lib
includelib S:\masm32\lib\debug.lib
.data
v1 dd 4096 dup(?) ;未初始化变量在 .data 段, 生成的 exe 文件会根据大小分配内存
.code
start:
PrintText '.data dup(?) !!! '
ret
end start
.386
.model flat, stdcall
option casemap :none
include S:\masm32\include\windows.inc
include S:\masm32\include\user32.inc
include S:\masm32\include\kernel32.inc
include S:\masm32\include\gdi32.inc
includelib S:\masm32\lib\user32.lib
includelib S:\masm32\lib\kernel32.lib
includelib S:\masm32\lib\gdi32.lib
include S:\masm32\include\masm32.inc
include S:\masm32\include\debug.inc
includelib S:\masm32\lib\masm32.lib
includelib S:\masm32\lib\debug.lib
.data?
v1 dd 4096 dup(?) ;未初始化变量在 .data? 段
.code
start:
PrintText '.data? dup(?) !!!'
ret
end start
此二程序运行如下;
主要看一下exe大小的区别;
c10和c11的exe大小相差16k,4096*4 个字节;
结论:不需要初始化的变量应该声明在 .data? 段;
4 嵌套数组
.386
.model flat, stdcall
option casemap :none
include S:\masm32\include\windows.inc
include S:\masm32\include\user32.inc
include S:\masm32\include\kernel32.inc
include S:\masm32\include\gdi32.inc
includelib S:\masm32\lib\user32.lib
includelib S:\masm32\lib\kernel32.lib
includelib S:\masm32\lib\gdi32.lib
include S:\masm32\include\masm32.inc
include S:\masm32\include\debug.inc
includelib S:\masm32\lib\masm32.lib
includelib S:\masm32\lib\debug.lib
.data
val dd 2 dup(3 dup(7,9))
.code
start:
DumpMem offset val, 48 ;7 9 7 9 7 9 7 9 7 9 7 9
ret
end start
运行如下;
手工构建过程如下;