彙編寫Win32 彈窗

2021-10-02 23:08:21 字數 3876 閱讀 8509

1.暫存器

32位cpu一共提供8個通用暫存器

eax:傳遞返回結果

ecx:進行計數

esi:進行源指標

edi:進行目的指標

eip:當前指令指標暫存器

efl:浮點暫存器

2.開發

對於彙編來說開發者要注意棧幀的平衡

資料先進後出

為什麼用棧結構進行程式設計

例:int myadd(int x,int b)

int main()

生命週期問題:

1).區域性變數的記憶體是在棧上進行分配的

2).進行子函式呼叫前的引數傳遞及呼叫後的返回傳遞

end3.資料型別(struct class enum union)

組合語言沒有抽象資料結構,只有指標,記憶體位址

4. 上機(masm編譯器 ml.exe 聯結器 link.exe)

;                單行注釋

.386            必須支援386指令集

.model flat     平坦記憶體模式(全部都在乙個4gb記憶體裡進行操作)

stdcall            標準函式呼叫約定

包含windows標頭檔案

pop ecx

pop    指令的助記符    從棧中彈出乙個32位的整數

ecx    目的運算元

lea 取位址指令

mov ebp, esp

mov 指令的助記符(移動32個位元組) move-移動

從**進行移動? 移動的目的址是**

esp源            ebp目睹

movzx 資料的擴充套件移動

movzx eax,bx

movmovsx i=1;

eip 指標 - 當前cpu執行的指令指標

lea reg, mem ; char * pbuf = &string;

esp 棧頂指標 - 始終指向棧的最上方

ebp 棧底指標 - 始終指向棧的最下方

inc reg/mem 自加一

0xff345678

0xffff0012

程式 = 資料 = 演算法

byte word dword

位操作異或 兩個值按位進行比較

myprint(dword i1,dword i2,dowrd i3)

呼叫約定 - 函式 與 呼叫者之間的關係

(引數怎麼傳遞.返回是對於堆疊的還原由誰來處理)

stdcall cdecl [fastcall]

引數傳遞都是通過

call 是進行乙個函式的呼叫,當呼叫的時候 會自動壓入乙個引數

;masmplus **模板 - 普通的 windows 程式**

.386

.model flat, stdcall

option casemap :none

include windows.inc

include user32.inc

include kernel32.inc

include gdi32.inc

includelib gdi32.lib

includelib user32.lib

includelib kernel32.lib

include macro.asm

winmain proto :dword,:dword,:dword,:dword

wndproc proto :dword,:dword,:dword,:dword

.data

lpmsg db "hello",0

lpclassname db "123",0

szclassname db "masmplus_class",0

.data?

hinstance dd ?

.code

wndproc proc hwnd:dword,umsg:dword,wparam :dword,lparam :dword

.if umsg==wm_create

invoke messagebox,hwnd,addr lpmsg,addr lpclassname,mb_ok or mb_iconexclamation

.elseif umsg == wm_destroy

invoke postquitmessage,0

.elseif umsg == wm_close

invoke postquitmessage,0

.else

invoke defwindowproc,hwnd,umsg,wparam,lparam

ret.endif

xor eax,eax

retwndproc endp

winmain proc hinst:dword,hprevinst:dword,cmdline:dword,cmdshow:dword

local wc :wndclas***

local msg :msg

local hwnd :hwnd

mov wc.cbsize,sizeof wndclas***

mov wc.style,cs_hredraw or cs_vredraw or cs_bytealignwindow

mov wc.lpfnwndproc,offset wndproc

mov wc.cbcl***tra,null

mov wc.cbwndextra,null

push hinst

pop wc.hinstance

mov wc.hbrbackground,color_btnface+1

mov wc.lpszmenuname,null

mov wc.lpszclassname,offset szclassname

invoke loadicon,hinst,100

mov wc.hicon,eax

invoke loadcursor,null,idc_arrow

mov wc.hcursor,eax

mov wc.hiconsm,0

invoke registerclas***, addr wc

mov hwnd,eax

invoke showwindow,hwnd,sw_shownormal

invoke updatewindow,hwnd

.while true

invoke getmessage,addr msg,0,0,0

.if (!eax)

.break

.endif

invoke translatemessage, addr msg

invoke dispatchmessage, addr msg

.endw

retwinmain endp

start:

invoke getmodulehandle,null

mov hinstance,eax

invoke winmain,hinstance,null,null,sw_showdefault

invoke exitprocess,0

end start

Win32彙編基礎

常用指令 mov 目標運算元,源運算元 mov eax,0x0 進行資料傳遞 movzx mov zero x 以0填充高位,用法同上,push poppushad 所有暫存器壓棧 8個 popad 所有暫存器出棧 8個 lea 取位址指令,類似c語言中的 call 呼叫函式指令 add 加 sub...

Win32彙編 實數

386 選擇的處理器 model flat,stdcall option casemap none 指明識別符號大小寫敏感 include kernel32.inc 要引用的標頭檔案 includelib kernel32.lib 要引用的庫檔案 includelib msvcrt.lib 引用c庫...

開始學習win32彙編

前段時間對於csdn的部落格系統徹底失望,在我現在寫的東西都還不知道能不能正常發出去,鬱悶,加上過年有這麼久沒有來了。這段時間開始學習彙編,說到彙編,大學開過兩門相關課程,微機原理和微控制器都是學這方面的,不過那都是8086,51級別的彙編,感覺根本跟不上時代,那時候學的還不錯 現在想學習學習win...