Yko*_*ast 2 assembly arm gnu-assembler
我正在尝试学习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
Run Code Online (Sandbox Code Playgroud)
我注意到我可以删除.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)
Run Code Online (Sandbox Code Playgroud)
再举一个例子,SPC-700(SNES声音芯片)具有64KB的可读写存储器,用于所有内容,但是其中的前256个字节具有更快的访问速度(“零页”)。在这种情况下,理论,.data以及.text将被分配到同一个存储区域-也就是说,他们不会在零页分配,他们都共享相同的存储。有将是零页面自定义段,之间的差异.text,并.data会非常小-只是一个辨别的方式在组装程序点符号,以“数据”和符号指向的程序代码。
GAS(像大多数汇编器一样)默认为该.text部分,并且您的只读数据仍然可以在.text
您可以将echo 'mov r1, #2' > foo.s 其汇编+链接到 ARM 二进制文件中(
gcc -nostdlib -static foo.s例如)。您可以在 GDB 中单步执行该指令。
(如果没有sys_exit系统调用,您的程序将在此之后崩溃,但是当然您也可以在没有任何指令的情况下执行此操作。)
链接器将警告它没有找到_start符号(因为您遗漏了标签本身,更不用说告诉.globl汇编器使其在目标文件的符号表中可见的指令了。
但 GNU binutilsld的默认设置是使用节的开头.text作为 ELF 入口点。
默认情况下,除此之外的大多数部分都.text不会链接到可执行内存中,因此通常会_start:出现.data问题。
只读数据通常应该放在该.rodata部分中,无论如何,该部分都作为 TEXT 段的一部分链接。因此,就运行时行为而言,将其放在该.text 部分的末尾(通过省略.data)几乎完全等同于您应该做的事情。
将其放入.data会导致链接器将其放入不同的段中,告诉操作系统的 ELF 程序加载器将其映射为读+写(而不是执行)。
.rodata分开一个部分的目的.text是将代码和数据组合在一起。 许多 CPU 具有分离的 L1d 和 L1i 缓存,和/或用于数据/指令的单独的 TLB,因此只读数据与代码的细粒度混合会浪费分离缓存中的空间。
就您而言,您没有链接也包含一些代码和一些数据的任何其他文件,因此没有区别。
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |