Синтаксис команды сборки Lodsb: что означает GS: - PullRequest
0 голосов
/ 26 октября 2018

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

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

1 Ответ

0 голосов
/ 26 октября 2018

Это почти наверняка 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 разбирает его.

...