第24部分- Linux ARM汇编 内联汇编

内联汇编如下:

#include <stdio.h> 
int add(int i, int j) { 
	int res = 0; 
	asm ( 
		"ADD %w[result], %w[input_i], %w[input_j]" 
		: [result] "=r" (res)
		: [input_i] "r" (i), [input_j] "r" (j) );
	return res; 
} 
int main(void) { 

	int a = 1; int b = 2; int c = 0; 
	c = add(a,b) ;
	printf("Result of %d + %d = %d\n", a, b, c);
 }

语法是:

asm(code [: output_operand_list [: input_operand_list [: clobber_list]]]);

示例中,code是“ ADD%[result],%[input_i],%[input_j]”。

output_operand_list是输出操作数的可选列表,以逗号分隔。 每个操作数均由方括号中的符号名称,约束字符串和括号中的C表达式组成。 在此示例中,有一个输出操作数:[result]“ = r”(res)。

input_operand_list是输入操作数的可选列表,以逗号分隔。 输入操作数使用与输出操作数相同的语法。 在此示例中,有两个输入操作数:[input_i]“ r”(i)和[input_j]“ r”(j)。

clobber_list是破坏寄存器或其他值的可选列表。 在示例中,其省略。

在C / C ++和汇编代码之间调用函数时,必须遵循AAPCS64规则。