Синтаксис команды сборки lodsb: что означает gs:?

Где-то видел команду gs:lodsq. Теперь, насколько я понимаю, такой команды сборки нет, команда lodsb/w/q должна быть одна в своей строке.

Я поискал в Интернете и просмотрел инструкции, но не нашел объяснений. Итак, мой вопрос: что это значит?

gs: - это префикс для переопределения селектора по умолчанию ss :. В зависимости от операционной системы это может быть доступ к данным из так называемой области данных потока.

rcgldr 26.10.2018 06:51
2
1
498
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почти наверняка это lodsq с префиксом отмены сегмента GS., заменяющий неявный источник с RSI (или DS:RSI) на GS:RSI.

Он выполняет то же самое, что и синтаксис AT&T mov %gs:(%rsi), %rax / add $8, %rsi или синтаксис NASM mov rax, [gs:rsi] / add rsi,8. (Или суб в зависимости от флага направления). Но без затирающих флагов, как у LEA.

(В 32-битном режиме неявным источником по умолчанию является ds:esi, но в 64-битном режиме база сегмента DS зафиксирована на 0, поэтому Intel описывает его только как RSI в официальная документация для lods)


Кстати, в синтаксисе AT&T gs:lodsq разбирается как gs: как имя метки, а lodsq просто инструкция.

0000000000000000 <gs>:
   0:   48 ad                   lods   rax,QWORD PTR ds:[rsi]

В синтаксисе NASM и YASM, и NASM рассматривают это как ошибку.

# from yasm -felf64 foo.asm
foo.asm:1: error: junk at end of line, first unrecognized character is `:'

OP пробовал использовать MASM, и там тоже есть ошибка.

Так что, возможно, это синтаксис FASM, или менее популярный ассемблер, или, может быть, кто-то написал это на веб-странице, фактически не пробуя его, и ошибся в синтаксисе.


Синтаксис lodsq с префиксом GS зависит от ассемблера:

GAS с AT&T или .intel_syntax noprefix: gs lodsq, а objdump -d разбирает его как:

65 48 ad                lods   rax,QWORD PTR gs:[rsi]   # -Mintel
65 48 ad                lods   %gs:(%rsi),%rax          # -Matt

NASM: также gs lodsq. Вот так его разбирает ndisasm.

Спасибо. Но почему, когда я пытался его скомпилировать, компилятор этого не понял?

שמואל ביאליסטוקי 26.10.2018 06:56

@ שמואלביאליסטוקי: где вы нашли эту исходную строку? Это может быть синтаксис MASM или, может быть, FASM. Это не NASM или AT&T.

Peter Cordes 26.10.2018 06:59

Компилятор, с которым я пытался скомпилировать, был masm. Я видел, что вы отредактировали ответ, чтобы он объяснил это. Большое спасибо.

שמואל ביאליסטוקי 26.10.2018 07:00

@ שמואלביאליסטוקי Ой, разве MASM не принимает его? Где ты нашел это? Может быть, кто-то написал это от руки в качестве примера без тестирования и ошибся в синтаксисе. Или это в каком-то другом синтаксисе.

Peter Cordes 26.10.2018 07:08

Ага. Это действительно могло быть так, как вы говорите.

שמואל ביאליסטוקי 26.10.2018 07:11

Я подозреваю, что именно так это представляет конкретный дизассемблер (вероятно, IDA Pro). В MASM вы выполняете переопределение сегмента в строковых инструкциях с помощью чего-то вроде lodsq gs:[rsi]

Michael Petch 26.10.2018 19:09

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