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

學 Win32 匯編 [2]: 最簡單的 Win32 程序

編輯:Delphi

; Test2_1.asm   
 
.386 
.model flat, stdcall 
 
include Windows.inc 
include user32.inc 
include kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
 
.data 
  szCaption db 'Hi', 0 
  szMsg   db 'Hello World!', 0 
 
.code 
start: 
  invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK 
  invoke ExitProcess, NULL 
end start 

  建立過程:

  1、文件 -> 新建工程 -> 工程類型: Win32 App (no res)、工程名稱: Test1 -> 默認下去到完成.

  2、打開 Test1.asm 輸入以上代碼, 然後編譯執行. 結果如下:

學 Win32 匯編 [2]: 最簡單的 Win32 程序

  程序注釋:

; Test1.asm 
; 分號是單行注釋 
 
comment % 
 注釋還可以使用 comment, 現在兩個百分號之間的是注釋內容, 其中的百分號也可以換做其他符號, 譬如 ^ 
% 
 
COMMENT ^ 
 這也是注釋, 
 還是多用 ; 吧, 比較方便 ^ 
 
; ******************************** 
 
.386 
.model flat, stdcall 
 
;.386 和 .model 都是是匯編偽指令; .386 表示使用 386 指令集, 這是 Win32 程序的最低需求. 
;類似的還有 .8086 .286 .386p .486 .486p .586 .586p .mmx 等, 其中的 p 表示可以使用一些特權指令. 
 
;.model 用於定義工作模式; 
;flat 是內存模式, 類似還有: tiny small medium compact large huge, Win32 程序只能選擇 flat; 
;stdcall 是語言模式, 類似的還有: c syscall basic fortran pascal, 使用 Win32 API 必須選擇 stdcall. 
 
; ******************************** 
 
include Windows.inc 
include user32.inc 
include kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
 
;kernel32.dll 是系統服務接口, 負責內存管理等; 
;user32.dll 是用戶服務接口, 負責消息管理等; 
;下面的程序會用到它們的函數. 
 
;user32.inc 和 kernel32.inc 中分別包含著對應 DLL 的函數、常量、結構的聲明. 
;Windows.inc 包含著 Win32 程序用到的常量、結構的聲明; 譬如下面用到的 MB_OK 常量就是在其中聲明. 
 
;程序在編譯時, 見到 include (偽)指令就會把它指定的 inc 文件(或 asm) 文件復制到當前位置. 
 
;lib 文件包含了相應 DLL 的函數信息(主要是位置信息), 程序在鏈接階段會提取這些信息; 
;程序運行時會根據這些信息去調用 DLL 中的相應的函數. 
 
;inc 和 lib 文件分別存放在 masm32\include\ 和 masm32\lib\ 下. 
 
; ******************************** 
 
.data 
  szCaption db 'Hi', 0 
  szMsg   db 'Hello World!', 0 
 
;.data 說明這是程序的數據段, 下面的 .code 是代碼段 
;後面還會接觸到 .const(常量段)、.data?(變量段)等 
 
;這裡是定義了兩個字符串變量 szCaption、szMsg, 後面的 0 表示是 0 結束的字符串. 
;關於 db 等後面詳細探討. 
 
; ******************************** 
 
.code 
start: 
  invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK 
  invoke ExitProcess, NULL 
end start 
 
;這段程序用到了兩個 API 函數: MessageBox(顯示消息框)、ExitProcess(退出程序); 
;這兩個函數分別來自 user32.dll 和 kernel32.dll. 
 
;invoke 是調用函數或子過程的偽指令. 
;addr 是取地址的偽指令, 這裡也可以換做 offset 
 
;start 是隨便命名的標號, 用於表示程序段的開始和結束 
 
;另外匯編本來是不區分大小寫的, 但在使用 WinAPI 和 C 函數時必須注意大小寫 
;標號(如 start)也要注意大小寫 
 
;匯編會忽略多余的空白, 可用 \ 續行, 譬如: 
invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK 
;可寫作: 
invoke MessageBox, NULL,\ 
          addr szMsg,\ 
          addr szCaption,\ 
          MB_OK 


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