Win32汇编数组编程图解

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

运行如下; 

手工构建过程如下;

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值