内存地址和偏移量

时间:2013-10-30 02:13:49

标签: assembly

我有一个关于内存地址如何存储值的noob问题。

例如,

addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  +0123456789ABCDEF
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地址中的值是什么?

4 个答案:

答案 0 :(得分: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,最后一个值存储在F 0000 + F = 000F,基地址+偏移自那个地址。

答案 1 :(得分:1)

0000可能只是偏离本地化地址。基本上,BaseAddress + 0000BaseAddress + 0010

值为ASCII,与右侧的字符匹配。您已在该内存中存储了一条文本消息(或字符串)。

每个存储器地址存储一个字节(也是8位,也是2个十六进制(“十六进制”)数字)。 00000000 +0)的十六进制值为5000010000 +1)的十六进制值为61,依此类推。

答案 2 :(得分:1)

addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  +0123456789ABCDEF
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.
<00> 0000似乎是一个地址,但可能是一个相对地址(或偏移量)。 这个输出好像说

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

答案 3 :(得分:0)

是的,0000可以被视为地址。至于0000处“存储”的内容,具体来说,值50存储在那里,000161的值存储,并且一直存储。< / p>

但是,对于更高级别的数据结构,例如16位整数,或32位整数,或字符串,甚至是记录结构,“0000处存储的内容”的答案会变得更加混乱。

如果在0000存储16位二进制整数,对于Intel架构,则值为6150或十进制24912。这是因为英特尔是“小端”,并且稍后在地址空间中存储了最高有效字节。对于“大端”处理器,值为5160或20832十进制。

现在,这可以用二进制编码的十进制编码,在这种情况下,值将是6150或5160(十进制)(取决于字节序)。

所以,你可以看到,即使对于像整数这样简单的东西,它也有不同的方式存储在内存中。

因此,在字节级别,答案非常简单。除此之外,它取决于存储的数据如何在字节级别表示。