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