我正在尝试在我的C代码中内联一些汇编代码:
__asm { mov reg,val };
问题:我想动态定义寄存器和值。 我知道'val'可以是用C代码写的变量,但我不知道如何动态选择寄存器(即根据用户输入决定 - 注册'dh'或'dl')。
有什么建议吗?
答案 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浮现在脑海中)。