① 幾道簡單ARM匯編代碼題
我來回答你吧,研究ARM匯編也有段時間了,在查相關資料,這個應該可以解決的,要是考試,我的答案100分至少85分吧。
26. MOV R0,#X
MOV R1,#64
CMP R0,R1
MOVHI RO,#0
MOVLS R2,#0
27. 字元串拷貝程序設計(用LDR和STR實現)
AREA StrCopy, CODE, READONLY
ENTRY ; 程序入口
start
LDR r1, =srcstr ; 初始串的指針
LDR r0, =dststr ; 結果串的指針
BL str ; 調用子程序執行復制
stop
MOV r0, #0x18 ; 執行中止
LDR r1, =0x20026 ;
SWI 0x123456 ;
str
LDRB r2, [r1],#1 ; 載入並且更新源串指針
STRB r2, [r0],#1 ; 存儲且更新目的串指針;
CMP r2, #0 ; 是否為0
BNE str ;
MOV pc,lr ;
AREA Strings, DATA, READWRITE
srcstr DCB "First string - source",0
dststr DCB "Second string - destination",0
END
29. 和26題差不多啊。
MOV R0,#X
MOV R1,#100
CMP R0,R1
MOVLS RO,#1
MOVHI R2,#1
25. 這題兩個函數功能一樣,處理器特性我就不說了,任何一本介紹ARM的書都有講解。在效率方面第一個好些,因為i=1和i=limit中
i=1中,只要讀i的地址,然後把2傳遞即可
i=limit中,既要讀i的地址,也要讀limit的地址,然後再傳值
很明顯第一個效率高。
我的這個回答是看過一本程序員面試寶典中的程序效率問題啟發的,應該不會錯的。呵呵……
希望我的回答對你有所收獲。祝你進步!
② 什麼是ARM匯編
匯編語言是比較依賴硬體的體系結構的,因為ARM的體系結構,和8086體系結構(也就是《微機原理》主要講的)不同,所以指令集上是有一些不同的,但是其實思想還是一樣的。ARM匯編是對ARM處理器的控制。學習嵌入式的bootloader時,就會有很多行代碼的匯編程序(基於ARM體系結構的),但是說實話,主要你能看懂,知道是怎麼跳轉執行的,就可以了!bootloader都是大公司里很多牛逼人,花幾個月寫的硬體初始化代碼,你要是自己能寫出來,並且好使,那你就NB了,年薪30萬左右了,慢慢來吧!我也是才菜鳥,大家一起加油!
③ arm編程,c語言中嵌入匯編實現1+2+3+...+100
C語言中static關鍵字的常見用法及舉例
在嵌入式系統開發中,目前使用的主要編程語言是C和匯編,
C++已經有相應的編譯器,但是現在使用還是比較少的。在稍大
規模的嵌入式軟體中,例如含有OS,大部分的代碼都是用C編
寫的,主要是因為C語言的結構比較好,便於人的理解,而且有
大量的支持庫。盡管如此,很多地方還是要用到匯編語言,例如
開機時硬體系統的初始化,包括CPU狀態的設定,中斷的使能,
主頻的設定,以及RAM的控制參數及初始化,一些中斷處理方
面也可能涉及匯編。另外一個使用匯編的地方就是一些對性能非
常敏感的代碼塊,這是不能依靠C編譯器的生成代碼,而要手工
編寫匯編,達到優化的目的。而且,匯編語言是和CPU的指令集
緊密相連的,作為涉及底層的嵌入式系統開發,熟練對應匯編語
言的使用也是必須的。
單純的C或者匯編編程請參考相關的書籍或者手冊,這里主要討
論C和匯編的混合編程,包括相互之間的函數調用。下面分四種
情況來進行討論,暫不涉及C++。
1. 在C語言中內嵌匯編
在C中內嵌的匯編指令包含大部分的ARM和Thumb指令,不過其
使用與匯編文件中的指令有些不同,存在一些限制,主要有下面
幾個方面:
a. 不能直接向PC寄存器賦值,程序跳轉要使用B或者BL指令
b. 在使用物理寄存器時,不要使用過於復雜的C表達式,避免物理寄存器沖突
c.
R12和R13可能被編譯器用來存放中間編譯結果,計算表達式值時可能將R0到R3、R12及R14用於子程序調用,因此要避免直接使用這些物理寄存器
d. 一般不要直接指定物理寄存器,而讓編譯器進行分配
內嵌匯編使用的標記是 __asm或者asm關鍵字,用法如下:
__asm
{
instruction [; instruction]
…
[instruction]
}
asm(「instruction [; instruction]」);
下面通過一個例子來說明如何在C中內嵌匯編語言,
#include
void my_strcpy(const char *src, char *dest)
{
char ch;
__asm
{
loop:
ldrb ch, [src], #1
strb ch, [dest], #1
cmp ch, #0
bne loop
}
}
int main()
{
char *a = "forget it and move on!";
char b[64];
my_strcpy(a, b);
printf("original: %s", a);
printf("ed: %s", b);
return 0;
}
在這里C和匯編之間的值傳遞是用C的指針來實現的,因為指針
對應的是地址,所以匯編中也可以訪問。
2. 在匯編中使用C定義的全局變數
內嵌匯編不用單獨編輯匯編語言文件,比較簡潔,但是有諸多限
制,當匯編的代碼較多時一般放在單獨的匯編文件中。這時就需
要在匯編和C之間進行一些數據的傳遞,最簡便的辦法就是使用
全局變數。
/* cfile.c
* 定義全局變數,並作為主調程序
*/
#include
int gVar_1 = 12;
extern asmDouble(void);
int main()
{
printf("original value of gVar_1 is: %d", gVar_1);
asmDouble();
printf(" modified value of gVar_1 is: %d", gVar_1);
return 0;
}
對應的匯編語言文件
;called by main(in C),to double an integer, a global var defined in C
is used.
AREA asmfile, CODE, READONLY
EXPORT asmDouble
IMPORT gVar_1
asmDouble
ldr r0, =gVar_1
ldr r1, [r0]
mov r2, #2
mul r3, r1, r2
str r3, [r0]
mov pc, lr
END
3. 在C中調用匯編的函數
在C中調用匯編文件中的函數,要做的主要工作有兩個,一是在
C中聲明函數原型,並加extern關鍵字;二是在匯編中用
EXPORT導出函數名,並用該函數名作為匯編代碼段的標識,最
後用mov pc, lr返回。然後,就可以在C中使用該函數了。從
C的角度,並不知道該函數的實現是用C還是匯編。更深的原因
是因為C的函數名起到表明函數代碼起始地址的左右,這個和匯
編的label是一致的。
/* cfile.c
* in C,call an asm function, asm_strcpy
* Sep 9, 2004
*/
#include
extern void asm_strcpy(const char *src, char *dest);
int main()
{
const char *s = "seasons in the sun";
char d[32];
asm_strcpy(s, d);
printf("source: %s", s);
printf(" destination: %s",d);
return 0;
}
;asm function implementation
AREA asmfile, CODE, READONLY
EXPORT asm_strcpy
asm_strcpy
loop
ldrb r4, [r0], #1 ;address increment after read
cmp r4, #0
beq over
strb r4, [r1], #1
b loop
over
mov pc, lr
END
在這里,C和匯編之間的參數傳遞是通過ATPCS(ARM
Thumb Procere Call Standard)的規定來進行的。簡單的說就
是如果函數有不多於四個參數,對應的用R0-R3來進行傳遞,多
於4個時藉助棧,函數的返回值通過R0來返回。
4. 在匯編中調用C的函數
在匯編中調用C的函數,需要在匯編中IMPORT 對應的C函數名
,然後將C的代碼放在一個獨立的C文件中進行編譯,剩下的工
作由連接器來處理。
;the details of parameters transfer comes from ATPCS
;if there are more than 4 args, stack will be used
EXPORT asmfile
AREA asmfile, CODE, READONLY
IMPORT cFun
ENTRY
mov r0, #11
mov r1, #22
mov r2, #33
BL cFun
END
/*C file, called by asmfile */
int cFun(int a, int b, int c)
{
return a + b + c;
}
在匯編中調用C的函數,參數的傳遞也是通過ATPCS來實現
的。需要指出的是當函數的參數個數大於4時,要藉助stack,具
體見ATPCS規范
④ 在arm的匯編程序中有哪幾種偽指令
在ARM匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統的助記符不同,沒有相對應的操作碼,通常稱這些特殊指令助記符為偽指令,他們所完成的操作稱為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種准備工作的,這些偽指令僅在匯編過程中起作用,一旦匯編結束,偽指令的使命就完成。
在ARM的匯編程序中,有如下幾種偽指令:符號定義偽指令、數據定義偽指令、匯編控制偽指令、宏指令以及其他偽指令。
4.1.1 符號定義(Symbol Definition)偽指令
符號定義偽指令用於定義ARM匯編程序中的變數、對變數賦值以及定義寄存器的別名等操作。常見的符號定義偽指令有如下幾種:
— 用於定義全局變數的GBLA、GBLL和GBLS。
— 用於定義局部變數的LCLA、LCLL和LCLS。
— 用於對變數賦值的SETA、SETL、SETS。
— 為通用寄存器列表定義名稱的RLIST。
1、 GBLA、GBLL和GBLS
語法格式:
GBLA(GBLL或GBLS) 全局變數名
GBLA、GBLL和GBLS偽指令用於定義一個ARM程序中的全局變數,並將其初始化。其中:
GBLA偽指令用於定義一個全局的數字變數,並初始化為0;
GBLL偽指令用於定義一個全局的邏輯變數,並初始化為F(假);
GBLS偽指令用於定義一個全局的字元串變數,並初始化為空;
由於以上三條偽指令用於定義全局變數,因此在整個程序范圍內變數名必須唯一。
使用示例:
GBLA Test1 ;定義一個全局的數字變數,變數名為Test1
Test1 SETA 0xaa ;將該變數賦值為0xaa
GBLL Test2 ;定義一個全局的邏輯變數,變數名為Test2
Test2 SETL {TRUE} ;將該變數賦值為真
GBLS Test3 ;定義一個全局的字元串變數,變數名為Test3
Test3 SETS 「Testing」 ;將該變數賦值為「Testing」
2、 LCLA、LCLL和LCLS
語法格式:
LCLA(LCLL或LCLS) 局部變數名
LCLA、LCLL和LCLS偽指令用於定義一個ARM程序中的局部變數,並將其初始化。其中:
LCLA偽指令用於定義一個局部的數字變數,並初始化為0;
LCLL偽指令用於定義一個局部的邏輯變數,並初始化為F(假);
LCLS偽指令用於定義一個局部的字元串變數,並初始化為空;
以上三條偽指令用於聲明局部變數,在其作用范圍內變數名必須唯一。
使用示例:
LCLA Test4 ;聲明一個局部的數字變數,變數名為Test4
Test3 SETA 0xaa ;將該變數賦值為0xaa
LCLL Test5 ;聲明一個局部的邏輯變數,變數名為Test5
Test4 SETL {TRUE} ;將該變數賦值為真
LCLS Test6 ;定義一個局部的字元串變數,變數名為Test6
Test6 SETS 「Testing」 ;將該變數賦值為「Testing」
3、 SETA、SETL和SETS
語法格式:
變數名 SETA(SETL或SETS) 表達式
偽指令SETA、SETL、SETS用於給一個已經定義的全局變數或局部變數賦值。
SETA偽指令用於給一個數學變數賦值;
SETL偽指令用於給一個邏輯變數賦值;
SETS偽指令用於給一個字元串變數賦值;
其中,變數名為已經定義過的全局變數或局部變數,表達式為將要賦給變數的值。
使用示例:
LCLA Test3 ;聲明一個局部的數字變數,變數名為Test3
Test3 SETA 0xaa ;將該變數賦值為0xaa
LCLL Test4 ;聲明一個局部的邏輯變數,變數名為Test4
Test4 SETL {TRUE} ;將該變數賦值為真
4、 RLIST
語法格式:
名稱 RLIST {寄存器列表}
RLIST偽指令可用於對一個通用寄存器列表定義名稱,使用該偽指令定義的名稱可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪問次序為根據寄存器的編號由低到高,而與列表中的寄存器排列次序無關。
使用示例:
RegList R www.hbbz08.com LIST {R0-R5,R8,R10} ;將寄存器列表名稱定義為RegList,可在ARM指令LDM/STM中通過該名稱訪問寄存器列表。
4.1.2 數據定義(Data Definition)偽指令
數據定義偽指令一般用於為特定的數據分配存儲單元,同時可完成已分配存儲單元的初始化。常見的數據定義偽指令有如下幾種:
— DCB 用於分配一片連續的位元組存儲單元並用指定的數據初始化。
— DCW(DCWU) 用於分配一片連續的半字存儲單元並用指定的數據初始化。
— DCD(DCDU) 用於分配一片連續的字存儲單元並用指定的數據初始化。
— DCFD(DCFDU)用於為雙精度的浮點數分配一片連續的字存儲單元並用指定的數據初始化。
— DCFS(DCFSU) 用於為單精度的浮點數分配一片連續的字存儲單元並用指定的數據初始化。
— DCQ(DCQU) 用於分配一片以8位元組為單位的連續的存儲單元並用指定的數據初始化。
— SPACE 用於分配一片連續的存儲單元
— MAP 用於定義一個結構化的內存表首地址
— FIELD 用於定義一個結構化的內存表的數據域
1、 DCB
語法格式:
標號 DCB 表達式
DCB偽指令用於分配一片連續的位元組存儲單元並用偽指令中指定的表達式初始化。其中,表達式可以為0~255的數字或字元串。DCB也可用「=」代替。
使用示例:
Str DCB 「This is a test!」 ;分配一片連續的位元組存儲單元並初始化。
2、 DCW(或DCWU)
語法格式:
標號 DCW(或DCWU) 表達式
DCW(或DCWU)偽指令用於分配一片連續的半字存儲單元並用偽指令中指定的表達式初始化。其中,表達式可以為程序標號或數字表達式。。
用DCW分配的字存儲單元是半字對齊的,而用DCWU分配的字存儲單元並不嚴格半字對齊。
使用示例:
DataTest DCW 1,2,3 ;分配一片連續的半字存儲單元並初始化。
3、 DCD(或DCDU)
語法格式:
標號 DCD(或DCDU) 表達式
DCD(或DCDU)偽指令用於分配一片連續的字存儲單元並用偽指令中指定的表達式初始化。其中,表達式可以為程序標號或數字表達式。DCD也可用「&」代替。
用DCD分配的字存儲單元是字對齊的,而用DCDU分配的字存儲單元並不嚴格字對齊。
使用示例:
DataTest DCD 4,5,6 ;分配一片連續的字存儲單元並初始化。
4、 DCFD(或DCFDU)
語法格式:
標號 DCFD(或DCFDU) 表達式
DCFD(或DCFDU)偽指令用於為雙精度的浮點數分配一片連續的字存儲單元並用偽指令中指定的表達式初始化。每個雙精度的浮點數占據兩個字單元。
用DCFD分配的字存儲單元是字對齊的,而用DCFDU分配的字存儲單元並不嚴格字對齊。
使用示例:
FDataTest DCFD 2E115,-5E7 ;分配一片連續的字存儲單元並初始化為指定的雙精度數。
5、 DCFS(或DCFSU)
語法格式:
標號 DCFS(或DCFSU) 表達式
DCFS(或DCFSU)偽指令用於為單精度的浮點數分配一片連續的字存儲單元並用偽指令中指定的表達式初始化。每個單精度的浮點數占據一個字單元。
用DCFS分配的字存儲單元是字對齊的,而用DCFSU分配的字存儲單元並不嚴格字對齊。
使用示例:
FDataTest DCFS 2E5,-5E-7 ;分配一片連續的字存儲單元並初始化為指定的單精度數。
6、 DCQ(或DCQU)
語法格式:
標號 DCQ(或DCQU) 表達式
DCQ(或DCQU)偽指令用於分配一片以8個位元組為單位的連續存儲區域並用偽指令中指定的表達式初始化。
用DCQ分配的存儲單元是字對齊的,而用DCQU分配的存儲單元並不嚴格字對齊。
使用示例:
DataTest DCQ 100 ;分配一片連續的存儲單元並初始化為指定的值。
7、 SPACE
語法格式:
標號 SPACE 表達式
⑤ C語言和匯編語言的相互調用
淺談C程序中調用匯編模塊的方法
C語言是目前非常流行的一種編程語言,除具有高級語言使用方便靈活、數據處理能力強、 編程簡單等優點外,還可實現匯編語言的大部分功能,如可直接對硬體進行操作、生成的 目標代碼質量較高且執行的速度較快等。所以在工程上對硬體處理速度要求不很高的情況下, 基本可以用C代替匯編語言,編寫介面電路的控制軟體。但C也不能完全取代匯編語言,如在一些對速度要求很高的實時控制系統中,以及對硬體的特殊控制方面,C有時也不能完全很好勝任,還需要匯編語言來編寫。因為匯編語言目標代碼更精練,對硬體直接控制能力更強和執行速度更快,但匯編語言編程煩難、表達能力差也顯而易見。比較好的解決辦法是C與匯編語言混合編程,即用C編寫軟體的調度程序、用戶界面以及速度要求不高的控制部分,而用匯編語言對速度敏感部分提供最高速度的處理模塊,供C調用。這種方法提供了最佳的軟體設計方案,做到了兼顧速度效率高和靈活方便。由於本人的畢業設計需要C程序中調用匯編模塊的方法來提高ARM定點指令的執行速度,故對這方面進行了學習。學習心得如下:
對於C和匯編語言的介面主要有兩個問題需要解決。
一、調用者與被調用者的參數傳遞
這種數據傳遞通過堆棧完成,在執行調用時從調用程序參數表中的最後一個參數開始 ,自動依次壓入堆棧;將所有參數壓入堆棧後,再自動將被調用程序執行結束後的返回地址 (斷點)壓入堆棧,以使被調程序結束後能返回主調程序的正確位置而繼續執行。例如一調用名為add匯編程序模塊的主函數:main( ){...... add(dest,op1,op2,flages);......}。在此例中對主函數進行反匯編,主函數在調用add函數前自動組織的堆棧。
.
.
.
lea 0xfffffffe8(%ebp),%eax #flages數組的首地址入棧
push %eax
pushl 0xfffffff8(%ebp) #OP2入棧
pushl 0xfffffffc(%ebp) #OP1 入棧
pushl 0xfffffff0(%ebp) #dest地址入棧
call 0x80483f0 <add> #調用add函數
.
.
執行完add調用語句後,棧內數據結果如圖一所示。
進入匯編子程序後,為了能正確獲取主調程序並存入堆棧中的數據,被調的匯編子程序先後要做如下一些工作:
1、 保存esp的副本
進入匯編子程序後,子程序中免不了要有壓棧和出棧的操作,故ESP時刻在變化。為了能用 ESP訪問堆棧中的參數,安全辦法是一進入子程序後,先為ESP制副本,以後對傳遞參數的訪問 都用副本進行。一般可用EBP保存ESP,如:
push %ebp
mov %ebp,%esp
2、保留數據空間
如果匯編子程序中需要一些局部數據,可以簡單地減小ESP的值,以便在棧空間中保留出一段存貯區,用於存放局部數據,該區域須在子程序結束後恢復。如下語句可以保留一個局部數據區:
push %ebp
mov %ebp ,%esp
subl space,%esp;設space=4
movl $0x0,%ebp
movl $0x0,-2(%ebp)
如上語句段中,space是局部數據的總位元組數。在以後的應用中,由於ESP是變化的,而 EBP是 固定的,用負偏移量可以存取局部變數。上例利用EBP及偏移量,將兩個字的局部數 據初始化為0。
3、保留寄存器值
如果在被調子程序中用到ESI、EDI等其它寄存器,則應先把它們壓入堆棧,以保留寄存器原值 。例如,下例就是將ESI和EDI寄存器的值壓棧:
pushl %ebp
movl %ebp ,%esp
subl $space ,%esp,
pushl %esi
pushl %edi
4、獲取傳遞參數
作完了1~3步的操作後,結合上面C程序傳送參數這一例子,現在棧結構如圖二所示。
由此可見,EBP保留了ESP在參數傳遞完並將EBP壓棧後的一個副本,利用EBP可以很方便地訪問各參數。現假設各參數都是2位元組的整數值,在小模式編譯方式共佔用2個位元組。如果要將傳遞的參數op1、op2取出,並分別賦給ebx、ecx寄存器,可由下列語句完成這一功能:
movl 0x8(%ebp),%eax
movl 0xc(%ebp),%ecx
5、子程序返回值
當子程序的執行結果需要返回時,根據返回值的字長,C按如下約定接收返回值:1位元組在AL 寄存器中;2位元組在EAX寄存器中;4位元組則高位部分在EDX中、低位部分在EAX寄存器中。C可從這些寄存器中取出返回值。
6、退出匯編子程序
結束匯編子程序的步驟如下:
1) 若ESS、EDS、ESI或EDI已被壓棧,則需按保存它們的相反順序彈出它們。
2) 若在過程開始時分配了局部數據空間,則以指令 mov %esp和%ebp 恢復%esp。
3) 以指令pop %ebp 恢復%ebp ,該步是必須的。或者可以用leave語句來恢復%ebp 。它相當於movl %ebp, %esp; popl %ebp
4) 最後以ret結束匯編程序。
二、 說明和建立調用者與被調用者間的連系
為了建立調用與被調用模塊間的連接關系,被調用的匯編程序應用global,說明其可被外部模塊調用;而調用程序則應預先說明要引用的外部模塊名。下面通過我的例子進行說明,該例是C調用add0的匯編子程序。程序清單如下:
/* add.c */
#include <stdio.h>
extern void add(int *dest,int op1,int op2,short int*flages);
/*聲明調用外部的匯編函數*/
int main(void){
int op1,op2,result;
int *dest=&result;
short int flages[4]={0,0,0,0};
printf("please enter two soure operater:");
scanf("%x%x",&op1,&op2);
add(dest,op1,op2,flages);/*調用add0函數*/
printf("The result of ADD is :%x\n flages N(negative) Z(zero) C(carry) V(overflow:%d,%d,%d,%d\n",*dest,flages[3],flages[2],flages[1],flages[0]);
return 0;
}
#add.s
.text
.align 2
.global add
.type add,function
#定義add為外部可調用的函數
add:
push %ebp #ebp寄存器內容壓棧,保存add函數的上級調用函數的棧基地址
mov %esp,%ebp #esp值賦給ebp,設置add函數的棧基地址
mov 0x8(%ebp),%edx
mov 0x10(%ebp),%eax
add 0xc(%ebp),%eax
mov %eax,(%edx)
mov 0x14(%ebp),%eax
jo OF
C:
jc CF
S:
js SF
jz ZF
jmp out
OF:
movw $0x1,(%eax)
jmp C
CF:
movw $0x1,0x2(%eax)
jmp S
SF:
movw $0x1,0x6(%eax)
movw $0x0,0x4(%eax)
jmp out
ZF:
movw $0x1,0x4(%eax)
movw $0x0,0x6(%eax)
out:
leave #將ebp值賦給esp,pop先前棧內的上級函數棧的基地址給#ebp,恢復原棧基址
ret #add函數返回,回到上級的調用函數
其中.text 標志一個代碼段的開始,這是AT&T的段格式;global add;\n
type add,function說明add是公用的,可以由外部其它單獨編譯模塊調用。
將C源程序以文件名add.c存檔,匯編語言源程序以add.s 存檔;通過MAKE進行編譯和連接連接代碼如下:
all: myadd
myadd: adds.o addc.o
gcc –o myadd adds.o adc.o
adds.o: add.s
as –o adds.o add.s
addc.o: add.c
gcc –g –o addc.o add.c
由上可見,在C中調用匯編模塊很方便。所以我們在實際軟體開發中,可以採用混合編程的技術,從而盡可能利用各語言的優勢。既滿足實際問題的需要,又簡化設計過程,達到事半功倍的效果。
⑥ ARM體系結構與編程的作品目錄
第1章 ARM概述及其基本編程模型
1. 1 ARM技術的應用領域及其特點
1. 2 ARM體系結構的版本及命名方法
1. 2. 1 ARM體系結構的版本
1. 2. 2 ARM體系的變種
1. 2. 3 ARM/Thumb體系版本的命名格式
l. 3 ARM處理器系列
1. 3. 1 ARM7系列
1. 3. 2 ARM9系列
1. 3. 3 ARM9E系列
1. 3. 4 ARM1OE系列
1. 3. 5 SecurCore系列
l. 4 ARM處理器模式
1. 5 ARM寄存器介紹
1. 5. l 通用寄存器
1. 5. 3 程序狀態寄存器
1. 6 ARM體系的異常中斷
1. 6. 1 ARM中異常中斷種類
1. 6. 2 ARM處理器對異常中斷的響應過程
1. 6. 3 從異常中斷處理程序中返回
1. 7 ARM體系中存儲系統
1. 7. 1 ARM體系中的存儲空間
1. 7. 2 ARM存儲器格式
1. 7. 3 非對齊的存儲訪問操作
1. 7. 4 指令預取和自修改代碼
第2章 ARM指令分類及其定址方式
2. 1 ARM指令集概要介紹
2. 1. 1 ARM指令的分類
2. 1. 2 ARM指令的一般編碼格式
2. 1. 3 ARM指令的條件碼域
2. 2 ARM指令定址方式
2. 2. l 數據處理指令的操作數的定址方式
2. 2. 2 字及無符號位元組的Load/Store指令的定址方式
2. 2. 3 雜類Load/Store指令的定址方式
2. 2. 4 批量Load/Store指令的定址方式
2. 2. 5 協處理器Load/Store指令的定址方式
第3章 ARM指令集介紹
3. 1 ARM指令集
3. 1. l 跳轉指令
3. l. 2 數據處理指令
3. 1. 3 乘法指令
3. 1. 4 雜類的算術指令
3. 1. 5 狀態寄存器訪問指令
3. l. 6 Load/Store內存訪問指令
3. 1. 7 批量Load/Store內存訪問指令
3. 1. 8 信號量操作指令
3. 1. 9 異常中斷產生指令
3. 1. 10 ARM協處理器指令
3. 2 一些基本的ARM指令功能段
3. 2. l 算術邏輯運算指令的應用
3. 2. 2 跳轉指令的應用
3. 2. 3 Loacl/Store指令的應用
3. 2. 4 批量Load/Store指令的應用
3. 2. 5 信號量指令的應用
3. 2. 6 與系統相關的一些指令代碼段
3. 3 Thumb指令介紹
第4章 ARM匯編語言程序設計
4. 1 偽操作
4. 1. l 符號定義偽操作
4. 1. 2 數據定義偽操作
4. 1. 3 匯編控制偽操作
4. 1. 4 棧中數據幀描述偽操作
4. 1. 5 信息報告偽操作
4. 1. 6 其他的偽操作
4. 2 ARM匯編語言偽指令
4. 3 ARM匯編語言語句格式
4. 3. 1 ARM匯編語言中的符號
4. 3. 2 ARM匯編語言中的表達式
4. 4 ARM匯編語言程序格式.
4. 4. l 匯編語言程序格式
4. 4. 2 匯編語言子程序調用
4. 5 ARM匯編編譯器的使用
4. 6 匯編程序設計舉例
4. 6. 1 ARM中偽操作使用實例
4. 6. 2 ARM中匯編程序實例
第5章 ARM存儲系統
5. 1 ARM存儲系統概述
5. 2 ARM中用於存儲管理的系統控制協處理器CP15
5. 2. 1 訪問CP15寄存器的指令
5. 2. 2 CP15中的寄存器
5. 3 存儲器管理單元MMU
5. 3. l 存儲器管理單元MMU概述
5. 3. 2 禁止/使能MMU
5. 3. 3 MMU中地址變換過程
5. 3. 4 MMU中存儲訪問許可權控制
5. 3. 5 MMU中的域
5. 3. 6 關於快表的操作
5. 3. 7 ARM中的存儲訪問失效
5. 4 高速緩沖存儲器和寫緩沖區
5. 4. 1 基本概念
5. 4. 2 cache的工作原理和地址映像方法
5. 4. 3 cache的分類
5. 4. 4 cache的替換演算法
5. 4. 5 緩沖技術的使用注意事項
5. 4. 6 存儲系統的一致性問題
5. 4. 7 cache內容鎖定
5. 4. 8 與cache和寫緩沖區相關的編程介面
5. 5 快速上下文切換技術
5. 5. l 快速上下文切換技術原理
5. 5. 2 快速上下文切換技術編程介面
5. 6 與存儲系統相關的程序設計指南
5. 6. l 地址空間
5. 6. 2 存儲器格式
5. 6. 3 非對齊的存儲訪問操作
5. 6. 4 指令預取和自修改代碼
5. 6. 5 IMB
5. 6. 6 存儲器映射的I/O空間
5. 7 AIOA存儲系統的實例
5. 7. 1 L7205的存儲系統概述
5. 7. 2 L7205中的SDRAM
5. 7. 3 L7205中的 MMU
第6章 ATPCS介紹
6. 1 ATPCS概述
6. 2 基本ATPCS
6. 2. l 寄存器的使用規則
6. 2. 2 數據棧使用規則
6. 2. 3 參數傳遞規則
6. 3 幾種特定的ATPCS
6. 3. l 支持數據棧限制檢查的ATPCS
6. 3. 2 支持只讀段位置無關(ROPI)的ATPCS
6. 3. 3 支持可讀寫段位置無關(RWPI)的ATPCS
6. 3. 4 支持ARM程序和Thumb程序混合使用的ATPCS
6. 3. 5 處理浮點運算的ATPCS
第7章 ARM程序和Thumb程序混合使用
7. 1 概述
7. 2 在匯編語言程序中通過用戶代碼支持interwork
7. 2. l 可以實現程序狀態切換的指令
7. 2. 2 與程序狀態切換相關的偽操作
7. 2. 3 進行狀態切換的匯編程序實例
7. 3 在C/C++程序中實現interwork
7. 4 在匯編語言程序中通過連接器支持interwork
7. 4. l 利用veneers實現匯編程序間的程序狀態切換
7. 4. 2 利用veneers實現匯編程序與C/C++程序間的程序狀態切換
第8章 CC++以及匯編語言的混合編程
8. l 內嵌匯編器的使用
8. 1. l 內嵌的匯編指令用法
8. 1. 2 內嵌的匯編器和armasm的區別
8. l. 3 在CC++程序中使用內嵌的匯編指令
8. 1. 4 內嵌匯編指令的應用舉例
8. 2 從匯編程序中訪問C程序變數
8. 3 匯編程序.C程序以及C++程序的相互調用
8. 3. l 在C++程序中使用C程序頭文件
8. 3. 2 匯編程序.C程序以及C++程序的相互調用舉例
第9章 異常中斷處理
9. 1 ARM中異常中斷處理概述
9. 1. 1 ARM體系中異常中斷種類
9. 1. 2 異常中斷向量表及異常中斷優先順序
9. 1. 3 異常中斷使用的寄存器
9. 2 進入和退出異常中斷的過程
9. 2. 1 ARM處理器對異常中斷的響應過程
9. 2. 2 從異常中斷處理程序中返回
9. 3 在應用程序中安裝異常中斷處理程序
9. 3. 1 在系統復位時安裝異常中斷處理程序
9. 3. 2 在C程序中安裝異常中斷處理程序
9. 4 SWI異常中斷處理程序
9. 4. 1 SWI異常中斷處理程序的實現
9. 4. 2 SWI異常中斷調用
9. 5 FIQ和IRQ異常中斷處理程序
9. 5. 1 IRQ/FIQ異常中斷處理程序
9. 5. 2 IRQ異常中斷處理程序舉例
9. 6 復位異常中斷處理程序
9. 7 未定義指令異常中斷
9. 8 指令預取中止異常中斷處理程序
9. 9 數據訪問中止異常中斷處理程序
第10章 ARM C/0++編譯器
10. 1 ARM C/C++編譯器概述
10. 1. 1 ARM C/C++編譯器及語言庫介紹
10. l. 2 ARM編譯器中與搜索路徑相關的一些基本概念
10. 2 ARM編譯器命令行格式
10. 2. l 過程調用標准
10. 2. 2 設置源程序語言類型
10. 2. 3 指定搜索路徑
10. 2. 4 設置預處理選項
10. 2. 5 設置輸出文件類型
10. 2. 6 指定目標處理器和ARM體系版本
10. 2. 7 生成調試信息
10. 2. 8 代碼生成的控制
10. 2. 9 控制警告信息的產生
10. 2. 10 編譯時進行的一些額外的檢查
10. 2. 11 控制錯誤信息
10. 3 ARM編譯器中的pragmas
10. 4 ARM編譯器特定的關鍵詞
10. 4. 1 用於聲明函數的關鍵詞
10. 4. 2 用於聲明交量的關鍵詞
10. 4. 3 用於限定數據類型的關鍵詞
10. 5 ARM編譯器支持的基本數據類型
10. 6 ARM編譯器中預定義宏
10. 7 ARM中C/C++庫
10. 7. 1 ARM中C/C++運行時庫概述
10. 7. 2 建立一個包含C/C++運行時庫的C/C++應用程序
10. 7. 3 建立不包含C運行時庫的應用程序
10. 7. 4 裁減C/C++運行時庫以適應特定的目標運行環境
第11章 ARM連接器
11. 1 ARM映像文件
11. 1. 1 ARM映像文件的組成
11. 1. 2 ARM映像文件的入口點
11. 1. 3 輸入段的排序規則
11. 2 ARM連接器介紹
11. 3 ARM連接器生成的符號
11. 3. 1 連接器生成的與域相關的符號
11. 3. 2 連接器生成的與輸出段相關的符號
11. 3. 3 連接器生成的與輸入段相關的符號
11. 4 連接器的優化功能
11. 5 運行時庫的使用
11. 5. 1 C/C++運行時庫與目標文件
11. 5. 2 查找需要的C/C++運行時庫
11. 5. 3 選擇合適種類的C/C++運行時庫
11. 5. 4 掃描C/C++運行時庫
11. 6 從一個映像文件中使用另一個映像文件中的符號
11. 6. 1 symdefs文件
11. 6. 2 建立symdefs文件
11. 6. 3 symdefs文件的使用
11. 7 隱藏或者重命名全局符號
11. 7. l steering文件的格式
11. 7. 2 steering文件中的命令
11. 8 ARM連接器命令行選項
11. 9 使用scatter文件定義映像文件的地址映射
11. 9. l scatter文件概述
11. 9. 2 satter文件中各部分介紹
11. 9. 3 scatter文件使用舉例
第12章 嵌入式應用程序示例
12. l 嵌入式應用程序設計的基本知識
12. 1. 1 嵌入式應用系統中的存儲映射
12. 1. 2 系統初始化
12. 2 使用semihosting的 C語言程序示例
12. 2. 1 源程序分析
12. 2. 2 生成映像文件
12. 3 一個嵌入式應用系統示例
12. 3. l 源程序分析
12. 3. 2 生成映像文件
12. 3. 3 本例中地址映射模式
12. 4 進行ROM/RAM地址重映射的嵌入式應用系統
12. 4. l 地址映射模式
12. 4. 2 源程序分析
12. 4. 3 生成映像文件
12. 5 一個嵌入式操作系統示例
第13章 使用CodeWarrior
13. 1 CodeWarrior for ADS概述
13. 2 簡單工程項目的使用
13. 2. 1 工程項目窗口
13. 2. 2 簡單工程項目的使用
13. 3 配置生成目標
13. 3. 1 Debug Settings對話框介紹
13. 3. 2 設置牛成目標的基本選項
13. 3. 3 匯編器選項設置
13. 3. 4 編譯器的選項設置
13. 3. 5 連接器的選項設置
13. 3. 6 fromELF工具的選項設置
13. 4 復雜工程項目的使用
13. 4. l 建立一個新的生成目標
13. 4. 2 將一個生成目標更名
13. 4. 3 建立生成目標之間的依賴關系
13. 4. 4 子工程項目的使用
13. 5 工程項目模板
13. 5. 1 ADS中工程項目模板的使用
13. 5. 2 建立用戶工程項目模板
13. 6 編譯和連接工程項目
13. 6. 1 編譯文件
13. 6. 2 生成工程項目
第14章 ARM體系中的調試方法
14. 1 ARM體系中調試系統概述
14. 2 基於Angel的調試系統
14. 2. l 基於Angel的調試系統的概述
14. 2. 2 使用Angel開發應用程序
14. 2. 3 Angel執行的操作
14. 2. 4 將Angel移植到特定的目標系統
14. 3 基於JTAG的調試系統
14. 3. l 基於JTAG的調試系統的特點
14. 3. 2 基於JTAG的調試系統結構
14. 3. 3 目標系統中的調試功能擴展部件
14. 3. 4 基於JTAG的調試過程
14. 4 ADW使用介紹
14. 4. 1 ADW概述
14. 4. 2 ADW中的窗口
14. 4. 3 ADW使用介紹
⑦ ARM編程,匯編語言代碼段有ENTRY 和C語言中有main函數,那麼對於整個程序來說哪裡是整個程序的入口
真正的入口地址對一個特定系統是固定的,即固定地址,而整個軟體的入口需要對應到這個固定地址上。軟體中哪個是入口得看makefile指定的link參數,一般而言匯編entry是入口,他先運行bootloader,它需要判斷運行狀態(下載、工廠模式、nand flash搬移、正常運行等等)。原理類似,特定系統可能存在特定的規定,得具體情況具體分析
⑧ 關於ARM中匯編與C程序的混合編程的參數傳遞問題!
匯編跳至C語言代碼執行,自動調用R0,R1等來傳遞參數,比如R0傳遞給a,R1傳遞給b,以此類推。返回時自動用R0傳遞返回值。希望對你有幫助