Что случилось, когда вы попробовали это?
Когда я попробовал это:
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 символ,length
.comm объявляет общий символ с именем symbol.При связывании общий символ в одном объектном файле может быть объединен с определенным или общим символом с тем же именем в другом объектном файле.Если ld не видит определения для символа - только один или несколько общих символов - тогда он выделит байты длины неинициализированной памяти.длина должна быть абсолютным выражением.Если ld видит несколько общих символов с одним и тем же именем, и они не все имеют одинаковый размер, он выделяет пространство с наибольшим размером.
При использовании ELF директива .comm принимает необязательный третий аргумент.Это желаемое выравнивание символа, заданное в виде границы байта (например, выравнивание 16 означает, что младшие 4 бита адреса должны быть равны нулю).Выравнивание должно быть абсолютным выражением, и оно должно быть степенью двойки.Если ld выделяет неинициализированную память для общего символа, он будет использовать выравнивание при размещении символа.Если выравнивание не указано, то будет установлено выравнивание с наибольшей степенью двойки, меньшей или равной размеру символа, но не более 16.
Синтаксис для .comm немного отличается вHPPA.Синтаксис: символ. Comm, длина;символ необязательный.
Язык ассемблера определяется ассемблером, а не целью.Таким образом, ответ будет определяться ассемблером (инструментом, который читает и собирает программы на языке ассемблера), и нет никаких оснований предполагать, что ответ для одного ассемблера такой же, как у другого.Вышесказанное относится к ассемблеру gnu, газ.
Вы могли посмотреть документацию, на которую вы ссылались, или прочитать другую документацию по 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]