我想一些內嵌彙編代碼在我的C代碼:內聯彙編在C:動態註冊
__asm { mov reg,val };
的問題:我要動態地定義寄存器和價值。 我知道'val'可以是用C代碼編寫的變量,但我不知道如何動態選擇寄存器(即根據用戶輸入寄存器'dh'或'dl'來決定)。
有什麼建議嗎?
我想一些內嵌彙編代碼在我的C代碼:內聯彙編在C:動態註冊
__asm { mov reg,val };
的問題:我要動態地定義寄存器和價值。 我知道'val'可以是用C代碼編寫的變量,但我不知道如何動態選擇寄存器(即根據用戶輸入寄存器'dh'或'dl'來決定)。
有什麼建議嗎?
使用枚舉和開關在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;
...
}
嗯...這將要求您修改在運行時的代碼。
__asm { }
構造發生在編譯時,所以你以後不能影響它的內容。
當然,self-modifying code並不完全是現代操作系統設置的最簡單的方式,所以您將不得不跳過一些環節(緩存刷新,代碼位於非可寫段中,等等上)。
更新:當然你也許可以在一組預編譯的版本之間使用slashmais的技術和switch
,但是我會害怕在那個級別混合代碼(注意到破壞註冊表)。