2つの16ビットの符号なしレジスタを比較し、最初のものが大きい場合は内容を入れ替えたいと思います。たとえば、ax
に00FFが含まれ、bx
にFFFFが含まれている場合は、その内容を交換したいと考えています。これを行うコマンドか、スワッピングに使用される簡単な手順がありますか?x86 - 2つのレジスタの内容を交換する
答えて
"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
これはタイトルかもしれませんが、質問そのものは明らかです(OPを例に挙げます):_ 2つの16ビット符号なしレジスタを比較し、最初のものが大きい場合はその内容を入れ替えたい@ –
@MichaelPetch、簡単です修正する。 –
:あなたはXCHG
指示、例を使用することができますパイプラインCPUの実装によって発生する可能性があるリフィル...)、またはあなただけのバイトを保存する(、BXは単一バイトのオペコードXCHG斧です):
cmp ax, bx
jb bx_is_bigger
xchg ax, bx
bx_is_bigger:
xchg ax, bx
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)や他の純粋なコードサイズの状況の外では、通常使う価値はありません。 –
- 1. 2次元配列内の2つの値を交換する
- 2. レターケースを交換する(アセンブリx86)
- 3. 内容を交換するod div(3つ以上のdivを持つ)
- 4. 配列内の2つのオブジェクトを交換する:ReactJS
- 5. PHP:同じstr_replace内の2つのアイテムを交換する
- 6. ベクトル内の2つの値を交換する
- 7. 行列内の2つの値を交換する
- 8. Android:2つのオーバーラップビューを交換する
- 9. C#2つのリストを交換 - 交換可能な内部/外部ループ
- 10. 内容モデル交換用MathMLとOpenMath
- 11. x86レジスタのフラグの略語
- 12. PowerShellのセット内容複数行を交換する方法
- 13. トラブル理解レジスタx86
- 14. 交換ラインの内容をメモ帳++ファイル内
- 15. 2つのマーカーの間のファイル内の内容を置換する
- 16. LLVM IRによるx86レジスタの制御?
- 17. 1つのリンクリストで2つのノードを交換する
- 18. 2つのアプリケーション間のデータ交換(ニーズパターン)
- 19. 2つのウィンドウ間の情報交換
- 20. 2つのPythonプロセス間のデータ交換
- 21. Djangoでデータベース内の2つのオブジェクトを交換するためのフォーム
- 22. のJavascript/CSSメニュー特定の領域の内容を交換する
- 23. MySQLの2つのフィールドの値を交換するDjango update()?
- 24. AVXレジスタの内容を無効にする
- 25. x86の余分なレジスタ64ビット
- 26. ツリー2つのノードを交換するためのトラバーサル
- 27. 文字列の2つの単語を交換する
- 28. SwiftでRealm.ioデータベースの2つのオブジェクトを交換する
- 29. C:リンクされたリストの2つのノードを交換する
- 30. R:ネストされたリストの2つの値を交換する
は、私の知る限りでは、何もありませんこれを行う単一の命令。 'cmp'' jb''xchg'を実行するだけです。 –
'cmovCC'命令を使うこともできます。 – fuz
アーロン、あなたの質問に答えがあります。それをチェックしてください。 –