请考虑下面的程序:乘法指令错误
#include <stdio.h>
int main(void) {
int foo = 10, bar = 15;
__asm__ __volatile__("add %%ebx,%%eax"
:"=a"(foo)
:"a"(foo), "b"(bar)
);
printf("foo+bar=%d\n", foo);
}
我知道add
指令用于另外,sub
指令用于减法&等。但我不明白这些行:
__asm__ __volatile__("add %%ebx,%%eax"
:"=a"(foo)
:"a"(foo), "b"(bar)
);
什么是:"=a"(foo) :"a"(foo), "b"(bar));
的确切含义是什么?它能做什么 ?当我尝试使用mul
指令在这里我获得以下以下程序错误:
#include <stdio.h>
int main(void) {
int foo = 10, bar = 15;
__asm__ __volatile__("mul %%ebx,%%eax"
:"=a"(foo)
:"a"(foo), "b"(bar)
);
printf("foo*bar=%d\n", foo);
}
错误:'MUL”
那么,为什么我收到此错误的操作数不匹配的号码?我该如何解决这个错误?我在谷歌搜索这些,但我找不到解决我的问题。我使用的是Windows 10操作系统&处理器是英特尔酷睿i3。
这里“a”和“b”表示什么? – Destructor
如果您阅读了链接到asm的文档,您将看到引用的字符串是描述如何将C语言变量映射到asm可以理解的东西的“约束”(参见i386部分[here](https:// gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html))。 “a”是指eax寄存器。 “b”是指ebx。 –
好的谢谢。我知道了。但我仍然有一个问题。我想将foo和bar变量的值与foo中的结果相乘。我已经访问了您提供的有关多次违规的链接,但是我仍然很难知道我应该怎么做才能做到这一点? – Destructor