AT&T汇编总结_4_C语言使用内联汇编

目的

在C语言程序中插入汇编语法(内联汇编)

意义

使用C语言配合汇编不仅可以保留C语言操作的便捷性,还可以让我们拥有对内存进行字节粒度操作的能力

内联汇编使用

使用全局变量

使用普通的内联汇编语法时,参数只能通过全局变量传递
语法格式:
asm(“assembly code”);

try5.s

#include <stdio.h>

int a=1, b=2, result;

int main(){
	asm(	"pusha \n\t"
		"movl a, %eax \n\t"
		"movl b, %ebx \n\t"
		"imull %ebx, %eax \n\t"
		"movl %eax, result \n\t"
		"popa \n\t"
			);
	printf("a * b = %d\n", result);
	return 0;
}

编译执行


解释

1、普通的内联汇编可以直接访问全局变量
2、\n\t在此处的意义是实现换行对齐,这里体现不出来,只有在查看其汇编代码时才有效果

使用局部变量

普通的内联汇编只能操作全局变量,下面介绍一种可以操作局部变量的扩展的内联汇编
语法格式:
asm(“assembly code” : output : input : chagned registers);
assembly code:汇编代码
output:返回值
input:输入参数
chagned registers:在自动安排寄存器时被禁用的寄存器,感兴趣的可以参考《汇编语言程序设计·RICHARD》P298

try7.c

#include <stdio.h>

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

	asm(	"imull %1, %2\n\t"
		"movl %2, %0\n\t"
		:"=r"(result)
		:"r"(data1), "r"(data2)
		:
			);
	printf("data1 * data2 = %d\n", result);
}

编译执行


解释

该内联汇编中前面两行就是正常的汇编语法
“=r”(result)意味着将一个寄存器绑定到result变量
“r”(data1)意味着将一个寄存器绑定到data1变量
“r”(data2)意味着将一个寄存器绑定到data2变量
按照上面的顺序
result绑定的寄存器可以用%0来引用
data1绑定的寄存器可以用%1来引用
data2绑定的寄存器可以用%2来引用
最后一行仅有一个冒号,说明没有禁用的寄存器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值