寄存器:
主要記住以下幾個
Eax:一般用來存放call返回值 模塊命令 系統命令 api
call() :函數,參數,返回 -》 eax
Ecx : 隱藏的對象基址
EBp: 表示參數或變量
參數 [ebp+0*4(n+1)] n代表第幾個參數
變量 [ebp+0*4*n] n代表第幾個變量
eip: 程序下一步要執行的地址
esp:堆棧
ebx
esi
edi
[local.n]:
[local.1] 第一個變量 ,[local.2]第二個變量,以此類推
mov:
mov eax,123 將值123 賦值給eax
mov ebx,13 將值13 賦值給ebx
push:
入棧,相當於傳參
例子1:
定義一個方法,里面帶有一個變量c
現在需要 數字 123 + 456 的和 賦值給變量c
可以這么寫
mov eax,123
mov ebx,456
add eax,ebx
mov [local.1],eax
[local.1]代表的是這個子程序的第一個變量,這里是簡便寫法,還可以用[ebp+0*4]來表示
例子2,調用call
定義一個無參方法,會輸出語句:“hello”
現在要從其他地方 用匯編調用 ,可以這么寫
先定義一個變量,指向call的地址,然后
call eax 就能直接調用
或者 call [local.1]
有參方法調用
定義一個有參方法,需要傳入兩個參數,都是int類型,一個a,一個b
會輸出 a+b的值
現在要調用,可以這么寫:
先定義一個變量,指向call的地址,然后
push 1
puth 2
call eax 或者 call [local.1]
call的值可以用 mov eax來接收,如 mov [local.1],eax 表示把call的結果傳給第一個變量
說明:push的順序是反過來的
例如 參數1要傳入1,參數2要傳入5
那么push 順序是:
push 5
push 1
有時候我們是調用別人的call 可能會出現問題
正常調用call后需要我們進行堆棧平衡,
add esp,0*4(n):外平衡
如果call只有一個參數那么就是 add esp,0*4
如果call有兩個參數 那么就是 add esp,0*8
三個參數就是 add esp,0*c【這里為什么是0*c 自己去計算器10進制轉換成16進制就知道了】