`
spartan1
  • 浏览: 360308 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

gcc嵌入汇编语法

 
阅读更多

以前学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)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics