2016-12-31 17 views

答えて

0

を使用して、以下の組立作業を書き換えることができます方法はあります。ただ、eaxをゼロにし、その後ax設定:

XOR EAX, EAX 
MOV AX, [short_temp] 

あなたがhere言ったよう[EAX]から単語を取得したい場合は、単に事前にいくつかの他のレジスタへのアドレスを格納します。

MOV EBX, EAX 
XOR EAX, EAX 
MOV AX, [short_temp] 

や、場合にそれができない、ANDを使用して@fuz proposedのようにしてくださいとEAXの上位16ビットをクリア:

MOV AX, [EAX] 
AND EAX, FFFFh 
+0

@Downvoterこれについて何が間違っていますか? – Downvoter

+1

私はあなたにdownvotedしていませんが、これは 'XOR'命令も使用するのでOPの要件を満たしていません。 – fuz

+0

どうすれば 'movzx \t eax、WORD [eax]' –

4

movzxを避ける必要はありません。 EAXのような32ビットレジスタが利用可能な場合、コードは386以降で実行されているので、movzxもサポートされています。

Intel CPUでこれを行うのが最も効率的な方法です。 movzx r32, [memory]は、ALU操作なしで、ロード・uopにデコードします。待ち時間は通常の負荷(IIRC)と同じなので、ゼロ拡張は負荷ユニットによって自由に行われます。

AMD BulldozerファミリのCPUの場合、movzxは常にALUポート(メモリオペランドの場合はロードポート)を使用するため、ワードロードを使用する前に理論的にはEAXをxor-zeroより高速にすることができます(@ Downvoterの答え)。これにより、コードサイズが大きくなり、フロントエンドがデコードするためのm-opsが増えるという代償を払って、負荷使用のレイテンシを1サイクル低くすることができます。

部分的なレジスタ書き込み(AX)の後にEAXを読み込むため、また別のサイクルのレイテンシを追加する別個のALU操作であるため、AXへのワードロードを実行してからand eax, 0xFFFFのようなその他の提案が明らかに悪いです。 (xor-zeroing avoids the partial-register penalty、Intel P6ファミリのCPUでも)

関連する問題