首页| 论坛| 消息

标题:【转载】AT&T 汇编简介
作者:XChinux
日期:2005-08-17 11:55
内容:

原文见:http://www.moon-soft.com/program/doc/readelite9681.htm
前一段时间本来想翻译一篇关于gcc汇编的文章的。但现在找到了一篇。
希望对各位看Linux源代码时有用。
【 原文由 鬼哥 所发表 】
gcc采用的是AT&T的汇编格式,MS采用Intel的格式.
一 基本语法
语法上主要有以下几个不同.
★ 寄存器命名原则
AT&T: %eax Intel: eax
★ 源/目的操作数顺序
AT&T: movl %eax,%ebx Intel: mov ebx,eax
★ 常数/立即数的格式
AT&T: movl $_value,%ebx Intel: mov eax,_value
把_value的地址放入eax寄存器
AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d
★ 操作数长度标识
AT&T: movw %ax,%bx Intel: mov bx,ax
★寻址方式
AT&T: immed32(basepointer,indexpointer,indexscale)
Intel:
★寄存器间接寻址
AT&T: (%eax)
Intel:
★变址寻址
AT&T: _variable(%eax)
Intel:
AT&T: _array(,%eax,4)
Intel:
AT&T: _array(%ebx,%eax,8)
Intel:

二 基本的行内汇编
基本的行内汇编很简单,一般是按照下面的格式
asm("statements");
例如:asm("nop"); asm("cli");
asm 和 __asm__是完全一样的.
如果有多行汇编,则每一行都要加上 "\n\t"
例如:
asm( "pushl %eax\n\t"
"movl $0,%eax\n\t"
"popl %eax");
实际上gcc在处理汇编时,是要把asm(...)的内容"打印"到汇编
文件中,所以格式控制字符是必要的.
再例如:
asm("movl %eax,%ebx");
asm("xorl %ebx,%edx");
asm("movl $0,_booga);
在上面的例子中,由于我们在行内汇编中改变了edx和ebx的值,但是
由于gcc的特殊的处理方法,即先形成汇编文件,再交给GAS去汇编,
..


#1 [pinkscut 08-17 16:01]
xchinux老大真是热情啊。
小弟收下这篇了^_^

回复 发表
主题 版块