2011-07-11 7 views
8

私は、Linuxカーネルのヘッ​​ダーファイルの1つであるarch/x86/include/asm/nops.hのコメントで少し混乱しています。それは、代わりに
MOVL%ESI 64ビットモード使用K8またはP6のNOPのために、x86-64ではmov%esi、%esiはno-opですか、notですか?

<が...>次の命令は64ビットモードでのNOPされていないと述べている%ESI
レアルは0x00( %ESI)、%ESI
< ...>

私は著者がそれぞれのマシン命令('89 F6' と '8D 76 00' を、暗黙の推測)がなく、アセンブリ命令。インテル・ソフトウェア・デベロッパーズ・マニュアルVol2Aの LEAの記述から、後者の命令( lea 0x00(%rsi), %esi)は前者のものと同じであることがわかります。 mov %esi,%esi

これで、mov %esi,%esiが実際にはx86-64で動作していないかどうかが問われます。

movフラグは変更されません。この種のmovは、メモリの変更はありません。もしそれが%ripのほかに何か変わったら、それは汎用レジスタでなければなりません。しかし、私はそれがどのように%rsiの内容を変更することができるか、または何かを手掛かりがありません。汎用レジスタの下半分を操作する場合、上半分は変更しないでください。

答えて

15
mov %esi, %esi 

%rsiの上位32ビットがゼロであるため、x86_64ではノーオペレーションではありません。

+3

あなたのアセンブリの男として見て、これはあなたの486番目の答えです、これは今あなたが質問に答えるのを止めるでしょうか? (申し訳ありませんが、486の冗談... 486DX2を覚えています...私は486DX2を覚えています...そして今は完全にトピックです) – Steve

+2

答えに追加するだけで、インテルの開発者マニュアルの関連セクションは3.4.1.1です(Volume 1) 。 –

+4

@スティーブ:私がアセンブリを書いた最初のプラットフォームは68kだったので、私はそれを掛ける前にしばらく時間があると思う。 –

6
#include <stdio.h> 

int main(int argc, char * argv[]) 
{ 
    void * reg_rsi = 0; 

    asm (
     "movq $0x1234567812345678, %%rsi;\n" 
     "movl %%esi, %%esi;\n" 
     "movq %%rsi, %0;\n" 
     : "=r" (reg_rsi) 
     : /* no inputs */ 
     : /* no clobbered */ 
    ); 

    printf("reg_rsi = %p\n", reg_rsi); 

    return 0; 
} 

これは、私のx86_64マシンでは "reg_rsi = 0x12345678"となります。

+1

あなたは正しい。これは 'rax'と' eax'にも当てはまる。しかし、 'movl'を' xor'に入れ替えれば、64ビット全体がゼロになります。 – Orwellophile

関連する問題