前言
大部分内容翻译提取自某国外HOW-TO文档,原地址:
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
AT&T汇编语法
gcc内联汇编语法采用AT&T格式,主要不同有五个方面
1. 源操作数和目标操作数的位置与intel格式不同
2. 寄存器命名,AT&T在寄存器前加百分号(%)
3. 字面值前加美元符号($),且字面值16进制不用h作为结尾,而是使用前缀0x
4. 操作数大小由b(byte 8-bit),w(word 16-bit),l(long 32-bit)跟在操作符号后而非在寄存器等之前加xxx ptr来指定大小
5. 内存寻址采用 disp(base, index, scale)来对应intel的[base + index*scale + disp] (disp和scale常量前不加美元符号($))
简单的一些转换举例:
Intel Code | AT&T Code |
---|---|
mov eax,1 | movl $1,%eax |
mov ebx,0ffh | movl $0xff,%ebx |
int 80h | int $0x80 |
mov ebx, eax | movl %eax, %ebx |
mov eax,[ecx] | movl (%ecx),%eax |
mov eax,[ebx+3] | movl 3(%ebx),%eax |
mov eax,[ebx+20h] | movl 0x20(%ebx),%eax |
add eax,[ebx+ecx*2h] | addl (%ebx,%ecx,0x2),%eax |
lea eax,[ebx+ecx] | leal (%ebx,%ecx),%eax |
sub eax,[ebx+ecx*4h-20h] | subl -0x20(%ebx,%ecx,0x4),%eax |
内联汇编基本语法
格式
基础版
asm("movl %ecx %eax");
__asm__("movl %ecx %eax");
两种格式都可以,前后加双下划线主要是为了避免“asm”已经被使用。
提高版