C++ 内联asm,何时使用r,何时使用m?为什么会有这种行为?

C++ 内联asm,何时使用r,何时使用m?为什么会有这种行为?,c++,inline-assembly,C++,Inline Assembly,我试图深入研究一些内联汇编。这是一个有趣的东西,但文档是稀缺的和新手不友好的 此代码按预期工作,正确地进行乘法运算 { int other_var=3; asm volatile ( "mov $3,%0\n\t" "roll $2,%0;" :"=r"(other_var) :"r"(other_var) ); cout << "other_var equals " << other_var <<endl; return 0;

我试图深入研究一些内联汇编。这是一个有趣的东西,但文档是稀缺的和新手不友好的

此代码按预期工作,正确地进行乘法运算

{
int other_var=3;
asm volatile
(
    "mov $3,%0\n\t"
    "roll $2,%0;"
    :"=r"(other_var)
    :"r"(other_var)
);
cout << "other_var equals " << other_var <<endl;
return 0;
}
{
int-other_var=3;
挥发性物质
(
mov$3,%0\n\t
掷骰$2,%0
:“=r”(其他变量)
:“r”(其他变量)
);

cout你可能会找到一些参考书、pdf或网站。1记录内联汇编的特定编译器性质,1记录汇编语言的特定性质。然后希望没有人尝试在不同的硬件上运行你的代码

在第一段代码中,将常量值3“$3”赋给输出绑定寄存器“%0”。 然后在输出绑定寄存器“%0”上按常量2“$2”位执行滚动

实际上是3乘以4

这两个代码块实际上都没有从变量other_var读取原始值

m代表内存,r代表寄存器。=代表输出,no=用于输入

mov %1, %0;   load the register used for output with the value of the register used for input..
roll $2, %0;  Then roll the output register 
当您抓取一个寄存器并开始使用现有的位模式时,您可能会看到类似于“垃圾”的东西


所以基本上C变量总是在内存中,我必须从内存中手动加载它们。对吗?%1在代码中是“r”(其他值)或者别的什么?我认为other_val标记为%0。所以在我的示例中%0是与other_val等效的输出寄存器,%1是与other_val等效的输入寄存器?什么是
djgpp
?这似乎不是答案,尽管您提到了形成答案所需的文档。(不过,我认为我从未见过GCC内联asm的正确文档,我也不确定它是否存在。)@StanislawT好吧,确实有一些GCC贡献者/专家创造了这个怪兽。可能有很多人伪造了它。我们其余的人都拔牙,最终放弃了。我强烈建议不要伪造它,因为当寄存器分配器做了一个非常小的更改时,这个东西会坏得很厉害。哈哈,是的,我是很高兴我不是唯一一个觉得这件事很难的人。我今天花了一半的时间浏览了现存的稀缺而糟糕的文档。将汇编与文档记录不充分的输入、输出、重击概念结合起来,让它变得非常困难。
mov %1, %0;   load the register used for output with the value of the register used for input..
roll $2, %0;  Then roll the output register