請考慮下面的程序:乘法指令錯誤
#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