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

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

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

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

Я хочу загрузить адрес строки в регистр SI. Я знаю, как обращаться к ячейке памяти в 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 в регистр SI.

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

Ответ 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, пожалуйста, дайте мне знать в комментариях. Я знаю блоги о синтаксисе, а также некоторое презрение, но ничего официального.