以下**由radasm中編譯成功,在彙編中仍然是通過呼叫系統api去構造乙個form
.386
.model flat,stdcall
option casemap:none
; include 檔案定義
; include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include gdi32.inc
includelib gdi32.lib
; 資料段
.data?
hinstance dd ?
hwinmain dd ?
.const
szclassname db 'myclass',0
szcaptionmain db 'my first window !',0
sztext db 'win32 assembly, ****** and powerful !',0
; **段
.code
; 視窗過程
_procwinmain proc uses ebx edi esi,hwnd,umsg,wparam,lparam
local @stps:paintstruct
local @strect:rect
local @hdc
mov eax,umsg
.if eax == wm_paint
invoke beginpaint,hwnd,addr @stps
mov @hdc,eax
invoke getclientrect,hwnd,addr @strect
invoke drawtext,@hdc,addr sztext,-1,/
addr @strect,/
dt_singleline or dt_center or dt_vcenter
invoke endpaint,hwnd,addr @stps
.elseif eax == wm_close
invoke destroywindow,hwinmain
invoke postquitmessage,null
.else
invoke defwindowproc,hwnd,umsg,wparam,lparam
ret.endif
xor eax,eax
ret_procwinmain endp
_winmain proc
local @stwndclass:wndclas***
local @stmsg:msg
invoke getmodulehandle,null
mov hinstance,eax
invoke rtlzeromemory,addr @stwndclass,sizeof @stwndclass
; 註冊視窗類
invoke loadcursor,0,idc_arrow
mov @stwndclass.hcursor,eax
push hinstance
pop @stwndclass.hinstance
mov @stwndclass.cbsize,sizeof wndclas***
mov @stwndclass.style,cs_hredraw or cs_vredraw
mov @stwndclass.lpfnwndproc,offset _procwinmain
mov @stwndclass.hbrbackground,color_window + 1
mov @stwndclass.lpszclassname,offset szclassname
invoke registerclas***,addr @stwndclass
; 建立並顯示視窗
invoke createwindowex,ws_ex_clientedge,/
offset szclassname,offset szcaptionmain,/
100,100,600,400,/
null,null,hinstance,null
mov hwinmain,eax
invoke showwindow,hwinmain,sw_shownormal
invoke updatewindow,hwinmain
; 訊息迴圈
.while true
invoke getmessage,addr @stmsg,null,0,0
.break .if eax == 0
invoke translatemessage,addr @stmsg
invoke dispatchmessage,addr @stmsg
.endw
ret_winmain endp
start:
call _winmain
invoke exitprocess,null
end start
api的呼叫順序:getmodulehandle
→rtlzeromemory
→loadcursor
→registerclas***
→createwindowex
→showwindow
→updatewindow
之後進入訊息獲取和派發迴圈getmessage
→translatemessage
→dispatchmessageran
然後系統**視窗過程_procwinmain 這個函式的指標在
registerclas***註冊窗體的時候告訴了系統。
視窗程式 WinAPI之C語言實現
我們都知道任何c 中的類中都包裹著api,所以有時候我們需要更加靈活的處理問題的時候會直接呼叫系統api 當初一開始學c語言的時候就很想自己寫個窗體程式,迫於自己的無知以及別的菜鳥的忽悠 這個事情一直沒有做成功,害當時的我以為c寫個窗體出來是多麼難的事情。當然啦,要是直接自己和硬體打交道,那當然是很...
winAPI視窗程式流程
1 定義入口函式winmain 2 建立乙個視窗 1 設定視窗類wndclass 給成員變數賦值 2 註冊視窗類 3 建立視窗類 4 顯示和更新視窗 3 訊息迴圈 4 視窗過程函式 include 視窗過程函式 lresult callback windowproc in hwnd hwnd,in ...
組合語言學習之組合語言源程式的輸入
在dos下輸入彙編源程式的方法 一 環境的搭建 二 熟悉debug的一些除錯指令 當顯示器顯示出提示符 時,說明已進入到debug狀態,此時,可以用debug命令列來操作 1.r 指令 用法 r 暫存器的名字 作用 用於檢視暫存器的值 register的首字母 或者修改暫存器的內容。當暫存器的名字省...