gpt4 book ai didi

assembly - 汇编程序段指令的用途是什么?

转载 作者:行者123 更新时间:2023-12-02 07:18:09 24 4
gpt4 key购买 nike

我正在尝试学习 ARM 汇编。

在编写这个小小的 Hello World 程序之后:

                .global _start

.text
_start: ldr R1,=msgtxt
mov R2,#13
mov R0,#1
mov R7,#4
svc 0

mov R7,#1
svc 0


.data
msgtxt: .ascii "Hello World!\n"

.end

我注意到我可以删除 .text 和 .data 指令,该程序也能正常工作。

因此,我很好奇:我阅读的所有内容都强调了这样一个事实,即 .text 部分用于代码,而 .data 用于数据。但在这里,在我的眼前,他们似乎什么都不做!

因此,如果它们不分别用于保存代码和数据,它们的真正目的是什么?

最佳答案

这些类型的指令取决于您构建程序的架构,它们选择将哪个内存部分分配给后面的任何代码或数据。最后,一切都只是一串字节。汇编程序后,符号/标签将根据它们所在的部分分配不同的内存地址。
.text通常分配在只读内存部分,最适合不希望更改的代码。
.data通常是内存的可写部分。我相信把你的字符串放在 .text 中是很常见的。如果预计不会更改,则紧邻您的代码数据(或者架构可能具有类似的只读段)。我会说.data大多数时候甚至会避免部分。为什么?因为.data部分需要初始化——在程序启动时从程序二进制文件复制到内存中。您的程序引用的大多数数据都可以是只读的,并且它们操作所需的任何内存通常只用 .bss 分配。段,它分配一段未初始化的内存。

在同一段中混合代码和数据有一些优点,例如可以轻松访问与 PC 寄存器(正在执行的代码的地址)相对偏移的数据地址。当然也有缺点,如果你试图修改只读内存,你最终至少会忽略你的操作,并且程序可能会触发异常并崩溃。所有非常特定于架构的,最安全的办法是将代码保存在用于代码的段中,并将数据/分配保存在用于数据的段中。

这完全取决于您的程序的目标。例如,Game Boy Advance 有一个 256KB 的“慢”内存区域,一个 32KB 的“快”内存区域,然后是只读的“ROM”区域(游戏卡带数据),它可以是几兆字节,汇编程序使用这些内存部分:

.data or .iwram  -> Internal RAM (32KB)
.bss -> Internal RAM uninitialized
.ewram -> External RAM (256KB)
.sbss -> External RAM uninitialized
.text or .rodata -> Read only ROM (cartridge size)

再举一个例子,SPC-700(SNES 声音芯片)有 64KB 的可读和可写内存,用于所有内容,但它的前 256 个字节具有更快的访问速度(“零页”)。在这个理论案例中, .data.text将被分配到相同的内存区域——也就是说,它们不会被分配在零页中,并且它们都共享相同的内存。零页会有一个自定义段, .text之间的区别和 .data将非常少 - 只是一种区分组装程序中哪些符号指向“数据”以及哪些符号指向程序代码的方法。

关于assembly - 汇编程序段指令的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55107587/

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