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問題出在哪裡呢???
查看原帖>>