2015-11-01 128 views
-1

我不想让你做我的功课。我只想提供一些关于如何做的提示,以便我可以自己学习。字节寻址内存(数据对齐)

给定的是一个从最低位到最高位写入的字节地址内存。然后,我有它具有以下声明一个C程序:

long int i = 1; 
char c = 'x'; 
short int n = 10; 
short in m = 11; 
float f = 0.0; 

在IA32 int是4个字节,char是1个字节,短是2字节,并且浮子是4字节。这些声明如何最有可能被保存在记忆中?用十六进制数字填写以下内容。

enter image description here

如何从这里开始?你能给我一些提示吗?我必须做的第一件事是什么?

编辑:我的教训告诉我,系统是IA32。

回答

2

我假设你的变量声明和定义为本地(不是静态/全球)变量,例如:

int main() 
{ 
    long int i = 1; 
    char c = 'x'; 
    short int n = 10; 
    short in m = 11; 
    float f = 0.0; 
} 

如果是这样,它们被分配到堆栈上。

在堆栈中分配局部变量的原理是大致相同的对所有系统:

  1. 堆栈从高地址增长到低地址
  2. 在程序中的变量声明的顺序对应于增长堆的
  3. 每种类型都具有对准 - 任何变量的地址必须是由它的尺寸整除(1 char,2 short等)
  4. 尝试浪费较小的空间尽可能

原理(2)和(4)之间存在冲突 - 如果重新排列变量节省空间,编译器会执行它吗?我想你可以假设没有(这是你问题中“最有可能”的部分)。(sizeof并非真正由上述数字所规定;对齐要求并不总是等于sizeof;编译器可能会为两个不同的变量重用空间;等等) - 但是您必须简化它如果你想在合理的时间内解决你的功课。

+0

C标准甚至不需要使用堆栈。堆栈并不一定会下降。这个问题甚至没有提到它会是一个堆栈3)是错误的。除了现有体系结构中的'char'类型(只定义了'char')之外,还有更大更小的对齐方式。编译器必须**不**重新排序结构字段,局部变量可以很容易地保存在寄存器中,全局变量也有一些限制,等等。 – Olaf

+0

我同意这一点。这就是为什么我在我的答案中写下最后一段。你提供的所有信息都是真实的,我可以把它放在那里,但你真的不想在OP上抛出几个数兆字节的ABI手册来回答一个简单的问题,对吧?国际海事组织最后一句简短的“它很复杂”的免责声明已经足够了,我已经用三种方式让它变得复杂起来。 – anatolyg

+0

OP必须提供一个特定的布局,所以他**需要一个特定的ABI(它们不是**,实际上对C来说很大或很复杂)。然而,你的ciams并不成立,但是,你从没有解释的先决条件开始,但是如果是atate,虽然它们不是(例如:OP状态是哪些地方变量?它们使用堆栈,堆栈正在下降。 ..)。只是“这很复杂”是不够的。有时候没有答案比错过答案更好。在这方面,对这个问题的评论比你的回答更有帮助。 – Olaf

3

只是想知道如何做到这一点,所以我可以自己学习。

  1. 编写一个程序来实现相关定义。
  2. 使用符号进行编译。
  3. 在调试器中运行它并检查相关变量的地址。

作为替代步骤2和3以上,你可以使用刚刚打印出来的地址:

printf("myvar's address=%p", (void*) &myvar); 
+0

在2月份的考试中,我不允许使用任何计算机,只能使用我的大脑和纸张。那我该如何解决呢? – PeterPan

+1

@ S.Eberl学习/练习考试范围内的所有系统的对齐规则。 – alk

+1

@ S.Eberl:L如果考试不提供必要的信息,您可以尝试使考试无效。或者,您可以了解具体的实施情况,并在答案中说明提供缺失的信息并批评给出的问题。没有额外的限制,客观上无法解决问题。 – Olaf