C语言内嵌汇编

1.C语言内嵌汇编

1.1内嵌汇编的语法

C语言内嵌汇编

创新互联建站专注于长宁网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供长宁营销型网站建设,长宁网站制作、长宁网页设计、长宁网站官网定制、微信小程序定制开发服务,打造长宁网络公司原创品牌,更为您提供长宁网站排名全网营销落地服务。

1.2内嵌汇编示例

#include <stdio.h>

int main()
{
    int result = 0;
    int input = 1;

    int a = 1;
    int b = 2;

    asm volatile (
        "movl %1, %0\n" // 通过占位符指定交互的变量
        : "=r"(result)      // 输出变量,与汇编交互
        : "r"(input)            // 输出变量,与汇编交互
// 这里的r指示编译器自动将通用寄存器关联到变量
        );

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

    asm volatile (
        "movl %%eax, %%ecx\n"
        "movl %%ebx, %%eax\n"
        "movl %%ecx, %%ebx\n"
        : "=a"(a), "=b"(b)          // 这里指明a变量使用a寄存器
        : "a"(a), "b"(b)
        );

    printf("a = %d\n", a);
    printf("b = %d\n", b);

    return 0;
}

1.3编译器做了什么

对于上述示例,编译器做了如下工作:
1.将result关联到某个合适的寄存器
2.将input关联到某个合适的寄存器
3.通过通用寄存器间接操作变量
注意:
汇编语言不支持内存到内存的直接操作,要使用寄存器作为中间角色。

1.4常用限制符说明

C语言内嵌汇编

1.5使用系统服务

可以直接通过内嵌汇编使用系统服务。通过INT 80H使用内核服务
1.INT指令用于使用Linux内核服务(中断指令)
2.80H是一个中断向量号,用于执行系统调用
3.可以通过寄存器指定具体的系统调用及其参数(如sys_write服务)

1.6使用系统服务完成打印

char* s = "D.T.Software\n";
int l = 13;

asm volatile(
    "movl $4, %%eax\n"      //
    "movl $1, %%ebx\n"
    "movl %0, %%ecx\n"
    "movl %1, %%edx\n"
    "int $0x80     \n"
    :
    : "r"(s), "r"(l)
    : "eax", "ebx", "ecx", "edx"
);

1.7使用系统服务执行程序退出

    asm volatile(
        "movl $1,  %eax\n"
        "movl $42, %ebx\n"
        "int $0x80     \n"
    );

注意:
1.内嵌汇编时,除汇编模板外,其余参数都可以省略
2.当省略的参数在中间时,对应分隔符":"不可省略
3.当省略保留列表时,对应得到分隔符":"可以省略
4.当省略可选参数时,寄存器前使用单个%作为前缀
当存在可选参数时,寄存器前使用两个%%作为前缀

标题名称:C语言内嵌汇编
文章起源:https://www.cdcxhl.com/article4/gshooe.html

成都网站建设公司_创新互联,为您提供网站策划微信小程序网站导航云服务器自适应网站网站收录

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站建设