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...