聲明數組實例:
; Test5_1.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szFmt db '%d', 0DH, 0AH, 0
;聲明並初始化有五個元素的 DWord 數組; 該數組每個元素是 4 字節
val dd 11,22,33,44,55
.code
start:
invoke crt_printf, addr szFmt, val ;11
invoke crt_printf, addr szFmt, val+4 ;22
invoke crt_printf, addr szFmt, val+8 ;33
invoke crt_printf, addr szFmt, val+12 ;44
invoke crt_printf, addr szFmt, val+16 ;55
ret
end start
上面的例子也可以這樣寫:
; Test5_2.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szFmt db '%d', 0DH, 0AH, 0
val dd 11
dd 22
dd 33,44,55
.code
start:
invoke crt_printf, addr szFmt, val[0] ;11
invoke crt_printf, addr szFmt, val[4*1] ;22
invoke crt_printf, addr szFmt, val[4*2] ;33
invoke crt_printf, addr szFmt, val[4*3] ;44
invoke crt_printf, addr szFmt, val[4*4] ;55
ret
end start
使用偽指令 DUP:
; Test5_3.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szFmt db '%d', 0DH, 0AH, 0
;聲明有五個元素的 DWord 數組, 並把每個元素初始化為 6
v1 dd 5 dup(6)
;聲明有五個元素的 DWord 數組, 無初始化; 對全局變量, 沒有初始化的將用 0 填充
v2 dd 5 dup(?)
.data?
;聲明有五個元素的 DWord 數組
v3 dd 5 dup(?)
.code
start:
invoke crt_printf, addr szFmt, v1[0] ;6
invoke crt_printf, addr szFmt, v1[4*1] ;6
invoke crt_printf, addr szFmt, v1[4*2] ;6
invoke crt_printf, addr szFmt, v1[4*3] ;6
invoke crt_printf, addr szFmt, v1[4*4] ;6
invoke crt_printf, addr szFmt, v2[0] ;0
invoke crt_printf, addr szFmt, v2[4*1] ;0
invoke crt_printf, addr szFmt, v2[4*2] ;0
invoke crt_printf, addr szFmt, v2[4*3] ;0
invoke crt_printf, addr szFmt, v2[4*4] ;0
invoke crt_printf, addr szFmt, v3[0] ;0
invoke crt_printf, addr szFmt, v3[4*1] ;0
invoke crt_printf, addr szFmt, v3[4*2] ;0
invoke crt_printf, addr szFmt, v3[4*3] ;0
invoke crt_printf, addr szFmt, v3[4*4] ;0
ret
end start
現在可以區別未初始化的變量在 .data 段和 .data? 的區別:
; Test15_4.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szText db 'Hi', 0
v1 dd 4096 dup(?) ;未初始化變量在 .data 段, 生成的 exe 文件會根據大小分配內存
.code
start:
invoke crt_printf, addr szText
ret
end start
; ------------------------------------------------------
; 上面的程序的 exe 是 18944 字節
; 下面的程序的 exe 是 2560 字節
; 它們剛好相差 4096*4 個字節
; 結論: 不需要初始化的變量應該聲明在 .data? 段
; ------------------------------------------------------
; Test15_5.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szText db 'Hi', 0
.data?
v1 dd 4096 dup(?) ;未初始化變量在 .data? 段
.code
start:
invoke crt_printf, addr szText
ret
end start
繼續 dup 的例子:
; Test5_6.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szFmt db '%d', 0DH, 0AH, 0
val dd 2 dup(11,22,33)
.code
start:
invoke crt_printf, addr szFmt, val[0] ;11
invoke crt_printf, addr szFmt, val[4*1] ;22
invoke crt_printf, addr szFmt, val[4*2] ;33
invoke crt_printf, addr szFmt, val[4*3] ;11
invoke crt_printf, addr szFmt, val[4*4] ;22
invoke crt_printf, addr szFmt, val[4*5] ;33
ret
end start
嵌套數組:
; Test5_7.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szFmt db '%d', 0DH, 0AH, 0
val dd 2 dup(3 dup(1,2))
.code
start:
invoke crt_printf, addr szFmt, val[0] ;1
invoke crt_printf, addr szFmt, val[4*1] ;2
invoke crt_printf, addr szFmt, val[4*2] ;1
invoke crt_printf, addr szFmt, val[4*3] ;2
invoke crt_printf, addr szFmt, val[4*4] ;1
invoke crt_printf, addr szFmt, val[4*5] ;2
invoke crt_printf, addr szFmt, val[4*6] ;1
invoke crt_printf, addr szFmt, val[4*7] ;2
invoke crt_printf, addr szFmt, val[4*8] ;1
invoke crt_printf, addr szFmt, val[4*9] ;2
invoke crt_printf, addr szFmt, val[4*10] ;1
invoke crt_printf, addr szFmt, val[4*11] ;2
ret
end start
按多維數組的理念, 上一個例子也可以這樣訪問:
; Test5_8.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szFmt db '%d', 0DH, 0AH, 0
val dd 2 dup(3 dup(1,2))
.code
start:
invoke crt_printf, addr szFmt, val[4*0][4*0] ;1
invoke crt_printf, addr szFmt, val[4*0][4*1] ;2
invoke crt_printf, addr szFmt, val[4*0][4*2] ;1
invoke crt_printf, addr szFmt, val[4*0][4*0] ;2
invoke crt_printf, addr szFmt, val[4*0][4*1] ;1
invoke crt_printf, addr szFmt, val[4*0][4*2] ;2
invoke crt_printf, addr szFmt, val[4*1][4*0] ;1
invoke crt_printf, addr szFmt, val[4*1][4*1] ;2
invoke crt_printf, addr szFmt, val[4*1][4*2] ;1
invoke crt_printf, addr szFmt, val[4*1][4*0] ;2
invoke crt_printf, addr szFmt, val[4*1][4*1] ;1
invoke crt_printf, addr szFmt, val[4*1][4*2] ;2
ret
end start