質問

私はこのインラインアセンブリコードを理解しようとしています。 _hypercall0 ここ.

asm volatile ("call hypercall_page+%c[offset]" \
        : "=r" (__res) \
        : [offset] "i" (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \
        : "memory", "edi", "esi", "edx", "ecx", "ebx", "eax") 

何についての情報が見つからなくて困っています %c 1行目の意味は。このセクションの最も明白なセクションには情報が見つかりませんでした。 GCCマニュアル, を説明します。 %[name], 、 だがしかし %c[name]. 。他に見るべき場所はありますか?

役に立ちましたか?

解決

  

`%C 」置き換えるために使用することができます   一定値であるオペランド   通常の構文なし   即値オペランドを示します。

他のヒント

アセンブリ出力を確認します ( gcc -S, 、またはオブジェクト ファイルを逆アセンブルすると、より明確になる可能性があります。

私の推測では、それは 絶え間ない. hypercall_page それぞれがシステムコールを実行する命令の表のように見えます。おそらくこれにより、 call hypercall_page + {constant based on the expression given}, 、基本的にコンパイル時にこのオフセットのアドレスを計算します。

余談ですが、これは __HYPERVISOR##name 本当に思い出させてくれるのは __NR_name_of_syscall Linux の <asm/unistd.h> などの syscall で見られる型規則。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top