請問一個記憶體的問題 |
答題得分者是:sos_admin
|
hkstm
一般會員 發表:23 回覆:31 積分:10 註冊:2002-03-15 發送簡訊給我 |
…知道的請教導一下…謝謝
請問delphi的記憶體一個位址的容量都是固定的嗎…如果不是要怎麼計算?
每個型態所佔的位元又不一樣…大部份應該都只佔一個位址吧除了pcchar這些
而字串型態所佔的又不固定?(依靠型態來決定每個位址的容量?)
一個位址佔多大的空間是由cpu?還是系統決定?
因為以前的概念是幾條位址匯流排幾條資料匯流排?
再請問程式進行中時按下program pause時
出現的數字…下方左邊應該是記憶體位置吧下方右邊應該是內容
8*4是32位元的架構 右邊剛好也是32
下一個跳8個位元?這表示位址跟資料是1個位址是記憶8bit的資料?
我看二進位資料登錄檔也是一樣的用法…請問他的架構…?
感恩…
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
hkstm
一般會員 發表:23 回覆:31 積分:10 註冊:2002-03-15 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
hkstm
一般會員 發表:23 回覆:31 積分:10 註冊:2002-03-15 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
一般来说,编译器会尽可能将参数及局部变量放进寄存器中,顺序是EAX->EDX->ECX, 剩下的才压入堆栈:函数内声明的变量会放在EBP 的负偏移,参数会放在EBP 的正偏移。 但要注意很多例外的地方,比方说当函数定义为stdcall,cdecl,safecall时所有的参数都压栈,而且压栈顺序为从右向左。 这部分的内容可以参考Delphi所附帮助中
Object Pascal Refrence -> Program Control 例如:
定义变量的绝对地址:
var CrtMode: Byte absolute $0040; 定义变量的别名:
var
Str: string[32];
StrLen: Byte absolute Str; 这都是用关键字Absolute事先的,具体可以参照一下帮助文件。 系统应该有张“变量名 --> 地址”的对应表,可那个表仅存在于编译过程之中,在目标代码中,绝大多数变量都变成了毫无意义的偏移量。
如果您真的需要这些或许可以用Delphi的RTTI里面是拥有这些信息的, 你可以通过RTTI来访问变量的信息. 这是我认为的一些资料,或许对您有帮助!!!
|
hkstm
一般會員 發表:23 回覆:31 積分:10 註冊:2002-03-15 發送簡訊給我 |
一般來說,編譯器會盡可能將參數及局部變數放進寄存器中,順序是EAX->EDX->ECX, 剩下的才壓入堆疊:函數內聲明的變數會放在EBP 的負偏移,參數會放在EBP 的正偏移。
但要注意很多例外的地方,比方說當函數定義爲stdcall,cdecl,safecall時所有的參數都壓棧,而且壓棧順序爲從右向左。
這部分的內容可以參考Delphi所附幫助中
Object Pascal Refrence -> Program Control
例如:
定義變數的絕對位址:
var CrtMode: Byte absolute $0040;
定義變數的別名:
var
Str: string[32];
StrLen: Byte absolute Str;
這都是用關鍵字Absolute事先的,具體可以參照一下幫助文件。
--------------------------------------------------------------------
請問壓棧?是什麼意思啊… 系統應該有張“變數名 --> 地址”的對應表,可那個表僅存在於編譯過程之中,在目標代碼中,絕大多數變數都變成了毫無意義的偏移量。
如果您真的需要這些或許可以用Delphi的RTTI裏面是擁有這些資訊的, 你可以通過RTTI來訪問變數的資訊.
這是我認爲的一些資料,或許對您有幫助!!!
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
SORRY,写错了。应该是堆栈! 补充一下stdcall,cdecl,safecall的调用:
调用约定决定了参数被传递给例程的顺序,它们也影响从堆栈中删除参数、传递参数时寄存器的使用,以及错误和异常处理。默认的调用约定是register。
• register 和pascal 调用从左到右传递参数,也就是说,最左边的参数最早被计算并传递,最右边的参数最后被计算和传递;cdecl、stdcall 和safecall 调用从右到左传递参数;
• 除了cdecl 调用,过程和函数在返回之前从堆栈中移除参数,而使用cdecl,当调用返回时,调用者从堆栈中移除参数;
• register 调用能使用多达3 个CPU 寄存器传递参数,而其它调用则全部使用堆栈传递参数;
• safecall 调用实现了异常“防火墙”,在Windows 下,它实现了进程间COM 错误通知。
|
hkstm
一般會員 發表:23 回覆:31 積分:10 註冊:2002-03-15 發送簡訊給我 |
_____________________________
| a1 | a2 | a3 | b1 | b2 | c1 | c2 | c3 |
|___|___|___|___|___|___|___|___|
例上面有3個變數a,b,c 。a變數佔了三個位址一個位址也就是一個byte
b佔了二個c佔了三個。
如果a1是從$000f開始的那就表示是連續的三個位址,a2就是$0010,
而a記憶體就是由頭一個a1算起也就是&000f,那b就是&0012,故假如a變數為integer型態表示那是連續的4個記憶體位置,也就是從000f到0012,不管其他的調用或是堆疊、或是記憶體的offset,我只是單純的想知道一個位址真的只是一個byte嗎,簡單的定址真的是像上面那樣子嗎?因為我從來不曉得這到底是不是真的。
sos_admin也謝謝你之前講的,堆棧?是堆疊的意思嗎? 發表人 - hkstm 於 2003/08/01 19:42:11
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
可以这么讲,我想您如果学delphi可以不一定对变量的地址了解的这么清楚。
至于什么是堆栈呢?
你可以这样想:假设你有一张桌子。当你把一本书压入堆栈的时候,你实际上是把这本书放到了桌子上。如果你又把一本书放到了桌子上,那么你在桌子上就有两本书了。当你弹出一本书的时候,你从桌子上移走了最上面的一本书。这样你应该清楚什么是压入(push)和弹出(pop)了吧。我们可以将数值压入堆栈,也可以从堆栈中弹出数值。每次我们把一个数值压入堆栈,数值被存储到堆栈所指向的地方,堆栈变小。当弹出数值的时候,数值将本存储到指定的位置,堆栈变大。
所以,堆栈是一块保存数据的连续内存. 一个名为堆栈指针(SP)的寄存器指向堆栈的顶部.堆栈的底部在一个固定的地址. 堆栈的大小在运行时由内核动态地调整. CPU实现指令PUSH和POP, 向堆栈中添加元素和从中移去元素.
|
hkstm
一般會員 發表:23 回覆:31 積分:10 註冊:2002-03-15 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
hkstm
一般會員 發表:23 回覆:31 積分:10 註冊:2002-03-15 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |