自整理,復習用,考試只考前三章——海底淤泥
一、簡答題
1ARM尋址方式有幾種?舉例說明ARM如何進行不同的尋址方式
6種
1.立即尋址: ADD R0,R0,#1
2.寄存器尋址: ADD R0,R1,R2,#2
3.寄存器間接尋址: LDR R0,[R1]
4.基址加偏址尋址: 1.前:LDR R0,[R1,#4] 2自動:LDR R0,[R1,#4]! 3后:LDR R0,[R1],#4
5堆棧尋址:1.STMFD SP!{R1-R7,LR} 2.LDMFD SP!{R1-R7,LR}
6塊拷貝尋址:1.LDMIA R0!,{R2-R9} 2.STMIA R1,{R2-R9}
7相對尋址:MOV PC,R14
2簡述ARM指令分類以及指令格式形式
1.數據處理指令 <op>{<cond>}{S}Rd,Rn,#<32位操作數> <op>{<cond>}{S}Rd,Rn,Rm,{<shift>}
2.Load/Store指令 LDR|STR{<cond>}{B}{T}Rd,[Rn,<offset>]{!} LDR|STR{<cond>}{B}{T}Rd,[Rn]<offset>
LDR|STR{<cond>}{B}{T}Rd,LABEL
LDM|STM<cond>}<add mode> Rn{!},<registers> SWP{<cond>}{B}Rd,Rm,[Rn]
3.狀態寄存器與通用寄存器之間的傳送指令 MRS{<cond>}Rd,CPSR|SPSR
4轉移指令 B{L}{<cond>} <target address>
5異常中斷產生指令 SWI{<cond>} <24位立即數> BKPT {immed_16} CLZ{cond} Rd,Rm
6協處理器指令 CDP{<cond>} <CP#>,<Copl>,CRd,CRn,CRm{,<Cop2>}
3假設SP的內容為0x8000,寄存器R1、R2的內容分別為0x01與0x10,存儲器內容為空,執行下述指令后,說明PC如何變化。存儲器以及寄存器內容如何變化。
STMFD sp!,{R1,R2} 0x8000<-0x10 0x7996<-0x10 sp=0x7996
LDMFD sp!,{R1,R2} r1<-[0x8000] r2<-[0x7996] sp=0x7996
4試比較ARM指令集與Thumb指令集的異同,並簡述各自的特點
ARM指令是31位二進制編碼
Thumb指令是16位二進制編碼
支持Thumb指令的ARM微處理器都可以執行ARM指令
5簡述Load指令與Store指令的功能
Load 寫
Store 讀
6ARM處理器如何進入和退出Thumb指令模式
進入:1.BX R0 R0最低位置1 2.利用異常進入
退出:2.BX R0 R0最低位置0 2.利用異常退出
7簡述ARM協處理器指令的分類
1.用於ARM處理器的初始化ARM協處理器的數據操作指令
2.用於ARM處理器的寄存器和ARM協處理器之間的數據傳送指令
3.用於ARM協處理器的寄存器和內存單元之間的傳送數據
8簡述ARM匯編語言中的偽操作、宏指令和偽指令的含義,偽操作和偽指令都分為哪幾類?
偽操作:特殊指令助記符號
宏指令:一段獨立的程序代碼,可以插入源程序
偽指令:特殊指令助記符號
偽操作:
1符號定義 2數據定義 3匯編控制
4框架描述 5信息報告 6其他
偽指令:
ADR、ADRL、LDR、NOP
9如何在匯編語言中定義和使用宏
使用#define
10ARM指令與Thumb指令有何異同
ARM指令是32位二進制編碼
Thumb指令是16位二進制編碼
11簡述IRQ和FIQ異常中斷處理程序中所使用的的__irq的作用
在程序內部增加中斷保護的代碼
12簡述#include<頭文件.h>與#inlcude“頭文件.h”的區別
<>標准頭文件
“”自定義頭文件
13簡述局部變量和全局變量的區別
局部變量作用域在局部范圍
全局變量作用域在全局范圍
14函數的存儲類說明符有幾種?各自的作用是什么?
static:表示本文件定義前和非本文件定義的文件中,該函數不能被調用
extern:表示該函數是全程序可見的
15變量的存儲類型是有幾種?各自的作用是什么?
auto——自帶存儲類型——局部
register——寄存器存儲類型——寄存器提高速度
entern——外部存儲類型——全局
static——靜態存儲類型
16變量在內存中存儲方式有幾種?分別是什么?
字符,整形,浮點數
17函數的參數傳遞方式有幾種?分別是什么?
1.參數個數固定的子程序傳遞參數——使用R0,R1,R2,R3
2.參數個數可變的子程序傳遞參數——使用R0,R1,R2,R3和數據棧,多於4個之后的參數倒序入棧
18簡述字符串與字符數組的存儲區別
字符串在最后一位有‘\0’
19修飾符const、volatile、near、far的作用是什么?用在什么地方?
const——常量修飾符
volatile——易失性修飾符
near,far——遠近修飾符
20定義指針變量是如果不進行初始化,可能出現什么問題?
出現野指針異常
21簡述const int * 和 int * const
const int * 說明指針指向對象是常量,是常量指針
int * const 說明指針本身是常量,是指針常量
const int * const 常量指針常量指向常量
22 char a,int b,shot c ,int d,與char a, shot c,int b,int d各自占用的存儲空間有何區別?
char a,int b,shot c ,int d 占4個字
char a, shot c,int b,int d 占3個字
23ATPCS包括哪些規則?分別是什么?
1.寄存器使用規則
2.數據棧使用規則
24如何使用內嵌匯編編程?使用內嵌匯編時需要注意什么?
__asm("指令");
__asm{
"指令"
"指令"
...
}
注意__asm是兩個_
25如何在ADS開發環境下使用malloc和free?使用 時需要注意什么?
內存單元分配通過C語言完成
26簡述結構類型與聯合類型的異同。
結構:每個變量都有獨立空間
聯合:所有變量共享一份空間
都可以儲存不同類型變量
27結構類型中存取成員有幾種方法?簡述他們的區別。
結構名.變量名
結構指針名->變量名
28ARM嵌入式軟件設計中,如何在匯編程序中實現子程序調用?
使用IMPORT來聲明C程序 import f
通過BL來調用子程序 bl f
二、程序設計題
1完成下面操作后,R0的內容是什么?
mov R1,#5
add R0,R1,LSL #3
2請將下面C語言代碼轉換成匯編語言。
if(a==0||b==1)
c=d+e
3編寫一段程序實現在C語言中調用匯編語言程序,實現將1KB大小的內存塊以字的形式復制到另一內存地址
4編寫一段匯編語言程序,用內嵌匯編指令實現中斷的使能和禁止
5編寫一段匯編語言程序,實現從ARM到Thumb的轉換
6編寫一段匯編語言程序,實現從Thumb到ARM的轉換
7編寫一段程序,實現匯編語言程序中訪問C語言程序中的變量
8編寫一段程序,利用跳轉表實現程序跳轉
9編寫以字節為單位的的字符串拷貝子程序,要求從存儲器某處拷貝到另一處。源字符串的起始地址放入R1,長度(以字節為單位)放入R2,目的字符串的起始地址放入R3
10編寫一段C語言與匯編語言的混合編程代碼,在C語言中調用匯編語言代碼,完成字符串str1和str2內容的互換。