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

Memory 使用IA-32汇编语言时变量的内存位置,memory,assembly,x86,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),实际

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

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

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

问题:

  • 当使用db指令时,这两个值是否仍然消耗一个完整字节,即使它们小于1字节
  • 使用一个完整的字节来表示那些可以用更少的钱就能得到的值,这仍然是一种常见的方法吗(因为我们有太多的内存,所以我们不在乎)
  • 那么,整数0到255通常占用1个字节,整数256到(2^16-1)占用2个字节(一个字)吗
  • 谢谢,

    马格纳斯

    编辑1:让问题更清楚(为前后的问题道歉)


    编辑2:根据其他海报的输入,在下面添加了一个结构化回复

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

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

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

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

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


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

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

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

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

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

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


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

    是的。DB中的B表示字节。 你可以用一个小口来表示,如下所示:

    组合数据库0x23

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

    是的。DB中的B表示字节。 你可以用一个小口来表示,如下所示:

    组合数据库0x23

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

    我最初的问题有点没有条理,因此为了方便在此停留的其他搜索者,我将使用从@unwind和@geert3收到的答案创建一个条理分明的响应。同样,这是我的错,因为最初的结构很差,答案都是@unwind和@geert3

  • 使用db指令时,为变量分配1个字节,即使变量占用的空间小于1个字节,它仍会占用完整的1字节地址点。正如人们可能猜测的那样,这会浪费一些内存,但这没关系,因为你有足够的内存,而且不太在意浪费一些内存。您希望使用完整的1字节内存位置的原因是,当变量单独位于地址槽中时,更容易引用该变量(请参阅#geert3关于使用少于一个字节时如何访问它的说明),此外,如果您以后想重用该变量,最好知道您有最多255个数字的空间
  • 是的,见第1条的答案
  • 是的,在字节可寻址系统中,通常会将字节的倍数分配给变量

  • 我最初的问题有点不对劲