C中的内联汇编:动态寄存器

时间:2009-10-01 09:45:17

标签: c assembly inline-assembly

我正在尝试在我的C代码中内联一些汇编代码:

__asm { mov reg,val };

问题:我想动态定义寄存器和值。 我知道'val'可以是用C代码写的变量,但我不知道如何动态选择寄存器(即根据用户输入决定 - 注册'dh'或'dl')。

有什么建议吗?

2 个答案:

答案 0 :(得分: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;
    ...
}

答案 1 :(得分:4)

嗯......这需要你在运行时修改代码。

__asm { }构造在编译时全部发生,因此您不能在以后影响其内容。

当然,self-modifying code并不是现代操作系统设置的最简单的方法,因此您将不得不跳过几个环节(缓存刷新,代码处于不可写段等等)。

更新:当然你可以在一组预编译的版本之间使用slashmais的技术和switch,但我会害怕在这个级别混合代码(注册clobbering浮现在脑海中)。