, чтобы сохранить набор текста и принять на себя риск, который человек может использовать
ldr r3,=sum
ldr r3,[r3]
, как указано в другом примере, ассемблер создаст в машинном коде эквивалент того, что человек мог набрать без адреса = трюк
ldr r3,address_of_sum (without the =)
ldr r3,[r3]
...
address_of_sum: .word sum
и этот первый ldr (не псевдо, поскольку он переводит непосредственно в известную инструкцию, один к одному) - это относительная нагрузка ap c (при условии, что она может достигать).
Оба эти параметра указаны спецификацией ассемблера c, поскольку язык ассемблера определяется ассемблером, а не целью.
Ярлык = addresss не поддерживается всеми ассемблерами arm и должен использоваться с осторожностью при определенных значениях оно не превращается в слово в пуле с относительной нагрузкой ap c.
для вопросов, подобных этому, сначала изучите разборку, в большинстве случаев ответьте на ваш вопрос, еще лучше сначала изучите разборку под вопросом сборка. сборка, сгенерированная компилятором, не так проста для чтения и отслеживания, как разборка, особенно если она связана. Также легче учиться на оптимизированном коде, чем на неоптимизированном, так как большая часть кода - это переменная стека (или в данном случае глобальная).
ldr r3,=0x1000
ldr r3,=0x1234
b .
00000000 <.text>:
0: e3a03a01 mov r3, #4096 ; 0x1000
4: e51f3000 ldr r3, [pc, #-0] ; c <.text+0xc>
8: eafffffe b 8 <.text+0x8>
c: 00001234 andeq r1, r0, r4, lsr r2
в одном случае, когда он может генерировать mov, где он не может, то он выделяет из пула и помещает туда значение, тогда делает относительную нагрузку ap c. Теперь да, когда вы читаете вывод таким образом, вам нужно видеть / понимать / игнорировать разборку andeq, эту строку мы смотрим на значение 0x00001234 и видим сгенерированную инструкцию.
Вы не всегда должны предполагать, что трюк = address работать, если вы решите попробовать различные инструменты, теперь он работает для gnu, если он может найти пул, если он не может, тогда вам нужно либо просто набрать текст самостоятельно, либо добавить .pool или любой другой псевдокод, который делает то же самое для помогите ассемблеру найти место для этого значения по мере необходимости.
Я бы ожидал, что ассемблер всегда будет помещать это (= адрес) в пул для внешней ссылки, но технически возможно, чтобы цепочка инструментов поместила заполнитель там и пусть компоновщик заполнит его либо mov, либо добавит соседний элемент и поместит туда значение, как binutils, с bl для внешней ссылки.
gas:
ldr r3,=sum
b .
00000000 <.text>:
0: e51f3000 ldr r3, [pc, #-0] ; 8 <.text+0x8>
4: eafffffe b 4 <.text+0x4>
8: 00000000 andeq r0, r0, r0
компоновщик заполнит адрес позже, как при выводе вашего компилятора. теперь разборка -0 очень интересная, почти забавная.