您的位置:首页 > 其它

内联汇编使用简介

2015-06-04 10:31 204 查看
用3个实例实现将变量a和变量b相乘,得到的值存在result中.

简单实例

asm表示使用内联汇编, volatile表示不对内联汇编进行优化,避免造成误删.

#include<stdio.h>

int a = 10;
int b = 20;
int result;

int main(){
    __asm__ __volatile__(
        "movl a, %eax\n\t"
        "movl b, %ebx\n\t"
        "imull %ebx, %eax\n\t"
        "movl %eax, result\n\t"
        );
    printf("the answer is %d\n", result);
    return 0;
}


在简单实例中,内联汇编只能使用C语言中的全局变量,其次寄存器和C语言中的变量不能进行交互传值.

扩展asm

为了解决以上实例中的局限性,提供了扩展的asm

__asm__("asm statements" : outputs : inputs : registers-modified);


其中outputs和inputs格式为:

"constraints" (variable)


[thead]
[/thead]
约束描述
“m”、”v”、”o”内存单元
“r”任何寄存器
“q”寄存器eax、ebx、ecx、edx之一
“i”、”h”直接操作数
“E”和”F”浮点数
“g”任意
“a”、”b”、”c”、”d”分别表示寄存器eax、ebx、ecx和edx
“S”和”D”寄存器esi、edi
“I”常数(0至31)
实例

#include<stdio.h>

int main(){
    int data1 = 10;
    int data2 = 20;
    int result;

    __asm__ __volatile__(
        "imull %%ebx, %%eax\n\t"
        "movl %%ecx, %%eax"
        : "=a"(result)
        : "d"(data1), "c"(data2)
        );
    printf("the answer is %d\n", result);
    return 0;
}


在扩展asm中,引用寄存器要用”%%”. “=”表示写入操作数.在这里是指将eax寄存器的值写入到result中.

使用占位符

可以将寄存器出现的顺序从0开始编号,比如%0和%1等,这个编号称为占位符.

#include<stdio.h>

int main(){
    int data1 = 10;
    int data2 = 20;
    int result;

    __asm__ __volatile__(
        "imull %1, %2\n\t"
        "movl %2, %0"
        : "=r"(result)
        : "r"(data1), "r"(data2)
        );
    printf("the answer is %d\n", result);
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: