Memory 使用IA-32汇编语言时变量的内存位置
关于IA-32汇编语言中内存位置的快速问题,我似乎在其他任何地方都找不到答案 在IA-32上,每个内存地址的长度为4字节(例如0x0040120e)。这些地址中的每一个都指向一个1字节的值(如果是较大的值,则指向它的第一个字节)。现在来看这两个简单的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),实际
var1 db 2
var2 db 3
这将把var1和var2放在相邻的内存单元中(比如0x0040120e和0f)。现在我意识到define指令db为该值分配了1个字节。但是,在上面的例子中,我有两个值(2和3),实际上每个值只需要两个位就可以存储
问题:
编辑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
我最初的问题有点不对劲