2009-10-01 112 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,但是我会害怕在那个级别混合代码(注意到破坏注册表)。