分类: LINUX
2013-04-12 10:22:48
在Linux内核中使用了AT&T格式的汇编指令而非Intel的格式,它们之间的区别
1. common
(1)Intel一般用大小字母,而AT&T一般用小写
(2)寄存器:AT&T的寄存器要加%前缀,而Intel不需要。
(3)立即数:AT&T的立即数要加前缀$,而Intel不需要。
AT&T: pushl $4
Intel: PUSH 4
(4)指令的源和目标操作数顺序
AT&T: movl %ecx,%eax ;%ecx—>%eax
Intel: MOV EAX,ECX ;ecx—>eax
(5)操作码
AT&T: “l”表示长整数(32位),"w”表示字(16位),“b”表示字节(8位)。
Intel的语法中,则要在内存单元操作数的前面加上byte ptr,word ptr和dword ptr,"dword”对应“long”。
(6) jmp && call && ret
2. 内存寻址
Intel语法 |
AT&T语法 |
segreg:[base+index*scale+disp] |
%segreg:disp(base,index,scale) |
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 |
1. 单条指令
__asm__表示是一条汇编指令。
Question: __volatile__这里表示什么意思呢?
2. 多条指令用"\n"来分隔
这里代码会展开成如下所示:
要说明一下的是1f是什么意思呢?这里f表示forward,就是向前跳转。如果是b就是backward向后跳转。
3. Quite Difficult Example