程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 學 Win32 匯編 [5]: 偽指令 DUP 與數組

學 Win32 匯編 [5]: 偽指令 DUP 與數組

編輯:Delphi

聲明數組實例:

; 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 



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved