全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1309
推到 Plurk!
推到 Facebook!

Application & Screen 這二個"全域變數"似乎是物件的指標 ???

缺席
Turbo5010
一般會員


發表:6
回覆:4
積分:7
註冊:2003-03-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-18 21:49:37 IP:61.64.xxx.xxx 未訂閱
如果查看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.為什麼這二個變數是這麼的不一樣? 還是我自己弄錯了. 2.為什麼這二個變數要如此設計.是否和Delphi的Online Help說明的有關 There are several versions of the Application variable: One for standard applications (declared in the Forms unit). One for Web server applications (Declared in the Httpapp unit). The Web server Application variable is initialized as either an ISAPI application (in the Isapiapp unit) or a CGI application (in the Cgiapp unit). A single project should include only one of these. One for service applications (Declared in the Svcmgr unit). One for Control panel applets (Declared in the Ctlpanel unit). Do not add more than one of these units (Forms, Cgiapp, Isapiapp, Svcmgr, or Ctlpanel) to the uses list of a project. When a program starts running, Delphi instantiates the Application variable as declared in the unit that is included in the project, and calls its Initialize method, its CreateForm method, and then its Run method. The behavior of the application depends on the implementation of these methods in the class of Application object that gets created. 發表人 - turbo5010 於 2005/01/18 21:52:31 發表人 - turbo5010 於 2005/01/18 21:57:09
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-19 14:18:35 IP:203.67.xxx.xxx 未訂閱
 
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    
雖然對組合語言並不熟悉,可是以下 的Statement應該是有差異的. 由文字符號來索引與直接由暫存器 代號來做索引,動作上應該有所不同. mov eax,[$00461f90] ; mov eax,[eax] 以文字符號Form1來取得相關位址資料, 在底層應該還有一個取值的mov動作吧.只是 Boland在它的compiler的實作上,將這個動 作隱藏起來了而已, mov eax,[Form1] 個人意見,純屬臆測...< >< >
Turbo5010
一般會員


發表:6
回覆:4
積分:7
註冊:2003-03-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-19 15:05:13 IP:61.64.xxx.xxx 未訂閱
雖然對組合語言並不熟悉,可是以下 的Statement應該是有差異的. 由文字符號來索引與直接由暫存器 代號來做索引,動作上應該有所不同. mov eax,[$00461f90] ; mov eax,[eax] 以文字符號Form1來取得相關位址資料, 在底層應該還有一個取值的mov動作吧.只是 Boland在它的compiler的實作上,將這個動 作隱藏起來了而已, mov eax,[Form1] 個人意見,純屬臆測... 文字符號只是一個位址的代表, Form1其實也是一個 32Bit的位址,只是用文字比較好助憶, Form1 也許是 $00451c2e 這樣的一個位址. 從編譯的機器碼看出上述的情形. 另說 Borland把另個動作隱藏,那是不可能的,從機器碼得知位址或從eax中都可得知,自訂的變數不管是 Application1 或 Screen1 或 Form1 都只要 一次的間接定址就可取得物件的位址,但 唯 Application 和 Screen 這二個變數 需 二次的間接定址,真不知為會這樣.
系統時間:2024-05-01 17:10:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!