乙個簡單的彙編視窗

2021-06-17 01:00:35 字數 2876 閱讀 3416

.386

.model flat,stdcall

option casemap:none

include windows.inc

include user32.inc

includelib user32.lib

include gdi32.inc

includelib gdi32.lib

include kernel32.inc

includelib kernel32.lib

.data

hinstance dd ? ;例項控制代碼

hwinmain dd ?  ;窗體控制代碼

;rectx   dd ?

.const

szclassname db 'ssyclass',0  ;視窗類名

szcaptionname db 'mywindow',0 ;視窗標題

sztext db 'hello world',0    ;客戶區顯示內容

.code

;視窗過程函式

_procwinmain proc uses ebx edi esi hwnd,umsg,wparam,lparam  ;.uses ebx edi esi這句是讓編譯器在

;函式中用push,pop指令保護這三個暫存器的值

local @stps:paintstruct

local @strect:rect

local @hdc

mov eax,umsg

.if eax==wm_paint

invoke beginpaint,hwnd,addr @stps   ;beginpaint函式為指定視窗進行繪圖工作的準備,並用將和繪圖有關的資訊填充到乙個

;paintstruct結構中。

mov @hdc,eax ;返回裝置環境控制代碼

invoke getclientrect,hwnd,addr @strect    ;獲取客戶區的座標

;invoke drawtext,@hdc,addr sztext,-1,\     ;在目標區域繪製 -1自動設定大小

;       addr @strect,\

;  invoke drawtext,@hdc,addr @strect.top,-1,\     ;在目標區域繪製 -1自動設定大小

;       addr @strect,\

invoke textout,@hdc,null,null,addr sztext,sizeof sztext-1

;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***   ;宣告個 wndclas***結構體的區域性變數@stwndclass

local @stmsg:msg               ;宣告 msg結構體的區域性變數 @stmsg 訊息結構體

invoke getmodulehandle,null    ;獲得當前例項控制代碼

mov hinstance,eax              ;返回值在eax hinstance中

invoke rtlzeromemory,addr @stwndclass,sizeof wndclas*** ;初始化wndclas***,全置0

;註冊視窗類

invoke loadcursor,0,idc_wait     ;裝載游標 idc wait 為漏斗游標

mov @stwndclass.hcursor,eax      ;函式返回游標控制代碼

push hinstance

pop @stwndclass.hinstance        ;把例項控制代碼壓棧再彈到結構體裡

mov @stwndclass.cbsize,sizeof wndclas*** ;把視窗類結構體占的位元組放在cbsize中

mov @stwndclass.style,cs_hredraw or cs_vredraw  ;在水平或垂直方向視窗大小變化時重繪視窗

mov @stwndclass.lpfnwndproc,offset _procwinmain  ;把視窗過程函式位址給lpfnwndproc

mov @stwndclass.hbrbackground,color_window+10     ;設定背景色

mov @stwndclass.lpszclassname,offset szclassname  ;把視窗類名位址給lpszclassname

invoke registerclas***,addr @stwndclass  ;註冊視窗

;建立並顯示視窗

;訊息迴圈

.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

乙個簡單函式的反彙編

void myfunction int a,int b int c a b 1 儲存ebp。ebp總是被我們用來儲存這個函式執行前的esp的值。執行完畢後,我們用ebp恢復esp 同時,呼叫此函式的上層函式也用ebp做同樣的事情。所以先把ebp壓入堆疊,返回之前彈出,避免ebp被我們改動。push ...

乙個彙編簡單樣例

int i,m u 0 for i 1 ireturn m u a0,n a1 i a0,s1 m max lw s1,0 a0 m u 0 addi s0,zero,l i l slt to,s0,a1 ibeq to,zero,exit sll t1,so,2 i 4 int 4位元組 add ...

pygame 建立乙個簡單的視窗

import pygame,sysimport pygame,sys def pygame test 初始化 pygame.init import pygame,sys def pygame test 初始化 pygame.init 建立乙個視窗 screen pygame.display.set ...