c/c++中嵌入汇编
1、 在Dev c++和VC中嵌套汇编: VC里采用的是intel格式,而Dev C++采用的是AT&A的汇编格式
a. VC中
#include <stdio.h>
int main() {
_asm int 3 ; // 此处采用的是intel的汇编格式,INT 3代表终止程序
return 0;
}
注:
1、 这个可以在VC下编译通过,但用DEV c++则编译出错,原因在内联的汇编
2、 多行汇编语句:
_asm {
push eax;
pop eax;
}
3、 将寄存器的值赋值给变量
int a;
_asm mov a, eax; // 将eax的值赋值给a
b. DEV C++
#include <stdio.h>
int main () {
__asm__("int $3"); //此处采用的是AT&A的汇编格式
return 0;
}
注:
1、 在AT&A里,引用值需要前加"$"标记,而且引用寄存器时也需要加一个前缀"%", 如: mov $789, %eax
2、 另外,不可以直接引用变量,而且只能引用全局变量,同时在引用时,需要在其前加一下划线"_"(在dev c++5.11中,目前是不需要加下划线)
3、 另外就是操作数的方向与intel的语法相反,如: mov $789,%eax // intel中是报错的,因为eax的值无法赋值给789,而AT&A中则是对的,把789赋值给eax
4、 __asm__和__asm都可以
5、 如果汇编的语句较多,则 __asm("mov $0x1A2, %ecx\n
mov %eax, a"); // 必须得有"\n"换行
#include <stdio.h>
long a;
int main(int argc, char *argv[]) {
__asm(" mov $0x1A2, %ecx");
__asm(" mov %eax, a");
printf("A is %x\n", a);
return 0;
}
#include <stdio.h>
int a = 1, b = 2, c = 3;
int d;
int main(int argc, char *argv[]) {
// 采用汇编计算 a + b + c
_asm(
" push %rax \n"
"mov a, %rax\n"
"add b, %rax\n"
"add c, %rax\n"
"mov %rax, d\n"
"pop %rax"
);
printf("d = a + b + c = %d\n", d);
return 0;
}