linuxarm汇编
A. .text .global 这是什么意思arm linux 汇编
.text
.global
是arm-gcc编译器的关键词。
.text
指定了后续编译出来的内容放在代码段【可执行】;
.global
告诉编译器后续跟的是一个全局可见的名字【可能是变量,也可以是函数名】;
在本例中,_start是一个函数的起始地址,也是编译、链接后程序的起始地址。由于程序是通过加载器来加载的,必须要找到
_start名字的函数,因此_start必须定义成全局的,以便存在于编译后的全局符合表中,供其它程序【如加载器】寻找到。
B. 学习arm,Linux要有哪些要求
1,基于ARM芯片的Linux操作系统的开发,这是所有ARM开发中最简单的。由于参考资料齐全,因此新手一般从这里入手。在Linux环境下开发,其实不需要特别懂得ARM,只要精通c语言,了解Linux的系统编程接口就可以了。一般大学生只要有1年的实习机会,都可以学会。
2,真正学习ARM芯片的软件编程,主要是指学会ARM处理器指令集。目前,ARM处理器已经有多个系列,比如ARM7,ARM9,ARM11,Cortax-A8等等。更高级的ARM处理器其指令系统也都有所扩展。如果抛掉ARM汇编语言,只是使用C语言编程,那么就不算是精通ARM软件编程了,顶多算是精通C语言编程。如果要精通ARM汇编编程,就不是一件容易的事情了。首先你至少要明白每种不同的ARM芯片其汇编指令到底有哪些不同。在不同的软件功能要求下,如果使用特定的汇编语言来优化软件速度。比如,一个解码JPEG图片的软件,如何针对ARM9E芯片和ARM11芯片优化其解码算法?你要解决这个问题,至少你得知道JPEG图片如何解码。此外,如果一个软件要解码MP3音频,那么又该如何优化呢?你至少得懂得MP3的解码算法吧?学习ARM软件编程的主要任务就是把现有的算法用ARM芯片来实现最优化。否则没必要专门学习ARM编程。
C. arm linux 应用程序 如何内嵌汇编
在linux源代码中会有一部分c语言与汇编语言相交融的部分。
其中linux中汇编语言采用的不是我们通用的intel的汇编语言,而是采用的是AT&T格式的汇
编语言,它们之间有一些差别:
1
目标与源的方向不大一样
mov
ax,
bx
mov
%bx,
%ax
2
AT&T寄存器前要加入%
ax
%ax
3
AT&T立即数前面要加上$
add
ax,
4
add
%ax,$4
4
对于访问指令的操作数大小
intel的格式是在操作数前加上BYTE
PTR、DWORD
PTR等等
AT&T格式:在操作数后面加上b、l、w等
MOV
AL,
BYTE
PTR
FOO(intel)
movb
FOO,
%al
(AT&T)
5
间接寻址:
SECTION:[BASE+INDEX*SCALE+DISP]
Section:disp(base,
index,
scale)
C语言中插入汇编代码比纯粹的汇编要难,因为要设计到“如何分配使用寄存器、怎样与C语
言中变量相结合”
下面“=”代表只读,“+”代表读写
每个输出部分均以=开始
比如我想定义一个char型的变量,放入ax中
register
char
_temp
asm
("ax");
register
char
_temp
__asm__
("ax");
以上两种方式均正确
在这里我们通常看到普通的寄存器前面有两个%,代表下面的意思:第一寄存器前要有一个%
第二对于一个模板前要加入一个%
下面以一个在内核中常见的目的为了实现原子操作的一个函数为例子atomic_add来介绍
static
__inline__
void
atomic_add(int
i,
atomic_t
*v)
{
__asm__
__volatile__(
LOCK
"addl
%1,
%0"
:"=m"(v->counter)
:"ir"(i),
"m"(v->counter)
);
}
ir代表一个寄存器中的直接操作数
首先一个头部:__asm__
__volatile__();
asm();
__asm__();告诉编译器里面是汇编语言
:第一个冒号是输出部分:第二个冒号是输入部分
其实还有第三个冒号:代表着损坏部分
asm("汇编语句"
:输出部分
:输入部分
:损坏部分)
%0、%1
等等代表着一种模板操作数,其中数字到几取决于cpu寄存器数量
"m",
"v",
"o"
--内存单元
"r"
任意寄存器
"q"
表示eax、ebx、ecx、edx之一
"i",
"h"
表示立即数
"a",
"b",
"c",
"d"表示eax、ebx、ecx、edx
关键字LOCK表示在执行的时候把系统总线锁住,不让其他
cpu干扰。
D. 怎么学习linux arm的 汇编,我对汇编一窍不通,要怎么学习
建议先把C编程玩熟了,再研究汇编。
就像汽车一样,首先把车开好了,才能去研究怎么设计汽车。
不过我真的没怎么听说linux arm还用汇编的。
E. arm+linux应该怎么学
参考文章: http://www.amobbs.com/forum.php?mod=viewthread&tid=5509423&page=2
然而arm的并非想象中的那么顺利,bootloader启动代码等在单片机中从未有过的概念让我困惑了好长一段时候,arm汇编指令的学习也因为没有得到实际的验证而难以理解。如今想起来如果当初能有一个项目在做,先不去弄启动代码的话,也许弯路不用走那么长。那时在学校还不怎么会利用网络,都是靠书本来学习的,但发现书上讲的并不详细,我心中对启动代码的疑惑还没能解开,arm启动代码是怎样把code从nor flash中拷贝到sdram中的,我几乎看遍了市面上所有有关arm的书,都没有一本是仔细讲这个问题的。对于从单片机汇编转向arm C语言的我来说,C语言的执行环境问题也曾困扰着我。而这些问题我在书上、网络上找了好久都没有得到理想的答案。
其实arm并不难,难只是比单片机多了启动代码bootloader的概念。那时学arm汇编最好的书是周立功出的,周围的朋友都是用他的书来学的,于是我又买了他的板子加书,书是讲得不错,但他用的芯片和三星的完全不一样,启动代码也不一样,而启动代码被我看作是最关键的地方,最终easyarm也没有学好。
F. 我想以后做linux系统下的ARM开发 有必要学习8086汇编语言吗
有必要学习,嵌入式程序编写要用到汇编语言和c语言等,所以有必要学!
G. arm-linux-gcc工具链:汇编文件如何include c的头文件呢
按照楼上的帖子试了一下不行我是这样写的:a.h:#define
a
1a.S:.include
"a.h"mov
r0,#a然后用arm-linux-gcc
a.S
进行编译,报错:a.S:
Assembler
messages.S:3:
Error:
undefined
symbol
a
used
as
an
immediate
value问题出在哪里呢???
查看原帖>>