GCC 内联汇编


基本内联汇编

写啥就是啥,和 C 代码没有任何关系,写的 mov $1, eax 编译器就塞到程序里。

 

扩展内联汇编

支持与 C 语言进行交互,比如传输变量的值到寄存器中。

 

例子:随机数生成

#include <stdio.h>
#include <assert.h>
int main()
{
	int flag = 0;
	unsigned int result = 0;

	__asm__ volatile(
		"mov $1, %%eax\t\n"
		"cpuid\t\n"
		"and $0x20000000, %%eax\t\n"
		"test $0, %%eax\t\n"
		"jnz 1\t\n"
		"mov $1, %0\t\n"
		"1:\t\n"
		: "=r"(flag) // output
		:			 // input
		: "eax");	 // clobbers

	if (!flag)
	{
		assert(0 && "not support this cpu!");
	}
	for (int i = 0; i < 100; i++)
	{
		__asm__ volatile(
			"rdrand %%eax\t\n"
			"mov %%eax, %0\t\n"
			: "=r"(result)
			:
			: "eax");

		printf("0x%08x\n", result);
	}
	return 0;
}

 

参考

  1. Basic Asm (Using the GNU Compiler Collection (GCC))
  2. Extended Asm (Using the GNU Compiler Collection (GCC))

运行时间 427 天 | 总访问量