Assembly *%gs:0x10在汇编程序中做什么?

Assembly *%gs:0x10在汇编程序中做什么?,assembly,x86,nasm,reverse-engineering,Assembly,X86,Nasm,Reverse Engineering,以下语法在GASM中起什么作用 *%gs:0x10 我知道call*%gs:0x10call将\uuuu kernel\uvsyscall,但我不知道*%register:value做什么 它的NASM等价物如下所示:调用DWORD PTR gs:0x10它是对gs:0x10中指针目标的调用 请注意,gs是选择器寄存器,而不是通用寄存器(请参阅)。 指令读取偏移量0x10处的DWORD(相对于段gs),并调用其值。 直接呼叫将完全产生另一种影响,可能涉及呼叫门 gs:0x10在哪里 问题是

以下语法在GASM中起什么作用

*%gs:0x10
我知道
call*%gs:0x10
call将
\uuuu kernel\uvsyscall
,但我不知道
*%register:value
做什么

它的NASM等价物如下所示:
调用DWORD PTR gs:0x10
它是对
gs:0x10
中指针目标的调用
请注意,
gs
是选择器寄存器,而不是通用寄存器(请参阅)。
指令读取偏移量0x10处的DWORD(相对于段
gs
),并调用其值。
直接呼叫将完全产生另一种影响,可能涉及呼叫门


gs:0x10
在哪里

问题是

使用寄存器或内存操作数的分支寻址必须以“*”作为前缀。要指定“far”控制传输,必须在“l”前面加前缀,如
ljmp
lcall
等。例如

GAS syntax          NASM syntax
==========          ===========

jmp *100            jmp  near [100]
call *100           call near [100]
jmp *%eax           jmp  near eax
jmp *%ecx           call near ecx
jmp *(%eax)         jmp  near [eax]
call *(%ebx)        call near [ebx]
ljmp *100           jmp  far  [100]
lcall *100          call far  [100]
ljmp *(%eax)        jmp  far  [eax]
lcal *(%ebx)        call far  [ebx]
ret                 retn
lret                retf
lret $0x100         retf 0x100
使用以下格式指定段偏移指针:

jmp $segment, $offset

在调用gs:0x10中,
gs:0x10
是内存操作数
gs:0x10
是存储要跳转到的地址的地址。这是对绝对地址的内存间接调用。GS是段选择器,通过它进行内存引用。谢谢,我知道。您知道如何在x64系统上调用内核vsyscall吗?x64中的
call*%gs:0x10
等效于什么?@user7428910在x64上更容易,请使用指令
syscall
。一个信息更丰富的指南是,是的,我知道。syscall在x64上是正常的方式,但我对使用_kernel_vsyscall感兴趣,purecuriosity@user7428910不会导出
\uuuu kernel\u vsyscall
符号(查看链接的手册页,每个体系结构都有一个特定的部分)。对于compat模式下的32位进程,您可以像在x86上一样执行。好的,我理解。