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

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

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

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

Я хочу загрузить адрес строки в регистр SI. Я знаю, как ссылаться на ячейку памяти в NASM, но когда я делаю то же самое внутри кода GNU Assembler, он перемещает в регистр только СЛОВО строки, а не адрес метки. .

Мой код:

.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 в регистр SI.

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


person TheDome    schedule 27.04.2016    source источник
comment
После того, как я нашел связанный вопрос с ответ Stackoverflow, аналогичный. Этот вопрос можно рассматривать как дублирующий, в зависимости от точки зрения.   -  person Michael Petch    schedule 27.04.2016


Ответы (1)


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

.intel_syntax noprefix

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

mov si, name

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

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, сообщите мне об этом в комментариях. Мне известно о блогах о синтаксисе, а также о некотором презрении, но ничего официального.

person Michael Petch    schedule 27.04.2016
comment
Я не видел проектов с открытым исходным кодом с .intel_syntax исходными файлами. В проектах обычно выбирается либо AT&T-синтаксис, либо NASM или YASM. Однако я не могу вспомнить / вспомнить какие-либо конкретные причины, по которым GNU .intel_syntax менее хорош. например Я не думаю, что в синтаксисе AT&T можно что-то сделать, чего нельзя в intel_syntax, или есть дополнительные двусмысленности. (Обратной стороной для меня является то, что это похоже на синтаксис MASM, в то время как я предпочитаю синтаксис NASM, в котором [] требуется для всех эффективных адресов.) - person Peter Cordes; 27.04.2016
comment
@PeterCordes: Я согласен, и этот синтаксис я не часто вижу - я знаю некоторые двусмысленности, но это определенно одна из областей, в которой мне не хватает личного опыта. Если я использую GAS, я обычно соглашусь на синтаксис AT&T, если я хочу Intel, я буду использовать NASM, YASM и т. Д. быть здесь вариантом использования. представьте мое разочарование, когда я не смог найти канонический источник полного синтаксиса. Чтение исходного кода binutils слишком похоже на работу ;-) - person Michael Petch; 27.04.2016
comment
Да, я ожидал, что это тоже будет где-то официально задокументировано. Однако я не полностью шокирован тем, что это не так. Для меня это формат, предназначенный в основном для чтения, для вывода дизассемблера / компилятора, а не для записи. - person Peter Cordes; 28.04.2016