我在某个地方看到了 gs:lodsq
命令。从我所理解的来看,似乎没有这样的汇编命令,lodsb/w/q
应该是单独一行。
我在互联网上搜索并查找了指令集,但没有找到解释。那么我的问题是,这是什么意思?
RSI
(或DS:RSI
)覆盖为GS:RSI
。mov %gs:(%rsi), %rax
/add $8, %rsi
或NASM语法mov rax, [gs:rsi]
/add rsi,8
执行相同的操作。(根据方向标志而定,也有可能是sub
。)但不像LEA那样破坏标志位。ds:esi
,但在64位模式下,DS段基址固定为0
,因此Intel在lods的官方文档中仅将其描述为RSI
)
gs:lodsq
解析为gs:
作为标签名称,而lodsq
只是指令。0000000000000000 <gs>:
0: 48 ad lods rax,QWORD PTR ds:[rsi]
# 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
反汇编它的方法。
ds
吗?ss
是堆栈段。 - jgh fun-run