gpt4 book ai didi

c - 程序中的变量是否连续存储在内存中?

转载 作者:行者123 更新时间:2023-11-30 16:57:02 24 4
gpt4 key购买 nike

我指的是下面用 MIPS 汇编语言编写的程序。我已经给不同的指令提供了行号。当我理解这段代码时,我遇到了一个奇怪的问题。第 2 行(la $a0 astringwithoutnullchar)将标签“astringwithoutnullchar”的地址加载到寄存器 $a0 中,当然该地址指的是存储在 RAM 中某处的字符串,末尾没有空终止符。在第 3 行中,进行了系统调用,该系统调用由操作系统子例程处理,该子例程开始打印 RAM 中存储的所有内容,地址由参数寄存器 $a0 指定。现在我得到的输出是:

 Hello1
Hello2

这意味着子例程也打印第二个字符串,并在到达第 5 行第二个字符串末尾存储的空终止符时停止打印。

我从这个输出中推测两个字符串都存储在 RAM 中的连续位置,因为只有这样你才能看到这个输出,如下所示第 2 行存储第一个标签的地址,该标签引用内存位置,系统调用从该地址开始打印,然后递增地址以指向包含第二个字符串的下一个位置,并停止,直到到达空终止符。这是真的无论您在第一个标签“astringwithoutnullchar”之后的“.data”段中声明多少个字符串标签。

现在我的问题:

程序中的变量是否连续存储在 RAM 中,如果不是,则解释输出。我无法从 google 获得答案,也无法在 cs.stackexchange 上发布此问题,因为我指的是下面的 MIPS 代码。不要害怕细节,您可以尽可能详细,但每一步都有解释!。

 .text

1>> li $v0 4
2>> la $a0 astringwithoutnullchar
3>> syscall


.data

4>> astringwithoutnullchar: .ascii "Hello1\n"
5>> astringwithnullchar: .asciiz "Hello2"


OUTPUT: Hello1
Hello2

最佳答案

是的,数据在内存中是连续的。汇编器只是将字节组装到输出中。您可以将标签贴在任何您想要的地方,并根据您的需要使用它们。一切都只是字节。

以下内容相当于您的程序。

# another way to create identical bytes in memory
section .rodata # might as well put constants in read-only memory for efficiency.

str_unterminated:
.byte 'H'
.ascii "ell"
.ascii "o1"
label2:
.byte 10 # \n is ASCII 10

str_terminated: .asciiz "Hello2"

标签对组装到目标文件中的字节顺序没有影响。保证asm中的label:语法元素仅创建标签而不修改文件位置。

这是程序集,您可以在其中控制进入内存的字节。

当您的目标文件链接在一起时,一个部分中的所有内容(如 .text.data.rodata)都会得到保证按照您在 asm 中创建的方式进行布局。可执行文件的文本、数据和 bss 段内各节的相对顺序无法保证,可以通过链接描述文件进行控制。

将多个分别具有 .text、.data 和 .rodata 部分的 .o 文件链接在一起时,所有输入文件中所有 .text 部分的数据将组合在一起,但整个文件来自单个 .o 的 block 保持连续。 链接不会分解节内的字节。

<小时/>

这个问题也被标记为 C,绝对不能保证这样的事情。编译器可以自由地将每个单独的 C 对象放置在任何它想要的地方,以任何顺序。如果您关心顺序/连续性,请使用 structchar[]。 (如果您使用struct,请查阅目标平台的 ABI,以了解结构成员在内存中的排序方式。C 保留定义此实现。)

关于c - 程序中的变量是否连续存储在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39687105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com