Delphi彙編級研究 一 方法呼叫

2021-04-12 16:01:22 字數 1429 閱讀 8932

考慮如下這個簡單類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檔案,合成乙份...