Инструкция ld [%l7 + my_array], %l7
собрана в 32-битный код операции, который содержит (среди прочего) 13-битное поле для значения my_array
(т.е. адрес массива).Сообщение об ошибке - это компоновщик, сообщающий, что у него проблемы с встраиванием 32-разрядного адреса в 13-разрядное поле ...
Для загрузки 32-разрядного адреса в регистр необходимо использовать две инструкцииа именно sethi
(который устанавливает старшие 22 бита) и or
(чтобы установить младшие 10 битов).Это будет выглядеть так:
sethi %hi(my_array), %l7
or %l7, %lo(my_array), %l7
ld [%l7+12], %l7
, который обращается к четвертому элементу массива.Первые две инструкции могут быть заменены псевдоинструкцией set
:
set my_array, %l7
ld [%l7+12], %l7
, которая выдает тот же машинный код.В любом случае ассемблер создает код операции sethi
с 22-битным полем и код операции or
с 10-битным полем данных и записывает в метаданные объектного файла положения этих кодов операций.Компоновщик, который получает все объектные файлы и решает, куда массив my_array
будет наконец помещен в ОЗУ, заполняет эти поля.Примечание: если вы намереваетесь поместить свой код в общую библиотеку (файл .so
), то все будет сложнее.