以前学gcc嵌入汇编时的一些笔记,看一下对gcc的嵌入汇编比较有用处:
1· 格式:
asm ( "以回车或分号分隔的汇编指令" : 以逗号分隔的输出操作数 : 以逗号分隔的输入操作数 : 以逗号分隔的受影响的寄存器或内存 )
2·输出操作数表示汇编指令执行结果,输入操作数表示汇编指令执行时的输入值;
3·每个输出和输入操作数都是分为两部分:“限定符” (C表达式),其中输出操作数的限定符必须包含等号(=)
4·如果限定符表示一个寄存器,则对于输入操作数,在生成第一部分的汇编指令之前,会先生成将C表达式的值生成到指定的寄存器的汇编指令;对于输出操作数,在生成第一部分的汇编指令后,会生成将指定寄存器中的值移到C表达式的指令,所以输出操作数中的C表达式必须都是左值(lvalue)。
5·所有操作数从头到尾顺序排列,在汇编指令中以“%编号”引用,其中编号从0开始,依次递增。
6·引用时引用的是限定符所指定的东西,比如限定符指定的是寄存器,则引用的是寄存器;指定的是变量,则引用的是变量的内存地址。
7·asm也可以是__asm__。
8·汇编指令中的寄存器前需要添加%%前缀,如%%edi。如果没有输入输出部分,可以只有一个%前缀,如%eax
9·有如下常用限定符:r:通用寄存器,m:内存地址,a:eax,b:ebx,c:ecx,d:edx,S:esi,D:edi,q:a/b/c/d,i:立即数,o:可以加一个偏移的内存地址,g:前面所有这些,0~n:指定使用和第n个操作数相同的限定符
举例:
asm("mov %2, %%eax\n\t"
"mov %%eax, %%ecx\n\t"
"inc %%eax\n\t"
"mov %%eax, %1",
: "=c" (old_value), "=m" (inced_value)
: "D" (input_value)
);
如果input_value位于0x8(%ebp)(第一个参数), inced_value位于-8(%ebp)(第二个局部变量),old_value位于-4(%ebp)(第一个局部变量),则生成的代码大概如下:
mov 8(%ebp), %edi
mov %edi, %eax
mov %eax, %ecx
inc %eax
mov %eax, -8(%ebp)
mov %ecx, -4(%ebp)
分享到:
相关推荐
__asm__ __volatile__ GCC的内嵌汇编语法说明,看Linux内核必备
内嵌汇编
如何在GCC实现C语言中内嵌汇编,很好的资料
ARM GCC 内联汇编参考手册
较为详细的说明了在gcc平台下,如何在c中嵌入汇编语法
GCC内联汇编, C语言嵌入汇编,AT&T Intel语法区别
GCC内联汇编, C语言嵌入汇编,AT&T Intel语法区别
讨论AT&T 的汇编语法,以及GCC 的内嵌汇编语法。
在Linux的核心代码中,还是存在相当一部分的汇编语言代码。如果你想顺利阅读Linux代码的话,你...另一部分则是利用gcc的内嵌式汇编语言语句asm嵌在Linux的C语言代码中的。这篇文章主要是介绍第二种形式的汇编语言代码。
这里是我在网上收集的,然后转换成PDF的,希望对大家有用。
AT&T汇编语言与GCC内嵌汇编简介 linux 内核 汇编 介绍以上内容。pdf文件
GCC内联汇编, C语言嵌入汇编,AT&T Intel语法区别
AT&T汇编语言与GCC内嵌汇编简介.pdf
AT&T汇编语言和gcc内嵌汇编,比较了Intel和AT&T汇编语言间的区别,还不错!!!
gcc 内联汇编 1 AT&T 与 INTEL 的汇编语言语法的区别 1.1 大小写 1.2 操作数赋值方向 1.3 前缀 1.4 间接寻址语法 1.5 后缀 1.6 指令 2 GCC 内嵌汇编 2.1 简介 2.2 内嵌汇编举例 2.3 语法 2.3.1 汇编语句...
gcc 内联汇编官方手册最新版 ThisHOWTOexplainstheuseandusageoftheinlineassemblyfeatureprovidedbyGCC.
Linux0.11内核 GCC内嵌汇编