【问题标题】:how can i read value from register using C++我如何使用 C++ 从寄存器中读取值
【发布时间】:2013-11-22 14:05:02
【问题描述】:

我正在用 C++ 为计算器扭动代码,但它显示\读取程序集的结果,我想将值存储在任何寄存器中,例如 (Al) 到 C++ 中的变量 int...我搜索了但我总能用 C 语言找到它...

【问题讨论】:

  • 你的意思是register关键字中的喜欢吗?
  • 我认为他的意思是汇编寄存器,例如eaxebx,...?!
  • @SJuan76 register 与寄存器无关。大多数编译器在解析后甚至会忽略它。
  • @rightfold I disagree.
  • @JonathonReinhart 我建议你读一下。这与 OP 所说的 register 不同。这是一个恰好使用该关键字的语言扩展。

标签: c++ assembly inline-assembly


【解决方案1】:

如果您想将al 中的值读入int

海合会:

unsigned char out;
asm volatile("movb %%al, %[Var]" : [Var] "=r" (out));

或者

unsigned char out;
asm volatile("movb %%al, %0" : "=r" (out));

对于 MSVC:

unsigned char c;
__asm movb c, al

没有正式的 C++ 方式,它源于 C。

编辑

您可能还想要:

register unsigned char out asm("%al");

但那是 GCC。

【讨论】:

  • 由于我们正在处理 x86 程序集,我认为最好避免使用名为 out 的变量。
  • @JonathonReinhart 编译器应该足够聪明来处理这个
  • @user9000 我从来没有建议它不能。我只是说,在浏览内联汇编时,看到out 这个词是不必要的混淆/需要再看一眼。尤其是当你经常看汇编,并习惯了 out 吸引你的眼球时。
  • @JonathonReinhart 啊,我不知道你指的是 MSVC 代码,谢谢
【解决方案2】:

它依赖于编译器。对于带有 GCC 的英特尔:

//Read value from register
int x;

asm ("mov %0, AI;"
     :"=r"(x)
    );

参考here

【讨论】:

  • 这是我的代码 int c; __asm { mov ah, 00h int 16h //存储在寄存器中 al asm ("mov %0, al;":"=r"(x)); }
  • @Sarah,你可以用这个编辑你的问题吗?很难理解你在做什么。我认为您正在使用 MS 编译器?
  • @Sarah 再次依赖于编译器。如果您使用的是 MSVC,那就另当别论了。谷歌会提供帮助
【解决方案3】:

你的意思是:

int read_register_eax()
{
    int ret;
    asm { mov [ret],eax }
    return ret;
}

【讨论】:

  • 非常感谢您的帮助
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多