程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 學 Win32 匯編 [9]: 子過程及子過程中的變量聲明

學 Win32 匯編 [9]: 子過程及子過程中的變量聲明

編輯:Delphi

 定義子過程的偽指令: PROC、ENDP

; Test9_1.asm 
.386 
.model flat, stdcall 
 
include  Windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.code 
   ;子過程 proc1: 
   proc1 proc 
      PrintText 'proc1' 
   proc1 endp 
   
   ;子過程 proc2: 
   proc2 proc 
      PrintText 'proc2' 
   proc2 endp 
   
   ;子過程 proc3: 
   proc3 proc 
      PrintText 'proc3' 
   proc3 endp 
 
   ret 
end proc1 ;end 後面的 proc1 是入口的子過程名; 這也就是指定主過程. 
 
;可以把 end proc1 分別換做 end proc2 和 end proc3 嘗試, 
;如果這是一個供其他程序調用的代碼文件, 那麼 end 後面就不需要指定. 

  模仿 C 語言的樣子, 以後的程序結構應該這樣:

; Test9_2.asm 
.386 
.model flat, stdcall 
 
include  Windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.data 
   szText db 'Hello World!', 0DH, 0AH, 0 
   
.code 
main proc 
   PrintString szText ;Hello World! 
   ret 
main endp 
end main 

  局部變量要用 local 聲明, 和全局變量區別不小:

; Test9_3.asm 
.386 
.model flat, stdcall 
 
include  Windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.code 
main proc 
   ;局部變量中的類型不能使用縮寫 
   LOCAL v1: dWord 
   
   ;可用逗號間隔寫在一行 
   LOCAL v2: dword, v3: dWord 
   
   ;不指定類型時默認 DWord(在 Win32 下) 
   LOCAL v4 
   
   ;數組 
   LOCAL v5[3]: dWord 
   
   ;在手動初始化前, 局部變量中都是些垃圾值: 
   PrintDec v1 
   PrintDec v2 
   PrintDec v3 
   PrintDec v4 
   mov eax, v5[0] 
   PrintDec eax 
   ret 
main endp 
end main 

  調用子過程:

; Test9_4.asm 
.386 
.model flat, stdcall 
 
include  Windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.code 
; 
proc1 proc 
   PrintDec 1 
   ret 
proc1 endp 
; 
proc2 proc 
   PrintDec 2 
   ret 
proc2 endp 
; 
main proc 
   PrintDec 0 
   call proc2 
   call proc1 
   ret 
main endp 
end main 
 
;注釋: 
;最後一行 end main 決定了子過程將被率先調用, 這樣它就成了主過程 
;然後主過程又通過 call 指令順序調用了 proc2、proc1 
;這樣最後的顯示結果將是: 0 / 2 / 1 
;子過程應該用 ret 指令返回 

  一個求和函數的例子:

; Test9_5.asm 
.386 
.model flat, stdcall 
 
include  Windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.code 
;求和的函數, 函數返回值在 eax 
sum proc v1: dword, v2: dWord 
   mov eax, v1 
   add eax, v2 
   ret 
sum endp 
; 
main proc 
   invoke sum, 11, 22 
   PrintDec eax ;33 
   ret 
main endp 
end main 


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