2013-10-30 102 views
2

我有一個關於內存地址如何存儲值noob問題。內存地址和偏移

例如,

addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +FABCDEF 
0000 50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20 Pax is a really 
0010 63 6F 6F 6C 20 67 75 79 00      cool guy. 

是0000的地址? 是50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20存儲在0000地址中的值?

+0

什麼程序產生這個輸出? –

回答

1
addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +FABCDEF 
0000 50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20 Pax is a really 
0010 63 6F 6F 6C 20 67 75 79 00      cool guy. 

0000似乎是一個地址,但可能是一個相對地址(或偏移量)。 此輸出似乎是說,

addr   value 
0000+0 (0000) 0x50 
0000+1 (0001) 0x61 
0000+2(0002) 0x78 
    .... 
1

0000很可能只是本地化地址的偏移量。基本上,BaseAddress + 0000,BaseAddress + 0010

值是ASCII,它們匹配右側的字符。您已將短信(或字符串)存儲在該內存中。每個存儲器地址存儲一個字節(也是8位,也是2個十六進制(「十六進制」)數字)。 00000000 +0)具有十六進制值5000010000 +1)具有十六進制值61,依此類推。

3

這裏0000是一個地址,從標籤addr。存儲在0000的唯一值是50。每個字節都有自己的地址:

------+-------- 
addr | data 
------+-------- 
0000 | 50 
0001 | 61 
0002 | 78 
0003 | 20 
0004 | 69 
0005 | 73 
0006 | 20 
0007 | 61 
0008 | 20 
0009 | 72 
000A | 65 
000B | 61 
000C | 6C 
000D | 6C 
000E | 79 
000F | 20 

比如你0000作爲基址考慮,可以說20,最後一個值存儲在F0000 + F = 000F,基址+從該地址偏移。

0

是的,0000可以被認爲是一個地址。關於在0000處「存儲」的內容,具體地,值50被存儲在那裏,並且在0001處存儲61的值,並且等等。

但是,對於更高級別的數據結構(例如16位整數或32位整數或字符串或甚至記錄結構),「存儲在0000處」的答案會變得更加混亂。

如果在0000處存儲16位二進制整數,對於Intel體系結構,則值將爲6150或24912(十進制)。這是因爲英特爾是「小端」,並將最重要的字節存儲在地址空間中。對於「大端」處理器,值爲5160或20832十進制。

現在,這可以用二進制編碼的十進制編碼,在這種情況下,值將是6150或5160(十進制)(取決於字節順序)。

所以,即使像一個整數這樣簡單的東西,也可以看到它可以存儲在內存中的不同方式。

所以,在字節級別,答案非常簡單。除此之外,它取決於如何將存儲的數據表示在字節級。