Linux c文件中创建一个由汇编代码构成的函数方法

        c文件中经常使用asm完成嵌入式汇编,例如

#include <stdio.h>

void a()
{
    int result = 0;
    int input = 1;
    asm volatile (
        "movl %1, %0\n"
        : "=r"(result)
        : "r"(input));

    printf("result = %d\n", result);
    printf("input = %d\n", input);
}

int main(void)
{
    a();

    return 0;
}

        这通常是在已存在的函数中通过asm将汇编指令嵌入到函数中,如何使用asm创建一个函数,这是有意义的,比方说上面的例子,对a函数进行反汇编,发现其汇编代码还可以进一步优化,如何创建一个完成由汇编代码构成的函数以便更好的控制,这一般是通过.S文件来实现的,下面给出一种在C文件中创建汇编函数的方法

#include <stdio.h>

asm(
".global a\n"
"a:\n" 
    "mov $2, %eax\n"
    "mov %eax, i\n"
    "retq\n"   
);

int i = 1;

void c()
{
    i=2;
}

int main(void)
{
    printf("before a i: %d\n", i);
    a();
    printf("after a i: %d\n", i);

    return 0;
}

 下面是c函数的反汇编代码,其中movl   $0x2,0x2eec(%rip)        # 0x404030 <i>这一条指令就可以完成对全局i赋值的原因是通过rip间接寻址

执行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值