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

Започнах да уча асемблиране и се сблъсках с проблеми, свързани с 32-битов абсолютен адрес. Наскоро прочетох публикация за този подобен проблем Защо има проблеми с абсолютното адресиране?. Можете ли да ми кажете защо, ако посоча без да пиша default rel, получавам грешка, свързана с този изпълним базов адрес в mac os стартира 4 GB.

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 картографира изпълними файлове извън ниските 4GiB адресно пространство. (Може би като начин да се уверите, че отрязването на указатели към 32-битови винаги дава грешка, а не осъществява достъп до друга памет.)   -  person Peter Cordes    schedule 20.06.2021