使用IA-32汇编语言时变量的存储位置

时间:2013-12-13 13:04:57

标签: memory assembly x86

关于IA-32汇编语言的内存位置的快速提问,我似乎找不到其他任何地方的答案。

在IA-32上,每个存储器地址长度为4个字节(例如0x0040120e)。这些地址中的每一个都指向1字节值(或者在较大值的情况下,指向它的第一个字节)。现在看看这两个简单的IA-32汇编语言语句:

var1 db 2
var2 db 3

这会将var1和var2放在相邻的存储单元中(假设为0x0040120e和0f)。现在我意识到define指令db为该值分配了1个字节。但是,在上面的例子中,我有两个值(2和3)实际上只需要两个位来存储。

问题:

  1. 使用db指令时,这两个值是否仍会占用一个完整的字节,即使它们小于1个字节?
  2. 使用一个完整的字节表示可以用更少的东西逃脱的值,仍然是常见的方法(因为我们有太多的内存,我们不在乎)?
  3. 整数0到255通常占用1个字节,整数256到(2 ^ 16 - 1)占用2个字节(一个字)等吗?
  4. 谢谢,

    马格努斯

    编辑1:提出更清楚的问题(来回道歉)

    编辑2:根据其他海报的输入

    在下方添加了结构化回复

3 个答案:

答案 0 :(得分:2)

是肯定的。 DB中的B是Byte。 您可以为每个使用半字节,如下所示:

组合db 0x23

但你必须这样做 a)如果需要" 2"则将结果右移4位。 b)如果需要" 3"则屏蔽最左边的4位。 这些日子几乎不值得努力; - )

答案 1 :(得分:1)

是的,因为该架构是字节可寻址的,并且不能处理小于一个字节的任何内容。

这意味着需要少于一个字节的数据需要与其他数据共享其地址。

实际上,这意味着您必须知道指出字节中的哪些位用于此特定值。

对于硬件寄存器,这种映射很常见。

编辑:啊,当你说“2和3”时,你似乎是指“同一个变量的值”。我以为你的意思是2位和3位值。您需要确定特定变量最多需要多少位,以及您需要该变量能够存储的所有值。当然,对于整数有可变长度编码,但这通常很少用于汇编,而不是通常用于某些通用变量的。

您通常应该预先保留变量需要保留的所有值所需的所有位。否则,如果你担心“浪费内存”,你需要在某处获得一些“空位”时移动所有其他变量。这最终会耗费巨大的成本。另外,知道变量的大小是常量的,可以生成(或写入)正确的代码来处理它,否则你当然也需要明确地存储某个地方“变量x中保存的值的大小现在是y位”。这非常非常迅速地变得非常痛苦。

答案 2 :(得分:1)

我最初的问题有点非结构化,所以为了其他搜索者的好处,我将使用从@unwind和@ geert3收到的答案来创建结构化响应。再次,这是我的错,因为最初的糟糕结构和答案的信誉去了@unwind和@ geert3。

  1. 使用db指令时,为变量分配1个字节,即使变量占用的空间少于1个字节,它仍将消耗完整的1个字节地址点。正如人们可能猜到的那样,浪费了一些内存,但这没关系,因为你有足够的内存,而且不会浪费几个比特。您想要使用完整的1字节内存位置的原因是,当它在地址槽中单独使用时,更容易引用该变量(如果使用少于一个字节,请参阅#geert3关于如何访问它的说明),以及另外,如果您想稍后重复使用该变量,很高兴知道您可以为任何最多255的数字提供空间。
  2. 是的,请参阅答案1
  3. 是的,您通常会在字节可寻址系统中将一个字节的倍数分配给变量