視窗程式 WinAPI之組合語言實現

2021-04-26 21:04:38 字數 3060 閱讀 7583

以下**由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的首字母 或者修改暫存器的內容。當暫存器的名字省...