AT&T汇编语言与GCC内嵌汇编简介 版本 0.1 时间04/3/30 EMAIL chforest_chang@hotmail.com 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汇编语句模板 2.3.2输出部分 2.3.3输入部分 2.3.4限制字符 2.3.5破坏描述部分 2.4GCC如何编译内嵌汇编代码 3后记 本节先介绍 AT&T汇编语言语法与INTEL汇编语法的差别,然后介绍GCC内嵌汇编语法。阅读本节需要读者具有INTEL 汇编语言基础。 1 AT&T 与INTEL的汇编语言语法的区别 1.1 指令大小写 INTEL格式的指令使用大写字母,而AT&T 格式的使用小写字母。 例: INTEL AT&T MOV EAX,EBX movl %ebx,%eax 1.2 指令操作数赋值方向 在INTEL语法中,第一个表示目的操作数,第二个表示源操作数,赋值方向从右向左。 AT&T语法第一个为源操作数,第二个为目的操作数,方向从左到右,合乎自然。 例: INTEL AT&T MOV EAX,EBX movl %ebx,%eax 1.3 指令前缀 在INTEL语法中寄存器和立即数不需要前缀; AT&T中寄存器需要加前缀“%”;立即数需要加前缀“$”。 例: INTEL AT&T MOV EAX,1 movl $1,%eax 符号常数直接引用,不需要加前缀,如: movl value , %ebx value为一常数; 在符号前加前缀 $, 表示引用符号地址, 如 movl $value, %ebx 是将value的地址放到ebx中。 总线锁定前缀“lock”: 总线锁定操作。“lock”前缀在Linux 核心代码中使用很多,特别是SMP 代码中。当总线锁定后其它CPU 不能存取锁定地址处的内存单元。 远程跳转指令和子过程调用指令的操作码使用前缀“l“,分别为ljmp,lcall, 与之相应的返回指令伪lret。 例: INTEL AT&T lcall $secion:$offs...
久病成医 | Prolonged Illness Makes the Patient a Good Doctor