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

3

我在某个地方看到了 gs:lodsq 命令。从我所理解的来看,似乎没有这样的汇编命令,lodsb/w/q 应该是单独一行。

我在互联网上搜索并查找了指令集,但没有找到解释。那么我的问题是,这是什么意思?


@rcgldr 不是默认的段寄存器是 ds 吗?ss 是堆栈段。 - jgh fun-run
1
@jghfun-run - 正确的,缺省是ds。在某些系统中,gs用于访问每个线程变量。 - rcgldr
@rcgldr 好的,很酷。 - jgh fun-run
1个回答

4
几乎可以确定这是使用GS段覆盖前缀的lodsq指令,将隐式源操作数从RSI(或DS:RSI)覆盖为GS:RSI
它与AT&T语法mov %gs:(%rsi), %rax/add $8, %rsi或NASM语法mov rax, [gs:rsi]/add rsi,8执行相同的操作。(根据方向标志而定,也有可能是sub。)但不像LEA那样破坏标志位。
(在32位模式下,隐式源操作数默认为ds:esi,但在64位模式下,DS段基址固定为0,因此Intel在lods的官方文档中仅将其描述为RSI
顺便说一句,在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反汇编它的方法。


谢谢。但是为什么当我尝试编译它时,编译器没有理解呢? - שמואל ביאליסטוקי
@שמואלביאליסטוקי:你在哪里找到这行源代码的?它可能是MASM语法,也可能是FASM。它不是NASM或AT&T。 - Peter Cordes
我尝试使用的编译器是masm。我看到你编辑了答案,所以它解释了那个。非常感谢。 - שמואל ביאליסטוקי
1
@שמואלביאליסטוקי 噢,MASM也不接受它吗?你在哪里找到的?也许有人手写了一个例子但没有测试,语法出错了。或者它是用其他语法编写的。 - Peter Cordes
是的。它确实可能像你说的那样。 - שמואל ביאליסטוקי
1
我怀疑这是特定反汇编器(可能是IDA Pro)的表示方式。在MASM中,您可以使用类似于“lodsq gs:[rsi]”的内容对字符串指令进行段覆盖。 - Michael Petch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接