Проблемы с 32-битной адресацией в NASM

Я начал изучать сборку и столкнулся с проблемами, связанными с 32-битным абсолютным адресом. Я недавно прочитал сообщение об этой аналогичной проблеме Почему возникают проблемы с абсолютной адресацией?. Можете ли вы спросить, почему, если я укажу без записи default rel, я получаю ошибку, связанную с тем, что базовый адрес исполняемого файла в Mac OS начинается с 4 ГБ.

mov qword[test], ‘hello’

Подводя итог всему, проблема в том, почему mov qword[test], ‘hello’ адресация 32-битная? И если я перед mov qword[test], ‘hello’ укажу это REX.W, это не поможет мне решить проблему с 32-битной адресацией?

Спасибо


person Ruslan    schedule 20.06.2021    source источник
comment
это 32 бита, потому что кодировка инструкций поддерживает только 32 бита для адреса. Относительная адресация использует rip+offset (также 32 бит). Вы можете указать nasm с помощью ключевого слова rel или default rel, если хотите относительного. Обратите внимание, что qword [test] относится к размеру операции, а не к размеру адреса.   -  person Jester    schedule 20.06.2021
comment
Насколько я понимаю, если я хочу обратиться к адресу, расположенному выше 32-битного адреса, я могу сделать это только через смещение от RIP?   -  person Ruslan    schedule 20.06.2021
comment
Да или косвенно.   -  person Jester    schedule 20.06.2021
comment
Потому что единственные способы кодирования - это [disp32] или [rip+rel32]. См. Ссылка на содержимое ячейки памяти. (режимы адресации x86). Мой ответ на Почему глобальные переменные в x86-64 обращаются относительно указателя инструкции? включает объяснение того, как RIP-relative работает в Машинный код.   -  person Peter Cordes    schedule 20.06.2021
comment
Почему возникла проблема? Потому что MacOS отображает исполняемые файлы за пределами адресного пространства размером 4 ГБ. (Возможно, как способ убедиться, что усечение указателей до 32-битных всегда дает сбой, а не доступ к какой-либо другой памяти.)   -  person Peter Cordes    schedule 20.06.2021