2017-01-17 27 views
1

GASMで次の構文は何ですか?アセンブラで*%gs:0x10は何をしますか?

*%gs:0x10 

私はcall *%gs:0x10呼び出しが__kernel_vsyscallますが、私は*%register:valueか分からないことを知っています。 call DWORD PTR gs:0x10

+1

は 'call gs:0x10'、' gs:0x10'はメモリオペランドです。 'gs:0x10'はジャンプするアドレスが格納されているアドレスです。これは絶対アドレスへのメモリ間接呼び出しです。 _GS_は、メモリ参照を行うセグメントセレクタです。 –

答えて

2

それはgs:0x10内のポインタのターゲットにnear absolute indirect (FF /2)呼び出します:

それはNASMと同等だが、このようになります。
gsはセレクタ・レジスタであり、汎用レジスタではありません(Protected mode参照)。
命令はオフセット0x10(セグメントgsからの相対値)でDWORDを読み取り、その値を呼び出します。
ダイレクトコールには、コールゲートを含む可能性がある別の影響があります。


gs:0x10

ここlibc copies the address of __kernel_vsyscall during its initialization.

AT&T syntax for the control transfer instructionsあるレジスタまたはメモリのオペランドを使用してアドレッシング

ブランチが '*' を前置しなければならないです。 「遠い」コントロールtranfersを指定するために、「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 
+0

ありがとう、私はそれが分かっていることを理解しています。 x64システムで '' '__kernel_vsyscall'''を呼び出す方法を知っていますか? x64の '' '' call *%gs:0x10'''に相当するものは何ですか? – user7428910

+0

@ user7428910 x64では簡単ですが、 'syscall'命令を使用してください。より有益なガイドは[こちら](https://filippo.io/linux-syscall-table/) –

+0

ええ、私はそれを知っています。 syscallはx64では普通の方法ですが、__kernel_vsyscall、純粋な好奇心を使用することに興味があります – user7428910

関連する問題