2016-10-25 3 views
0

2つの16ビットの符号なしレジスタを比較し、最初のものが大きい場合は内容を入れ替えたいと思います。たとえば、axに00FFが含まれ、bxにFFFFが含まれている場合は、その内容を交換したいと考えています。これを行うコマンドか、スワッピングに使用される簡単な手順がありますか?x86 - 2つのレジスタの内容を交換する

+4

は、私の知る限りでは、何もありませんこれを行う単一の命令。 'cmp'' jb''xchg'を実行するだけです。 –

+1

'cmovCC'命令を使うこともできます。 – fuz

+0

アーロン、あなたの質問に答えがあります。それをチェックしてください。 –

答えて

0

"2つのレジスタのx86 - スワップの内容"です。あなたはケースの斧でジャンプを回避したい場合、すでに最大値を保持している(そして、あなたはそれをする時間のほとんどを知っている、とあなたはジャンプ誘発命令を避けたい

.model small 
.stack 100h 
.data 
.code 
    mov ax, @data 
    mov ds, ax 

    mov ax, 0ffffh 
    mov bx, 0ffh 

    cmp ax, bx 
    ja swap   ;IF AX > BX... 
    jmp continue 

swap: 
    xchg ax, bx   ;◄■■■ AX BECOMES 0FFH, BX BECOMES 0FFFFH. 

continue: 

    mov ax, 4c00h 
    int 21h 
+1

これはタイトルかもしれませんが、質問そのものは明らかです(OPを例に挙げます):_ 2つの16ビット符号なしレジスタを比較し、最初のものが大きい場合はその内容を入れ替えたい@ –

+0

@MichaelPetch、簡単です修正する。 –

0

:あなたはXCHG指示、例を使用することができますパイプラインCPUの実装によって発生する可能性があるリフィル...)、またはあなただけのバイトを保存する(、BXは単一バイトのオペコードXCHG斧です):

cmp ax, bx 
    jb bx_is_bigger 
    xchg ax, bx 
bx_is_bigger: 
    xchg ax, bx 
+0

Better: 'xchg'をスキップする' jnb'なので、 'xchg'は2回または1回ではなく0回または1回実行されます。スピードを最適化している場合は、実際にスワップする必要はありません。例えばあなたがそれらを 'ax'と' bx'に入れる前に 'dx'と' ax'でそれらを持っているかもしれないので、あなたは2つの 'mov'命令を飛ばしてそれを行うことができます。 ( 'xchg'は3 uopsにデコードされるので、最新のCPUでは' mov'命令と同じくらいです)。 [code golf](https://codegolf.stackexchange.com/questions/77270/greatest-common-divisor/77364#77364)や他の純粋なコードサイズの状況の外では、通常使う価値はありません。 –

関連する問題