c/c++中嵌入汇编

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;
}   
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值