首页 > 编程语言 >C语言内嵌汇编

C语言内嵌汇编

时间:2022-10-22 17:36:42浏览次数:40  
标签:内嵌 汇编 %% C语言 eax val3 val2 val1 asm

实现val3 = val1 + val2函数

#include <stdio.h>
void myAdd(int val1, int val2){
    int val3 = 0;
    printf("val1=%d, val2=%d, val3=%d\n", val1, val2, val3);
    asm volatile(
        "movl $0, %%eax\n\t"
        "addl %1, %%eax\n\t"
        "addl %2, %%eax\n\t"
        "movl %%eax, %0\n\t"
        :"=m"(val3)
        :"c"(val1), "d"(val2)
    );
    printf("val1=%d, val2=%d, val3=%d\n", val1, val2, val3);
}
int main(){
    myAdd(1, 2);
    return 0;
}

__asm__asm等价,__volatile__volatile等价。

寄存器前要加一个%转移符号。

%0,%1..是指输入输出部分,第一个编号为%0

"a""c""d"是将变量放到eax,ecxedx寄存器中。

volatile用于关闭编译器优化


asm内嵌汇编代码语法

asm volatile (
	"asm code\n\t"
	:output
	:input
	:changed
);

output表示的是从ASM到C语言输出,简单理解就是寄存器到变量的操作;而input相反,指的是C变量到ASM寄存器赋值的过程。

input和output格式为[asm代码中用到的符号]"内容限定"(C代码中的变量)

  • []符号可以省略,改成%0,%1等代替。

  • 内容限定

简单约束符
r 使用任何可用的寄存器
m 使用变量的内存地址
i 使用立即数

约束修饰符:在上面的简单约束符开头可以增加下面的约束修饰符来决定它们的可读写特性。
'=': 表示操作数会被指令直接赋值,之前的值会被清除,这意味这该操作数之前的值并不重要;
'+': 表示操作数既会被指令读,也会被指令写;对于既没有指定'=',也没有指定'+'的操作数,会被认为是只读的;

因此上面代码的一个等效代码如下

#include <stdio.h>
void myAdd(int val1, int val2){
    int val3 = 0;
    printf("val1=%d, val2=%d, val3=%d\n", val1, val2, val3);
    asm volatile(
        "movl $0, %%eax\n\t"
        "addl %[input1], %%eax\n\t"
        "addl %[input2], %%eax\n\t"
        "movl %%eax, %[output]\n\t"
        :[output]"=m"(val3)
        :[input1]"c"(val1), [input2]"d"(val2)
    );
    printf("val1=%d, val2=%d, val3=%d\n", val1, val2, val3);
}
int main(){
    myAdd(1, 2);
    return 0;
}

标签:内嵌,汇编,%%,C语言,eax,val3,val2,val1,asm
From: https://blog.51cto.com/u_15457669/5786015

相关文章

  • 选择排序与冒泡排序(c语言+Java语言)
    选择排序O(n2)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素......
  • c语言基础理解(原创)
        家中小女初上大学开学计算机课程,学习C语言时遇到困难,为帮助她尽快入门,特写了这篇基本概念理解,希望帮她快速认识清楚C语言的本质。发到博客园上,也帮助同样的C语言......
  • c语言学习总结(原创)
    什么是标识符?标识符是用来标识变量、函数、类、模块,或者任何其他用户自定义项目的名称,用它来命名程序正文中的一些实体,比如函数名、变量名、类名、对象名等。如:inta1=0;......
  • C语言网络接口函数inet_ntoa用法小坑与分析
    tags:CNetworkDebug问题今天看了一下网络编程,发现其中有一个接口函数很有意思,就是从二进制转换到点分十进制表示的IP地址的函数​​inet_ntoa()​​,直接使用倒是......
  • C语言实现vector结构
    C语言实现vector结构 1.使用说明本例vector结构以单链表方式实现,结合了stack与queue结构:pop_front+push_front使用方式为stack;pop_front+push_back使用方式是queue。......
  • 初学c语言的感悟
          我现在已经大二了,大一下学期没有跟着老师学习,所以趁现在及时补救,在网上自学C语言。    我觉得学习C语言和学习英语差不多,有许多的规则,基本的语句......
  • 【C语言游戏】三子棋完整代码和正确结果截图
    ......
  • C语言逻辑推理题谁是凶手
    C语言逻辑推理题谁是凶手假定一个岛上住着三类人:骑士、无赖和普通人(也称为间谍)。骑士总是说真话,无赖总是说假话,普通人有时说谎话有时说真话。侦探为了调查一宗罪案,而询问......
  • C语言输入输出测试
    一、输入测试(1)输入数值测试三个%d之间的间隔分别为(无)(逗号)(空格)三种情况,应该如何正常输入,要求得到正确输出间隔分别为(空格时候),输入的时候以回车间隔是否可以?#include<......
  • C语言中的getchar、putchar函数
    getchar可以接受键盘上打印的字符,puchar可以进行输出字符比如:#include<stdio.h>intmain(){intch=getchar();putchar(ch);printf("%c\n",ch);return0;}运......