Используя ".intel_syntax noprefix", как я могу получить адрес памяти метки?

Я учусь создавать программы в реальном режиме, собранные и связанные с:

  • GCC Assembler версия 2.25
  • Binutils версия 2.25
  • GCC версия 5.2.0

Я использую синтаксис Intel без префиксов, указанных с .intel_syntax noprefix

Я хочу загрузить адрес строки в регистр СИ. Я знаю, как обращаться к области памяти в NASM, но когда я делаю то же самое в коде GNU Assembler, он только перемещает WORD строки в регистр, а не адрес метки.

Мой код:

.code16
.intel_syntax noprefix

mov cx, 11
mov si, name
mov di, 0x7E00
push di
rep cmpsb
pop di
je LOAD

Когда я компилирую его с помощью GCC, я вижу в отладчике, что делает процессор:

mov si, WORD ptr ds:0x7d2d

но я хочу, чтобы адрес строки перемещался в регистр, а не данные, на которые он указывает.

Я также попытался заключить квадратные скобки вокруг имени, как это:

.code16
.intel_syntax noprefix

mov cx, 11
mov si, [name]
mov di, 0x7E00
push di
rep cmpsb
pop di
je LOAD

Это не имеет значения.

Из NASM я знаю, что этот ассемблерный код работает:

mov si, name

NASM сгенерирует инструкцию, которая перемещает адрес name в регистр СИ.

Мой вопрос: есть ли способ заставить GCC использовать синтаксис Intel без префикса для загрузки адреса символа в регистр?

1 ответ

Решение

Если вы используете код ассемблера GNU (через GCC) с директивой:

.intel_syntax noprefix

Тогда синтаксис может показаться немного необычным и плохо документированным в канонических источниках. Этот код:

mov si, name

Перемещает 16-битное слово в область памяти, указанную меткой name в СИ. Следующие инструкции делают то же самое, хотя я предпочитаю квадратные скобки [ а также ] потому что цель кода яснее:

mov si, name              
mov si, [name]
mov si, word ptr [name]   # This is the same as two above in long form
                          #     The use of "word ptr" here is similar to MASM

Чтобы получить адрес name и поместите его в реестр, который нужно использовать offset как это:

mov si, offset name

Если у кого-то есть канонический источник, который фактически описывает синтаксис, который можно использовать с .intel_syntax noprefix пожалуйста, дайте мне знать в комментариях. Мне известны блоги о синтаксисе, вместе с некоторым презрением, но ничего официального.

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