Озадаченный инструкцией x86 MOV

Из руководства Intel64 и IA-32, том 2a, есть много возможных вариантов использования инструкции mov. Такие как:

mov r64, m64      # move m64 to r64

mov rax, moffs64  # move quadword at (offset) to RAX

Я написал код для тестирования (газ, синтаксис Intel):

movabs rax, label

movabs rax, offset label

...
label:
    .quad 0x112233445566

После сборки, линковки и objdump я получил родственную сборку:

mov rax, qword ptr ds:0xffff80000000008e
mov rax, 0xffff80000000008e

Очевидно, что вторая инструкция, которую я написал, не является инструкцией, ожидаемой как руководство. Какая инструкция по формату в мануале?


person Gary Yin    schedule 22.07.2014    source источник
comment
Ассемблер автоматически выберет одну из этих двух версий, сборка будет такой же. Ваш movabs rax, offset label ни один из двух, это mov r64, imm64. Если вы хотите увидеть первую версию, то есть mov r64, m64, тогда используйте регистр, отличный от rax, например mov rdx, label.   -  person Jester    schedule 22.07.2014


Ответы (1)


moffs обозначает операнд памяти. Вот описание из руководства Intel:

moffs8, moffs16, moffs32, moffs64 - простая переменная памяти (смещение памяти) типа байт, слово или двойное слово, используемая некоторыми вариантами инструкции MOV. Фактический адрес задается простым смещением относительно основания сегмента. В инструкции не используется ModR/M байт. Число, показанное с moffs, указывает его размер, который определяется атрибутом размера адреса инструкции.

Оператор offset, который используется ассемблерами, такими как MASM и TASM, дает вам "смещение в соответствующий сегмент [операнда]" (источник). Итак, что вы получаете с offset label, это смещение label, которое является немедленным значением. Итак, вы смотрите на две разные вещи: получение значения, хранящегося по определенному адресу, а не получение самого адреса.

Я не знаю, каким был бы синтаксис GAS, чтобы получить вариант moffs64, но с NASM вы могли бы написать mov rax,[qword label] (обратите внимание, что эта кодировка будет длиннее, чем если бы вы просто написали mov rax,[label], то есть mov r64, r/m64).

person Michael    schedule 22.07.2014
comment
Синтаксис GAS будет просто movabs label, %rax. Это объединяется в код операции 48 a1, который является единственной mov инструкцией, поддерживающей moffs64. - person ilpelle; 17.02.2016