インラインアセンブリに関して。
基本的なことかもしれませんが私にはさっぱり理解できないのでおねがいします
1
__asm__ ( アセンブリテンプレート : 出力オペランド /* オプション */ : 入力オペランド /* オプション */ : 破壊されるレジスタのリスト /* オプション */ );
インラインアセンブリは上記の要素から構成されているようです。
また、関数と違い 何も指定しない場合レジスタの値を勝手に保存してくれないので
レジスタを破壊したまま__asm__から抜け出すとまずいようです。
int型変数sampleにEBXレジスタの値をコピーする処理を作りました。(間違ってたら教えてください)
int sample; __asm__( "MOV %%EBX,%0\n\t" :"=a" (sample) : );
出力オペランドで EAXレジスタの値を変数sampleに出力するように指定しているので
MOV %%EBX,%0
これは
MOV %%EBX,%%EAX
となり、EBXの値がコピーされたEAXの内容がsampleに出力されるのでしょうか?
また、この場合eaxレジスタが破壊されるので
: 破壊されるレジスタのリスト にeaxを追加するべきですか?
2
つぎは"マッチング制約"と呼ばれているものについて
リンク内容
int in_out=100,in2=200; __asm__ ( "addl %2,%0;" :"=a"(in_out) /* eaxの値をin_out出力 */ :"0"(in_out),"b"(in2) /* in_outの値を出力オペランドで割り当てたレジスタ(eax)に入力値としてセット */ );
"0"は 出力オペランド "=a"(in_out) (つまり、%0 ?)を指しており
eaxに入力値としてin_outの値がセットされると書かれています。
・・・どういうことなのでしょうか?
:"=a"(in_out)
:"a"(in_out)
これとは違うのですか?
また、上記で書いたプログラムで言うと
__asm__が始まった時点でeaxにin_outの値がコピーされているのでしょうか?
3
制約修飾子"&"
説明には・・・
このオペランドが早期破壊 オペランドであることを意味する。早期破壊オペランドとは、 命令が入力オペランドを使い終わる前に変更されるオペランドである。 このため、このオペランドは、入力オペランドや任意のメモリアドレスの一部 として使われるレジスタには置かれない。
入力オペランドを使い終わる前に変更されるとは 例えばどういうことでしょうか?
4
:"i" ((short) (0x8000+(dpl<<13)+(type<<8)))
これはset_idtの一部ですが
制約文字 "i"の説明では・・・
整数の即値オペランド(定数値のもの)が許される。これには、値がアセンブル時にならないとわからないシンボリックな定数も含まれる。
とのことです。
上記の例で言えば 定数が0x8000。
では
シンボリックな定数とはどういうことですか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/11 10:43
2020/11/11 11:18
2020/11/11 11:58
2020/11/11 12:16
2020/11/11 12:25