2009-10-01 109 views
1

我想一些內嵌彙編代碼在我的C代碼:內聯彙編在C:動態註冊

__asm { mov reg,val }; 

的問題:我要動態地定義寄存器和價值。 我知道'val'可以是用C代碼編寫的變量,但我不知道如何動態選擇寄存器(即根據用戶輸入寄存器'dh'或'dl'來決定)。

有什麼建議嗎?

回答

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; 
    ... 
} 
4

嗯...這將要求您修改在運行時的代碼。

__asm { }構造發生在編譯時,所以你以後不能影響它的內容。

當然,self-modifying code並不完全是現代操作系統設置的最簡單的方式,所以您將不得不跳過一些環節(緩存刷新,代碼位於非可寫段中,等等上)。

更新:當然你也許可以在一組預編譯的版本之間使用slashmais的技術和switch,但是我會害怕在那個級別混合代碼(注意到破壞註冊表)。