Отличие памяти от константы в 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&T symbol (т.е. разыменование).
  • [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).

Другие вопросы по тегам