如何将英特尔asm代码放入我的c ++应用程序? 我正在使用Dev-C ++。
我想这样做:
int temp = 0;
int usernb = 3;
pusha
mov eax, temp
inc eax
xor usernb, usernb
mov eax, usernb
popa
这只是一个例子。 我怎么能这样做?
更新: 它在Visual Studio中的外观如何?
答案 0 :(得分:4)
您可以在此处找到完整的指南http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
#include <stdlib.h>
int main()
{
int temp = 0;
int usernb = 3;
__asm__ volatile (
"pusha \n"
"mov eax, %0 \n"
"inc eax \n"
"mov ecx, %1 \n"
"xor ecx, %1 \n"
"mov %1, ecx \n"
"mov eax, %1 \n"
"popa \n"
: // no output
: "m" (temp), "m" (usernb) ); // input
exit(0);
}
之后你需要编译类似:
gcc -m32 -std=c99 -Wall -Wextra -masm=intel -o casm casmt.c && ./casm && echo $?
output:
0
您需要使用-masm = intel标志进行编译,因为您需要intel汇编语法:)
答案 1 :(得分:2)
这是一个显示GCC / Dev-C ++语法的简单示例:
int main(void)
{
int x = 10, y;
asm ("movl %1, %%eax;"
"movl %%eax, %0;"
:"=r"(y) /* y is output operand */
:"r"(x) /* x is input operand */
:"%eax"); /* %eax is clobbered register */
}
答案 2 :(得分:2)
这取决于你的编译器。但是从你的标签我猜你使用gcc / g ++然后就可以使用gcc inline assembler。但是语法非常奇怪,与intel语法略有不同,尽管它实现了相同的目标。
编辑:使用Visual Studio(或Visual C ++编译器),它会更容易,因为它使用通常的英特尔语法。
答案 3 :(得分:2)
更新:它在Visual Studio中的外观如何?
如果要构建64位,则无法在Visual Studio中使用内联汇编。如果要构建32位,则使用__asm
进行嵌入。
通常,使用内联ASM是一个坏主意。
答案 4 :(得分:1)