Lodsb汇编命令语法:GS:是什么意思?

时间:2018-10-26 04:43:30

标签: assembly syntax x86

我在某处看到命令gs:lodsq。现在,据我了解,没有这样的汇编命令,命令lodsb/w/q应该单独存在。

我在互联网上搜索并查看了说明集,但没有找到解释。所以我的问题是,这是什么意思?

1 个答案:

答案 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仅将其描述为RSIthe 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就是这样分解的。