В качестве конкретного примера, на ГАЗ 2.24, перемещая адрес:Когда лучше для ассемблера использовать расширенное перемещение знака, например R_X86_64_32S, вместо нулевого расширения, такого как R_X86_64_32?
mov $s, %eax
s:
После:
as --64 -o a.o a.S
objdump -Sr a.o
использует нулевое расширение:
0000000000000000 <s-0x5>:
0: b8 00 00 00 00 mov $0x0,%eax
1: R_X86_64_32 .text+0x5
Но доступ к памяти:
mov s, %eax
s:
компилирует подписать расширение:
0000000000000000 <s-0x7>:
0: 8b 04 25 00 00 00 00 mov 0x0,%eax
3: R_X86_64_32S .text+0x7
Есть ли обоснование для использования либо в данном конкретном случае, или вообще? Я не понимаю, как ассемблер мог лучше предположить, что в любом случае.
NASM 2.10.09 только использует R_X86_64_32
для обоих вышеперечисленных. Обновление: край nasm совершает 6377180 после того, как 2.11 производит тот же выход газа, который казался ошибкой, как сказал Росс.
Я объяснил, что я думаю, что я понимаю, о R_X86_64_32S
на: https://stackoverflow.com/a/33289761/895245
Может быть, это просто видно, что значение мало (особенно ноль!), Но не важно оптимизировать адресные нагрузки? –
@BoPersson, как он может знать, будут ли адреса мал (здесь 5) после ссылки? Если я использую скрипт компоновщика с '. = 0xFFFFFFFF80000000; 'как в этом примере http://stackoverflow.com/a/33289761/895245 он разбивается на' _32', но не '_32S'. –