1

C コードでいくつかのアセンブリ コードをインライン化しようとしています。

__asm { mov reg,val };

問題: レジスタと値を動的に定義したい。「val」が C コードで記述された変数であることは知っていますが、レジスタを動的に選択する方法がわかりません (つまり、ユーザー入力レジスタ「dh」または「dl」に従って決定します)。

助言がありますか?

4

2 に答える 2

4

C コードで列挙型とスイッチを使用します。

typedef enum
{
  R_AL,
  R_AH,
  R_AX,
  R_EAX,
...
} REGS;
...
REGS nReg;
...
switch (nReg)
{
    case R_AL: __asm { mov al,val } break;    
    case R_AH: __asm { mov ah,val } break;    
    case R_AX: __asm { mov ax,val } break;
    ...
}
于 2009-10-01T09:54:59.720 に答える
4

ええと...そうすると、実行時にコードを変更する必要があります。

コンストラクトはすべてコンパイル時に発生する__asm { }ため、後でその内容に影響を与えることはできません。

もちろん、自己変更コードは、最新のオペレーティング システムが最も簡単に実行できるように設定されているわけではないため、いくつかのフープ (キャッシュのフラッシュ、コードが書き込み不可セグメントにあるなど) をジャンプする必要があります。 )。

更新: もちろん、slashmais の手法をswitch一連のコンパイル済みバージョン間で使用できるかもしれませんが、そのレベルでコードを混在させるのは怖いでしょう (レジスタの上書きが思い浮かびます)。

于 2009-10-01T09:55:16.753 に答える