我在某处看到命令gs:lodsq
。现在,据我了解,没有这样的汇编命令,命令lodsb/w/q
应该单独存在。
我在互联网上搜索并查看了说明集,但没有找到解释。所以我的问题是,这是什么意思?
答案 0 :(得分:3)
几乎可以肯定,lodsq
的前缀是GS segment-override ,将隐式源从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
在the official docs for 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语法,或者是不太流行的汇编器,或者是有人在网页上写了这个而没有实际尝试却弄错了语法。
带有GS前缀的lodsq
的语法因汇编程序而异:
带有AT&T或.intel_syntax noprefix
的GAS: 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
就是这样分解的。