linux中c语言常用内嵌汇编

源码地址  http://download.csdn.net/download/sinat_35360663/10224892
//
//  main2.c
//  allen
//
//  Created by Allenboy on 2018/1/20.
//  Copyright © 2018年 Allenboy. All rights reserved.
//
//编译不过 可以生成.s文件  gcc -S main2.cpp
// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

#include <stdio.h>
    int a = 10;
    int b = 20;
    int result;
int main()
{
    
    asm(
//       "pusha\n"
        "movl a,%eax\n"
        "movl b,%ebx\n"
        "imull %ebx,%eax\n"
        "movl %eax,result"
 //       "popa\n"
            );
    printf("the result is %d\n",result);
    return 0;
}
//  allen
//
//  Created by Allenboy on 2018/1/20.
//  Copyright © 2018年 Allenboy. All rights reserved.
//
//编译能过 可以生成可执行文件  gcc main2.cpp (a.out) 或者 gcc -o test main2.cpp (test) 运动时用 ./a.out(./test)
// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 
#include<stdio.h>
int main()
{
    int data1 = 10;
    int data2 = 20;
    int result;
    
    asm (
     
        "imull %%edx,%%ecx\n\t"
        "movl %%ecx,%%eax\n\t"
        : "=a" (result)
        : "d" (data1), "c" (data2)
     
            );
    printf("the result is %d\n",result);
    return 0;
}
//  allen
//
//  Created by Allenboy on 2018/1/20.
//  Copyright © 2018年 Allenboy. All rights reserved.
//
//
// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

//tset 3
#include <stdio.h>

int main ()
{
  char* input[30] = {"ALLNBOY  人饭子  饭醉份子 \n"};
  char* output[30];
  int length = 25;
  asm  volatile ( 
  	"cld \n\t"
  	"rep movsb"
  	:
  	:"S"(input),"D"(output),"c"(length)
  	); //movs指令需要的3个指令,s代表要复制的字符串地址(esi) d代表目标位置存放在edi c 要复制的长度放在 ecx
  	printf("%s",*output);
    return 0;
}
// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

//tset 4占位寄存器 表示法
#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("%d\n",result);
    return 0;
}

#APP
# 9 "testasm.c" 1
    imull %eax,%edx
    movl %edx,%eax
# 0 "" 2
#NO_APP



// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

//tset 5当输入输出是同一个变量时可以用相同寄存器
#include <stdio.h>

int main ()
{
  int data1 = 10;
  int data2 = 20;
  
    asm(
  	"addl %1,%0"
  	: "=r"(data2)
  	: "r"(data1),"0"(data2)
  	: "%ecx","%edx"
  	); //
  	printf("%d\n",data2);
    return 0;
}


// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

//tset 6替换占位符
#include <stdio.h>

int main ()
{
  int data1 = 10;
  int data2 = 20;
  
    asm(
  	"addl %[value1],%[value2]"
  	: [value2] "=r"(data2)
  	: [value1] "r"(data1),"0"(data2)
  	); //
  	printf("%d\n",data2);
    return 0;
}

// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

//tset 7使用内存位置
#include <stdio.h>

int main ()
{
  int data1 = 40;
  int data2 = 20;
  int result;
    asm(
  	"divb %2\n\t"
  	"movl %%eax,%0"
  	: "=m"(result)
  	: "a"(data1),"m"(data2)
  	); //
  	printf("%d\n",result);
    return 0;
}


// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

//tset 8浮点数求法
#include <stdio.h>

int main ()
{
  float angle =90;
  float radian,cosine,sine;
  radian = angle/180*3.14159;
  asm("fsincos"
  	:"=t"(cosine),"=u"(sine)
  	:"0"(radian)
  	);
  	printf("angle is %f consine is %f sine is %f radian is %f\n",angle,cosine,sine,radian);
    return 0;
}





// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

//tset 9浮点数求法
#include <stdio.h>

int main ()
{
  float angle =90;
  float radian,cosine,sine;
  radian = angle/180*3.14159;
  asm("fsincos"
  	:"=t"(cosine),"=u"(sine)
  	:"0"(radian)
  	);
  	printf("angle is %f consine is %f sine is %f radian is %f\n",angle,cosine,sine,radian);
    return 0;
}


#APP
# 9 "testasm.c" 1
	fsincos
# 0 "" 2
#NO_APP
	fxch	%st(1)
	fstps	-20(%rbp)
	fstps	-8(%rbp)
	movss	-20(%rbp), %xmm5
	movss	%xmm5, -4(%rbp)

// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 

//tset 10跳转
#include <stdio.h>

int main ()
{
  int a = 10;
  int b = 20;
  int result;
  asm(
  	"cmp %1,%2\n\t"
  	"jge greater\n\t"
  	"movl %1,%0\n\t"
  	"jmp end \n"
	"greater:\n\t"
	"movl %2,%0\n"
	"end:"
	:"=r"(result)
  	:"r"(a),"r"(b)
  	);
  	printf("value id %d",result);
    return 0;
}
	
	
	
	movl	-8(%rbp), %edx
#APP
# 9 "testasm.c" 1
	cmp %eax,%edx
	jge greater
	movl %eax,%eax
	jmp end 
greater:
	movl %edx,%eax
end:
# 0 "" 2
#NO_APP
	movl	%eax, -4(%rbp)




// gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) 


//tset11 跳转 数字加字母f
#include <stdio.h>

int main ()
{
  int a = 10;
  int b = 20;
  int result;
  asm(
  	"cmp %1,%2\n\t"
  	"jge 0f\n\t"
  	"movl %1,%0\n\t"
  	"jmp 1f \n"
	"0:\n\t"
	"movl %2,%0\n"
	"1:"
	:"=r"(result)
  	:"r"(a),"r"(b)
  	);
  	printf("value id %d",result);
    return 0;
}
	
	
	movl	$20, -8(%rbp)
	movl	-12(%rbp), %eax
	movl	-8(%rbp), %edx
#APP
# 9 "testasm.c" 1
	cmp %eax,%edx
	jge 0f
	movl %eax,%eax
	jmp 1f 
0:
	movl %edx,%eax
1:
# 0 "" 2
#NO_APP
	movl	%eax, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, %esi




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C-haidragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值