AT&T汇编与Intel汇编的一些区别
前些天在看kernel的i386的bootsect.S文件,该文件在1.11版本的时候还是用intel汇编的格式写的,不过我又读了2.4.20的 bootsect.S,里头却是AT&T的格式,不知道这个改动是在哪个版本发生的。由于很久没有接触过汇编,再加上bootsect.S中的内 容涉及很多的底层,例如硬盘的读取,int中断等等;让我花了非常多的时间才搞清楚了bootsect.S的工作原理。
AT&T的汇编和Intel的汇编主要是语法格式的区别,然后是指令的区别。AT&T的汇编指令和Intel的汇编指令大体相同,但是在 一些地方有些微的区别。我们先来看AT&T和Intel的格式差别,这些在网上很容易搜到,就当整理记录吧。
AT&T与Intle的汇编格式区别:
1)AT&T汇编语言中源操作数和目的操作数的位置与Intel的语法正好相反。
原本我没有太在意这个,因为在遇到MOV指令的时候,AT&T的格式反而更符合阅读习惯,但是在遇到subw %bx,%ax这个语句的时候,曾经让我困惑了很久,最后才反应过来,源操作数和目的操作数位置相反了;刚开始很不适应,因为sub这些指令我觉得 Intel的格式更符合习惯(还有其他的cmp等等)。
2)前缀。AT&T中所有立即数前缀$:$ 7,寄存器前要加%:%eax(据说后者是gnu的as的特性,而不是AT&T的)
3ÿ