关于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:提出更清楚的问题(来回道歉)
编辑2:根据其他海报的输入
在下方添加了结构化回复答案 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。