MS. Windows系統下的組合語言

您也可以使用組合語言撰寫 MS Windows 的視窗程式,但這並不是一件簡單的事情,也沒有絕對的必要性,因為您可以使用 C/C++ 語言或更高階的 C#, VB 等語言撰寫視窗程式。但是,如果您真的希望學習如何以組合語言撰寫MS Windows 底下的視窗程式,那您可以下載MASM32 這個組譯器並安裝後,就會發現在C:\MASM32資料夾中附有許多進階的組合語言範例,其中包含許多組合語言版的MS Windows視窗程式。範例一就是其中用來顯示對話框的一個範例。其執行畫面如圖一所示。但是,筆者並非 MASM32 的專家,探討這些程式的原理已經超越筆者的能力範圍,在此筆者僅能提供讀者這些基本資訊,詳細的程式設計方式留待有興趣的讀者自行研究。

範例一、以MASM32撰寫組合語言以顯示對話視窗的範例

  .486                      ; create 32 bit code
  .model flat, stdcall      ; 32 bit memory model
  option casemap :none      ; case sensitive

  include \masm32\include\dialogs.inc
  include simple.inc

  dlgproc PROTO :DWORD,:DWORD,:DWORD,:DWORD
  .code
start:
  mov hInstance, FUNC(GetModuleHandle,NULL)
  call main
  invoke ExitProcess,eax
main proc
  Dialog "Simple Dialog","MS Sans Serif",10, \ ; caption,font,pointsize
    WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, \ ; style
    2, \ ; control count
    50,50,150,80, \ ; x y co-ordinates
    1024 ; memory buffer size
  DlgButton "&OK",WS_TABSTOP,48,40,50,15,IDCANCEL
  DlgStatic "Simple Dialog Written In MASM32",SS_CENTER,2,20,140,9,100
  CallModalDialog hInstance,0,dlgproc,NULL
  ret
main endp

dlgproc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
  .if uMsg == WM_INITDIALOG
    invoke SendMessage,hWin,WM_SETICON,1,FUNC(LoadIcon,NULL,IDI_ASTERISK)
  .elseif uMsg == WM_COMMAND
    .if wParam == IDCANCEL
      jmp quit_dialog
    .endif
  .elseif uMsg == WM_CLOSE
    quit_dialog:
    invoke EndDialog,hWin,0
  .endif
  xor eax, eax
  ret
dlgproc endp
end start
WindowsAssemblyRun.jpg

圖一、<範例一>的執行結果

由於許多歷史因素,IBM PC的組合語言程式設計已經變得非常複雜,無法詳細的納入本書的討論範圍。尤其是在 MS Windows 底下的組合語言程式設計,更因為保護模式等機制,而不容易入手。若讀者有興趣,可以嘗試在 MS DOS系統下,設計古老的16位元組合語言,這會有助於理解BIOS與DOS中斷機制等議題。如果您對MS Windows下的組合語言有興趣,則請安裝MASM32的組譯器,參考其中的範例,可以進一步理解使用組合語言撰寫 MS Windows 中視窗程式的方法。

對筆者而言,學習MS DOS 或MS Windows下的組合語言顯得較不重要,重要的是要理解組合語言的精神,包含指令集的架構與功能等,以及如何利用組合語言進行記憶體映射輸出入等主題。因此,本書並不嘗試去詳細說明與 MS DOS, Windows 相關的主題,因為這些主題都相當複雜,必須花費許多時間才能入門,特別是針對組合語言的新手而言。

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License