关闭

AT&T汇编

667人阅读 评论(0) 收藏 举报
分类:

原文: http://blog.csdn.net/bigloomy/article/details/6581754


AT&T汇编和8086汇编语言虽然两者很相似,但是还是不能根据8086的语法规则来读AT&T汇编的吧,所以还是要看看AT&T汇编的语法规则,因为在读内核代码时,跟硬件打交道的部分代码是用AT&T汇编编写的,所以不可避免的会遇到AT&T汇编,下面先来看看AT&T汇编的语法规则吧。

一、 大小写
  INTEL格式的指令使用大写字母,而AT&T格式的使用小写字母。
例:
 
INTEL  AT&T
MOV EAX,EBX  movl %ebx,%eax 
 
二、 操作数赋值方向
  在INTEL语法中,第一个表示目的操作数,第二个表示源操作数,赋值方向从右向左。
AT&T语法第一个为源操作数,第二个为目的操作数,方向从左到右,合乎自然。
例:
INTEL                        AT&T
MOV EAX,EBX  movl %ebx,%eax 
 
三、前缀
  在 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
CALL FAR SECTION:OFFSET  lcall $secion:$offset
JMP FAR SECTION:OFFSET  ljmp $secion:$offset
RET FAR SATCK_ADJUST  lret $stack_adjust 
 
 
四、间接寻址语法
  INTEL 中基地址使用“[” 、“]” ,而在 AT&T 中使用“(”、“)” ;另外处理复杂操作数的
语法 也 不同 , INTEL 为 Segreg:[base+index*scale+disp] , 而在 AT&T 中为
%segreg:disp(base,index,sale),其中segreg,index,scale,disp都是可选的,在指定
index而没有显式指定Scale的情况下使用默认值 1。Scale和 disp不需要加前缀“&” 。
INTEL  AT&T
Instr
  foo,segreg:[base+index*scale+disp]
instr
  %segreg:disp(base,index,scale),foo 
 
五、 后缀
  AT&T 语法中大部分指令操作码的最后一个字母表示操作数大小, “b”表示 byte(一个
字节) ;“w”表示 word(2 个字节) ;“l”表示 long(4 个字节) 。INTEL 中处理内存操作数
时也有类似的语法如:BYTE PTR、WORD PTR、DWORD PTR。
例:
INTEL  AT&T
mov al, bl  movb %bl,%al
mov ax,bx  movw %bx,%ax
mov eax, dword ptr [ebx]  movl (%ebx), %eax
 
在 AT&T 汇编指令中,操作数扩展指令有两个后缀,一个指定源操作数的字长,另一个
指定目标操作数的字长。AT&T 的符号扩展指令的为“movs” ,零扩展指令为“movz” (相应
的 Intel指令为“movsx”和“movzx”) 。因此, “movsbl %al,%edx”表示对寄存器 al 中的
字节数据进行字节到长字的符号扩展,计算结果存放在寄存器edx中。下面是一些允许的操
作数扩展后缀:  
bl: 字节->长字 
bw: 字节->字 
wl: 字->长字 
 
跳转指令标号后的后缀表示跳转方向, “f” 表示向前 (forward) , “b” 表示向后 (back) 。 
例: jmp 1f
1:       jmp 1f
1:

有了上面内容做基础,在接下来我们讲解GCC内嵌汇编时就好多了。


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

AT&T汇编语言及其寻址方式简述

汇编语言早已脱离了主流编程语言的行列,可以说现在基本上没有人想用它来完成什么大的项目,但是作为一个程序员懂得汇编语言是一种修养一种底蕴。看不懂汇编的程序员就像不会画鸡蛋的达芬奇,像不会写楷书的王羲之,...
  • ZR_Lang
  • ZR_Lang
  • 2014-10-10 14:48
  • 2691

AT&T汇编学习笔记

AT&T汇编和intel汇编的区别 (1)      在Intel格式中大多使用大写字母,而在AT&T格式中都是用小写字母。 (2)      在AT&T格...
  • hu3167343
  • hu3167343
  • 2014-07-10 18:16
  • 5401

AT&T与Intel格式的汇编语法

一、AT&T 格式Linux 汇编语法格式 在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如: AT...
  • lincyang
  • lincyang
  • 2014-06-27 21:10
  • 3089

AT&T汇编语言语法

阅读linux0.01预备知识:为启动代码和C语言内嵌汇编做准备 0.3.1 Overview    开发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关...
  • u014160900
  • u014160900
  • 2015-04-06 10:59
  • 1794

AT&T格式汇编学习

Linux内核代码大量使用内嵌汇编,以进行某些特定功能的实现,或对某功能进行快速实现。使用的汇编格式为AT&T,本文就该种格式的汇编和Intel格式的汇编进行讲述。网络上也有众多文章涉及到这方面,所以...
  • subfate
  • subfate
  • 2016-02-16 21:19
  • 846

AT&T汇编指令

AT&T汇编指令 GAS中每个操作都是有一个字符的后缀,表明操作数的大小。 C声明 GAS后缀 大小(字节) char ...
  • dayancn
  • dayancn
  • 2016-04-19 14:44
  • 2369

AT&T汇编语言——简单实例及工具演示

今天就来用具体实例代码来运用一下昨天所说的只个工具的用法吧 这几个实例主要的目的是来熟悉一下汇编相关工具的用法及应用一下昨天刚说的汇编程序模板。 我们用到的工具主要有as,ld,gcc,gdb,...
  • crazyboy2009
  • crazyboy2009
  • 2014-06-24 00:53
  • 6998

AT&T汇编指令总结

记录一下,方便以后查看~ 1.寄存器引用     引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。      80386有如下寄存器:...
  • SKY453589103
  • SKY453589103
  • 2015-11-10 20:38
  • 1849

AT&T 格式Linux 汇编语法

AT&T汇编是UNIX下惯用的汇编格式 l ,w,b是AT&T汇编中用来表示操作属性的限定符 l是长字(4字节), w是双字 b是一个字节 ...
  • chinaclock
  • chinaclock
  • 2015-12-16 18:51
  • 933

《深入理解计算机系统》AT&T x86汇编学习

感觉AT&T的汇编代码,比Intel格式的更好理解,设计者
  • xiezhihua120
  • xiezhihua120
  • 2014-04-28 23:06
  • 1329
    个人资料
    • 访问:353297次
    • 积分:6202
    • 等级:
    • 排名:第4652名
    • 原创:185篇
    • 转载:304篇
    • 译文:11篇
    • 评论:29条
    最新评论
    0.C/Cpp