2013-12-13 37 views
1

对IA-32汇编语言中内存位置的快速提问,我似乎无法在其他任何位置找到答案。使用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个字节(一个字)等。

谢谢

马格努斯

编辑1:提出的问题更加清晰(为后面道歉来回)

编辑2:下面加一个结构化的回复,基于在其他海报的输入

回答

1

是的,因为体系结构是字节寻址,不能添加处理小于一个字节的任何东西。

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

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

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

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

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

+0

对不起,应该在我的文章中注意到,我知道db是define指令,指示给该值赋予一个字节。所以,对于0-255的整数,这基本上浪费了大量的内存? (在主帖中增加了几个问题)。谢谢! – Magnus

+0

谢谢,我根据您和#geert3的回答(仅为未来访客的利益)修改了我的帖子,以便更清楚并在下面添加了结构化回复。 – Magnus

2

是的。 DB中的B是Byte。 你可以使用一个半字节每个,像这样:

结合分贝0×23

,但你不得不 一)为4位的结果右移,如果你需要的“2”。 b)如果你需要“3”,屏蔽最左边的4位。 这几天毫无价值的努力;-)

+0

好啊,所以实际上你通常只是在1字节的时隙内存储小于1个字节的任何内容(并且目的是浪费内存),因为我们有很多事情要做。 – Magnus

+0

附加问题:是的。但是,您也可以在4字节中存储0到255的值(并浪费3),这是因为在32位机器上读取/写入更容易/更快速。 – geert3

1

我最初的问题是有点没有结构化,所以为了让其他搜索者在这里停下来的好处,我将使用从@unwind和@ geert3收到的答案来创建一个结构化的响应。再一次,这是我的错,因为最初的糟糕结构和声望让答案进入了@unwind和@ geert3。

  1. 当使用DB指令你分配1个字节的变量,即使变量占用空间小于1个字节,它仍然会消耗是全1字节的地址点。正如人们可能会猜到的那样,这会浪费一些内存,但这是可以的,因为你有足够的内存,并且不会为浪费几个比特而烦恼。您希望使用完整的1字节内存位置的原因是,在地址插槽中单独使用变量时更容易引用该变量(有关如何使用少于一个字节的信息,请参阅#geert3关于如何访问该变量的说明),以及此外,如果您想稍后再使用该变量,则很高兴知道您有足够的空间来存储多达255个数字。
  2. 是的,请参阅1的回答
  3. 是的,您通常会分配一个字节的倍数一个字节可寻址系统中的变量
+0

是的,绝对。这就是为什么我在顶端的帖子中指定IA-32的原因;) – Magnus

+0

Ups!我错过了。 :)我收回我的评论。 – Devolus