T
turbo5010
Unregistered / Unconfirmed
GUEST, unregistred user!
如果查看Delphi編輯的組合語言畫面,會發現提取 Application &
Screen 這二個變數的指令和自訂變數的指令不一樣,提取Application和Seceen這二個變數必須多一次間接定址.
Object Pascal :
Application.Title := 'Test!!!!!';
Assembly :
mov eax,[$00461f90]
間接定址
mov eax,[eax]
比一般的物件參考多了這個步驟
mov edx,$0045fedc
直接定址,指向常數 'Test!!!!!'
call TApplication.SetTitle
一般的物件參考其組合語言如下:
Object Pascal :
Form1.Caption := 'Test!!!!!';
Assevbly :
mov edx,$0045fedc ;直接定址,指向常數 'Test!!!!!'
mov eax,[Form1] ;取得Form1物件址址
call TControl.SetText
一般都知道Delphi的物件變數其實是物件指標,但Application和Screen卻是物件指標的指標,查過Controls.pas 的 procedure InitControls
Application 和 Screen這二個物件的建構和一般的物件建構並沒什麼不同,但Delphi卻如此儲存Application和Screen. 由它們的組合語言看來,這二個變數是物件指標的指標,但我們在程式中卻可把它們當成一般的物件來使用,Delphi卻會幫我們自動轉換.難道這又是Delphi的 [Compile Magic];
問題:
1.為什麼這二個變數是這麼的不一樣? 還是我自己弄錯了.
Screen 這二個變數的指令和自訂變數的指令不一樣,提取Application和Seceen這二個變數必須多一次間接定址.
Object Pascal :
Application.Title := 'Test!!!!!';
Assembly :
mov eax,[$00461f90]
間接定址
mov eax,[eax]
比一般的物件參考多了這個步驟
mov edx,$0045fedc
直接定址,指向常數 'Test!!!!!'
call TApplication.SetTitle
一般的物件參考其組合語言如下:
Object Pascal :
Form1.Caption := 'Test!!!!!';
Assevbly :
mov edx,$0045fedc ;直接定址,指向常數 'Test!!!!!'
mov eax,[Form1] ;取得Form1物件址址
call TControl.SetText
一般都知道Delphi的物件變數其實是物件指標,但Application和Screen卻是物件指標的指標,查過Controls.pas 的 procedure InitControls
Application 和 Screen這二個物件的建構和一般的物件建構並沒什麼不同,但Delphi卻如此儲存Application和Screen. 由它們的組合語言看來,這二個變數是物件指標的指標,但我們在程式中卻可把它們當成一般的物件來使用,Delphi卻會幫我們自動轉換.難道這又是Delphi的 [Compile Magic];
問題:
1.為什麼這二個變數是這麼的不一樣? 還是我自己弄錯了.