我在學習彙編語言,需要澄清一些事情。如果我對這個問題有任何疑問,請糾正我,因爲我對裝配了解不多。程序集內存分配
我看的所有教程都將彙編程序的變量分配給內存地址,如0x0000
,我可以理解您必須在彙編中手動分配內存地址,但您如何知道要使用的地址?
很明顯,從最低內存地址開始是有道理的,但如果分配的變量大於0x0000
處的內存,該怎麼辦?所討論的變量是否會運行到0x0001
或0x0002
?如果它確實不會把其他變量分配給具有相似編號的空格(或者你不應該把它們分配給那些關閉)?
如果我有兩個程序同時運行(在一個現代操作系統中)並且我在這兩個程序中都使用了相同的內存地址,一個程序是否會與另一個程序發生衝突,或者OS是否只分配一個可用內存地址,而不管程序中實際寫入的內容是什麼?
關於這個問題的任何信息表示讚賞。
感謝您的詳細解答!在答案的最後部分,如何精確計算每一位數據需要多少空間?手動計算一個程序的數百個變量似乎不可行。用你的話說,你如何「擺脫」? – ubiquibacon 2010-08-17 00:37:54
我從未在任何大型項目中使用過程序集,但在我的操作系統類中推薦的啓發式算法是按大小對變量進行排序,然後將最小的變量放在最低內存地址處。這並不總是最好的佈局 - 您可能能夠在大數據類型之間使用小數據類型。 您應該能夠從變量的類型中知道它需要多少內存 - 請參考彙編語言的文檔。請記住,一個變量在程序的整個運行過程中會佔用相同數量的內存。它不能「增長」。這就是溢出發生的原因。 – 2010-08-17 00:41:40
偉大的答案,只是一個更正。正確對齊數據不是關於節省空間,因爲它的所有連續內存無論如何。它與數據總線如何映射到內存有關。前8位從地址0開始,接下來的8位連接到地址1.這意味着從地址0開始的16位整數可以在單次讀取中讀取,因爲它使用數據總線的兩側。但是,如果一個16位整數從1開始,它現在必須進行兩次讀取才能得到整個整數。對於32位整數,出於同樣的原因,它們應該在可被4整除的地址處開始。 – Despertar 2016-05-18 22:06:24