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