Ubuntu是安装在x86上的,我想要mips的汇编,但是gcc编译的汇编文件默认是AT&T格式的汇编,于是需要安装交叉编译工具链,看了几篇blog结果发现各种问题,不是要自己编译,就是软件源配置有问题,还有版本问题。因为Ubuntu原本的镜像源(/etc/apt/source.list)速度特别慢,还会出mis hashmach问题,于是先更换了软件源,测试了Ubuntu官方给的14.04的几个教育网的源http://wiki.ubuntu.org.cn/Template:14.04source,发现清华的ip6挺快的,于是将/etc/apt/source.list备份,并新建了source.list
sudo mv /etc/apt/sources.list{,.back}
vim /etc/apt/sources.list
添加清华的ipv6源
deb http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty main multiverse restricted universe
deb http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty-backports main multiverse restricted universe
deb http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty-proposed main multiverse restricted universe
deb http://mirrors.6.tuna.tsinghua.edu.cn//ubuntu/ trusty-security main multiverse restricted universe
deb http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty-updates main multiverse restricted universe
deb-src http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty main multiverse restricted universe
deb-src http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty-backports main multiverse restricted universe
deb-src http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty-proposed main multiverse restricted universe
deb-src http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty-security main multiverse restricted universe
deb-src http://mirrors.6.tuna.tsinghua.edu.cn/ubuntu/ trusty-updates main multiverse restricted universe
更新软件包列表并安装gcc-arm-linux-gnueabi
sudo apt-get update
sudo aptitude search arm-linux
sudo aptitude install gcc-arm-linux-gnueabi
whereis arm-linux-gnueabi-gcc
测试
arm-linux-gnueabi-gcc fibonacc.c -S
fibonacc.c 和 fibonacc.s内容如下:
int fib(int n)
{
int a = 0; int b = 1;
int c = a + b;
while(n > 1) {
c = a + b;
a =b; b = c;
n--;
}
return c;
}
.arch armv5t
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "fibonacc.c"
.text
.align 2
.global fib
.type fib, %function
fib:
@ args = 0, pretend = 0, frame = 24
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
add fp, sp, #0
sub sp, sp, #28
str r0, [fp, #-24]
mov r3, #0
str r3, [fp, #-16]
mov r3, #0
str r3, [fp, #-12]
ldr r2, [fp, #-16]
ldr r3, [fp, #-12]
add r3, r2, r3
str r3, [fp, #-8]
b .L2
.L3:
ldr r2, [fp, #-16]
ldr r3, [fp, #-12]
add r3, r2, r3
str r3, [fp, #-8]
ldr r3, [fp, #-12]
str r3, [fp, #-16]
ldr r3, [fp, #-8]
str r3, [fp, #-12]
ldr r3, [fp, #-24]
sub r3, r3, #1
str r3, [fp, #-24]
.L2:
ldr r3, [fp, #-24]
cmp r3, #1
bgt .L3
ldr r3, [fp, #-8]
mov r0, r3
add sp, fp, #0
ldmfd sp!, {fp}
bx lr
.size fib, .-fib
.ident "GCC: (Ubuntu/Linaro 4.7.3-12ubuntu1) 4.7.3"
.section .note.GNU-stack,"",%progbits
这里顺便介绍下常用的几种汇编格式:
GNU:维基百科上说:GNU,一个类UNIX的操作系统,由GNU计划推动,目标在于建立一个完全相容于UNIX的自由软件环境。这里GNU代表了一种平台,一类开发环境,更是一种汇编程序设计的语法格式。我们这里可以认为他代表一类组织,有自己的独特的程序设计规范,就是AT&T规范,一般称之为AT&T汇编,提到AT&T汇编,就应该知道这是另一种汇编语法格式,汇编指令是由处理器决定的。跟语法格式无关。
ARM:代表一类处理器,比如INTEL处理器,ARM处理器。不同公司设计的CPU核心,一般指令格式也不同。不同体系结构的CPU,指令集一般也不同,因为体系结构对应指令集。
汇编:指的是汇编语言。在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理的系统软件。GNU有自己的一套独立的编译环境,所遵从的C语言、汇编语言等程序设计的语法格式也是不同的。
如,PC机上,对于x86系列处理器,有AT&T汇编和INTEL汇编两种语法格式。这两种格式的汇编,有指令大小写、操作数赋值方向、前缀、后缀、寻址方式等区别。因为是一类处理器,X86系列,指令是一样的。
详细可以看这篇blog:http://www.cnblogs.com/hicjiajia/archive/2012/05/22/2513999.html