2

私は最近masmアセンブリを学び始めました、ivは見ているだけで私のプログラムの多くを分解しています。__int16(word)を使用すると、その値が最初にeaxにコピーされ、次に変数自体にコピーされることに気付きましたが、int(dword / 32)を使用すると、変数に直接コピーされます。

int y = 5;
0040101E  mov         dword ptr [y],5 

    y += 7;
00401025  mov         eax,dword ptr [y] 
00401028  add         eax,7 
0040102B  mov         dword ptr [y],eax 

    __int16 x = 3;
0040102E  mov         eax,3 
00401033  mov         word ptr [x],ax 

    x += 6;
00401037  movsx       eax,word ptr [x] 
0040103B  add         eax,6 
0040103E  mov         word ptr [x],ax 

__int16のサイズが16...eaxの半分のサイズであることに気付きました。これが最初にeaxに入れられ、次にaxだけがxに入れられる理由ですか?

また、どちらが最速ですか?

おすすめの良いmasmサイトはありますか?

ご入力いただきありがとうございます

4

3 に答える 3

1

CPUアーキテクチャに一致するワードサイズは常に最速です。それ以外のものは、すべての操作で前後に変換する必要があります。

TLDR:特別な理由がない限り、を使用してintください。

于 2010-11-20T17:51:15.670 に答える
1

命令がである場合、実際に同じ結果が得られますが、マシンコードが短く、この特定のケースでは効果が同じであるためmov ax,3、コンパイラはおそらく選択します。CPUに16ビット操作であることを通知する追加のプレフィックスバイトがあります。(2つの命令のエンコーディングはそれ以外は同じです。)mov eax,3mov ax,3

Visual C ++を使用している場合は、逆アセンブリウィンドウでマシンコードバイトの表示をオンにして、各命令の大きさを確認できます。

ある時点では、16ビット命令(より正確には、現在のCPUモードの「その他」のワードサイズを使用する命令)の効率は低下していました。これはもう当てはまるかもしれないし、そうでないかもしれない、私にはわからない。(私の推測では、これの影響を一般的に見つけるのはかなり難しいでしょう、そしてあなたはそれを明らかにするいくつかのコードスニペットを考案しなければならないでしょう。)

于 2010-11-20T18:17:04.620 に答える
0

特にわからないので、これを作り上げています。

しかし、最近のプロセッサでは、eaxを使用する方が、小さいaxレジスタを使用するよりも効率的であるようです。

(最初の割り当てで)最初にeaxに移動することにより、CPUは定数を32ビットレジスタに符号拡張します。

彼のコンパイラーがすべての計算を32ビットで実行し(レジスターを操作)、残りの部分(つまりax)を透過的に提供する可能性もあります。

それは私にはそれがどのように見えるかです。

于 2010-11-20T17:54:57.570 に答える