2

我有这个 C 程序。

#include<stdio.h>

char arr[65];
int main()
{
    return 0;
}

当我使用以下命令编译它gcc时:linux

gcc -Wall -save-temps arrNewGlobal.c -o arnewGlobal

我得到以下汇编代码。

.file   "arrglobal.c"
.comm   arr,65,32 
.text
.globl  main
.type   main, @function
    .......... 

根据as文档,.comm 分配了大小为 65 的未初始化内存块,对齐为 32 位(这意味着地址将有 5 个最低有效位等于 0)

我不明白的是,这个地址是否意味着这个内存块的起始地址,或者这个内存的每个字节应该有 5 个最低有效位等于 0 的地址(就像每个字节地址都会跳转)

也只是为了确保这个地址不是物理地址,而是一个虚拟地址?

4

2 回答 2

1

.comm 名称、大小、对齐方式

' .comm ' 指令在数据部分分配存储空间。存储由标识符name引用。 大小以字节为单位,必须为正整数。无法预定义名称。 对齐是可选的。如果指定了对齐方式,则名称的地址将对齐到对齐的倍数。

是的,地址是虚拟地址。您的分页机制负责将其映射到物理地址,就像在任何其他情况下一样。

于 2015-12-30T21:42:13.227 回答
0

该代码意味着 65 个字节与 32 个字节/位(4 个字节)对齐(老实说,我不知道),但这绝对不意味着每个字节都应该位于清除 5 个 ls 位的地址。试想一下——这个数组虽然不是一个数组——它在内存中不会是连续的。你说“物理”和“虚拟”地址是什么意思?

于 2012-10-15T11:53:37.527 回答