【问题标题】:Memory Locations of Variables when Using IA-32 Assembly Language使用 IA-32 汇编语言时变量的内存位置
【发布时间】:2013-12-13 13:04:56
【问题描述】:

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

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

var1 db 2
var2 db 3

这会将 var1 和 var2 放置在相邻的内存单元中(比如 0x0040120e 和 0f)。现在我意识到定义指令 db 为该值分配了 1 个字节。但是,在上述情况下,我有两个值(2 和 3),实际上每个值只需要两个位来存储。

问题:

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

谢谢,

马格纳斯

编辑 1:使问题更加清晰(来回道歉)

编辑 2:根据其他发帖者的输入,在下方添加了结构化回复

【问题讨论】:

    标签: memory assembly x86


    【解决方案1】:

    是的。 DB中的B代表字节。 您可以为每个使用一个 nibble,如下所示:

    组合 db 0x23

    但你必须 a) 如果您需要“2”,则将结果右移 4 位。 b)如果您需要“3”,请屏蔽最左边的 4 位。 这些天几乎不值得付出努力;-)

    【讨论】:

    • 啊,太好了,所以实际上您通常只是将小于 1 字节的任何内容存储在 1 字节插槽中(并且故意浪费内存),因为我们有很多空闲空间?
    • 附加问题:是的。但是您也可以将值 0 到 255 存储在 4 个字节中(并浪费 3 个字节),因为在 32 位机器上读/写更容易/更快。
    【解决方案2】:

    是的,因为该体系结构是字节可寻址的,不能寻址小于字节的任何内容。

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

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

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

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

    您通常应该预先保留变量需要保存的所有值所需的所有位。否则,如果您担心“浪费内存”,则需要在某处获得一些“空位”后立即移动所有其他变量。那最终会花费非常多的钱。此外,知道变量的大小是恒定的,可以生成(或编写)正确的代码来处理它,否则您当然还需要显式存储“变量 x 中保存的值的大小现在是 y位”。这很快就会变得非常痛苦。

    【讨论】:

    • 对不起,我应该在我的帖子中指出,我知道 db 是定义指令,指示一个字节被赋予该值。那么,对于 0-255 的整数,这基本上会浪费大量内存? (在主帖中添加了几个问题)。谢谢!
    • 谢谢,我修改了我的帖子以使其更加清晰,并根据您和#geert3 的回答在下面添加了结构化回复(只是为了未来的访问者)。
    【解决方案3】:

    我最初的问题有点非结构化,所以为了其他搜索者在这里停下来的利益,我将使用从@unwind 和 @geert3 收到的答案来创建结构化响应。再说一次,这是我的错,因为最初的结构很差,而且 @unwind 和 @geert3 的答案都是可信的。

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

    【讨论】:

    • 是的,当然。这就是我在顶帖中指定 IA-32 的原因;)
    • 起来!我错过了。 :) 我收回我的评论。
    猜你喜欢
    • 2014-01-03
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多