1

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

__asm { mov reg,val };

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

有什么建议么?

4

2 回答 2

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;
    ...
}
于 2009-10-01T09:54:59.720 回答
4

嗯......那将需要您在运行时修改代码。

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

当然,自修改代码并不是现代操作系统最容易做到的,所以你将不得不跳过几个环节(缓存刷新,代码在不可写段中,等等)。

更新:当然,您可以switch在一组预编译版本之间使用 slashmais 的技术,但我害怕在那个级别混合代码(想到寄存器破坏)。

于 2009-10-01T09:55:16.753 回答