考慮如下這個簡單類ttest
unit unit1;
inte***ce
uses
windows, sysutils, variants, classes;
type
ttest = class
public
j:integer;
i:integer;
function aa(b,c: integer):integer;stdcall;
end;
implementation
function ttest.aa(b,c: integer):integer;stdcall;
begin
result := b + i + c;
end;
end.
呼叫**如下
var a:ttest;
j:integer;
begin
a := ttest.create;
a.i := 50;
j:= a.aa(10,20);
end;
一。觀察j := a.aa(10,20)的編譯結果:
[要點]:
按stdcall呼叫傳引數方式,從右到左將引數壓棧,因為是物件的函式呼叫,
所以最後將物件的位址壓棧,然後呼叫方法.
二。觀察aa成員函式的編譯結果:
[要點]:
方式根據壓棧順序可以同理計算出來)
2.成員變數值的獲取方法,i的偏移是8,因為是第二個整型數.
三。根據上面的分析,可以用彙編實現aa成員函式如下:
function ttest.aa(b,c: integer):integer;stdcall;
a**mov eax,[ebp+$0c] //result := b
mov edx,[ebp+$08] //獲取物件/self位址 -> edx
add eax,[edx+i] //加上成員變數i的值(i在此為相對於self的偏移:
//result := result + i;
add eax,[ebp+$10] //result := result + c;
end;
[要點]:
1.delphi過程/函式內嵌彙編中只有eax/ecx/edx可以隨意使用,eax一般預設
作為函式的返回值存放暫存器.
2.其它暫存器要在過程/函式內使用時,最好先壓棧,退出前還原.
......老鰓...採菊東籬下.悠然見南山...2006.11......
linux密碼破解一方法
鬱悶,剛裝的系統,好像任是把密碼輸錯兩遍了,所以進不去了,好在baidu一下,好多破解方法,這裡也記錄一下,以後就不怕再輸錯或者忘了 1.在出現grub畫面時,用上下鍵選中你平時啟動linux的那一項,然後按e鍵 2.再次用上下鍵選中你平時啟動linux的那一項 類似於kernel boot vml...
C 基礎 一(方法詳解)
需要知道 類和方法的關係 方法和引數修飾符 自定義方法可以有或沒有引數,也可以有或沒有返回值。可以被各種關鍵字 static virtual public new等 修飾以限制其行為。c 引數修飾符 無 如果乙個引數沒有用引數修飾符標記,則認為它將按值傳遞,這意味著被呼叫的方法收到原始資料的乙份副本...
pdf檔案多合一方法
主要借助linux系統中的已有工具pdfunite進行多份pdf檔案合成 linux系統中自帶pdf處理工具,一般可以很簡單使用如下命令將兩份pdf合成乙份pdf檔案。bash pdfunite 1.pdf 2.pdf 1 2.pdf 就是上面這條命令這麼簡單。如果遇到成千上萬份pdf檔案,合成乙份...