Отличие памяти от константы в GNU как.intel_syntax
У меня есть инструкция, написанная в синтаксисе Intel (с использованием газа в качестве моего ассемблера), которая выглядит следующим образом:
mov rdx, msg_size
...
msg: .ascii "Hello, world!\n"
.set msg_size, . - msg
но эта инструкция MOV собирается в mov 0xe,%rdx
, скорее, чем mov $0xe,%rdx
, как я и ожидал. Как мне написать первую инструкцию (или определение msg_size
) чтобы получить ожидаемое поведение?
1 ответ
В газ .intel_syntax noprefix
Режим:
OFFSET symbol
работает как AT&T$symbol
, Это немного похоже на MASM.symbol
работает как AT&Tsymbol
(т.е. разыменование).[symbol]
всегда эффективный адрес, а не немедленный, в GAS и NASM/YASM.LEA
не загружается с адреса, но все еще использует машинное кодирование с операндом памяти. (Вот почему он использует тот же синтаксис).
Совет: если вы знаете синтаксис AT&T или синтаксис NASM для чего-то, используйте его для создания нужной кодировки, а затем разберите с помощью objdump -Mintel
чтобы найти правильный синтаксис для .intel_syntax noprefx
,
Кстати, ни один проект с открытым исходным кодом, о котором я знаю, не содержит исходный код GAS intel_syntax. Если они используют газ, они используют синтаксис AT&T. В противном случае они используют NASM/YASM. (Иногда вы также видите встроенный ассемблер MSVC в проектах с открытым исходным кодом).
GNU as .intel_syntax noprefix
Режим похож на MASM, за исключением того, что нет волшебства, которое зависит от того, как определены символы.
mov rdx, symbol
всегда груз. Значение символа - это его адрес. то есть используя .set
создает (или модифицирует) символ, который ведет себя точно так же, как и метка на чем-либо.
mov rdx, OFFSET symbol
будет собираться в mov r/m64, imm32
, Я забыл, если режим Intel-синтаксиса позволяет собирать movabs r64, imm64
с большими операндами, но это не имеет значения, потому что статические адреса данных / кода всегда находятся в низком 2 ГБ виртуального адресного пространства, поэтому они вписываются в 32-битные непосредственные расширения с добавлением знака. (Это позволяет писать безопасно mov edx, OFFSET symbol
).