C语言-内联汇编

格式

__asm__(assember template
       : output operands				/* optional */
       : input operands					/* optional */
       : list of clobbered registers	/* optional */)

第一部分,汇编指令;

第二部分,指示运算结果要输出到哪些C操作数中;

第三部分,指示汇编指令需要从哪些C操作数获得输入;

第四部分,指示在汇编指令中被修改过的寄存器列表。

后三部分都是可选的,没有就空着只写个:号。

例子

#include <stdio.h>

int main()
{
    int a = 10, b;
    __asm__("movl %1 %%eax\n\t"
           "movl %%eax %0\n\t"
           :"=r"(b)
           :"r"(a)
           :"eax");
    printf("Result: %d, %d\n", a, b);
    return 0;
}

解释:

1、该汇编代码将变量a的值赋给b。

2、“r”(a)指示编译器分配一个寄存器保存变量a的值,作为汇编指令的输入,也就是指令中的%1(b对应%0,a对应%1),至于%1究竟代表哪个寄存器则由编译器自己决定。

3、%%eax(为了和%1这种占位符区分,eax前面要求加两个%号)。

4、“=r”(b)表示把%0所代表的寄存器的值输出给变量b。

5、在执行指令的过程中,寄存器eax的值被改变了,所以把"eax"写在第四部分,告诉编译器在执行指令期间不要用eax保存其他值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值