当你尝试它时发生了什么?
当我尝试它时:
int num = 0;
int mun;
有了gnu,我得到了
.cpu arm7tdmi
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 1
.eabi_attribute 30, 2
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "so.c"
.text
.comm mun,4,4
.global num
.bss
.align 2
.type num, %object
.size num, 4
num:
.space 4
.ident "GCC: (GNU) 8.3.0"
.comm 符号,长度
.comm 声明了一个名为 symbol 的通用符号。链接时,一个对象文件中的公共符号可能与另一个对象文件中已定义或同名的公共符号合并。如果 ld 没有看到符号的定义——只有一个或多个常见符号——那么它将分配长度字节的未初始化内存。长度必须是绝对表达式。如果 ld 看到多个具有相同名称的通用符号,并且它们的大小不同,它将使用最大的大小分配空间。
使用 ELF 时,.comm 指令采用可选的第三个参数。这是符号的所需对齐方式,指定为字节边界(例如,16 对齐意味着地址的最低有效 4 位应为零)。对齐必须是绝对表达式,并且必须是 2 的幂。如果 ld 为公共符号分配未初始化的内存,它将在放置符号时使用对齐方式。如果未指定对齐方式,as 会将对齐方式设置为小于或等于符号大小的 2 的最大幂,最大为 16。
.comm 的语法在 HPPA 上略有不同。语法是`symbol .comm, length';符号是可选的。
汇编语言是由汇编器而不是目标定义的。所以答案将是汇编器(读取和汇编汇编语言程序的工具)特定的,没有理由假设一个汇编器的答案与另一个相同。以上是gnu汇编器,gas。
您本可以查看您引用的文档或阅读其他 gnu 文档,但回答“在已编译程序中执行此操作时会发生什么”的最简单方法是编译它并查看编译器输出。
但不一定假设它没有被初始化:
unsigned int num;
unsigned int fun ( void )
{
return(num);
}
足以链接它:
Disassembly of section .text:
00001000 <fun>:
1000: e59f3004 ldr r3, [pc, #4] ; 100c <fun+0xc>
1004: e5930000 ldr r0, [r3]
1008: e12fff1e bx lr
100c: 00002000 andeq r2, r0, r0
Disassembly of section .bss:
00002000 <__bss_start>:
2000: 00000000
它最终以 bss 初始化。
您真的想要对某些东西进行未初始化的访问,然后只需选择一个地址(您知道未初始化(sram))并访问它:
ldr r0,=0x1234
ldr r0,[r0]