㈠ arm體系將寄存器訪問用load-store構實現,有什麼好處
hfgcht
㈡ ARM CPU如何在寄存器不足的情況下訪問局部變數
局部變數說白了就是在棧空間中的內存,就是說在沒有寄存器的時候怎麼訪問內存,這個問題編譯器基本不會讓它發生。如果是自己寫的匯編,那就是程序員該注意的了。在沒有寄存器的時候就要先保存寄存器。
ARM指令跟X86指令差別還是非常大的,我這里找了2條指令:
寄存器間接定址:
LDR R1,[R2] ;將R2作為地址,讀數據到R1中
基址定址:
LDR R2,[R3,#0x0F] ;將R3加0x0f作為地址,讀數據到R2中
ARM就是這么訪問內存的,包括外設寄存器也是這樣訪問的。它們是統一編址的。不像X86分開編址,用不同的指令訪問內存和外設。
㈢ ARM處理器的寄存器都是程序員可訪問的嗎
這要看ARM處理器的開發人員是怎麼編輯他的許可權了,一般的程序員是只有使用許可權的
㈣ ARM微處理器有哪幾種基本定址方式
ARM處理器有9種基本定址方式:定址方式是根據指令中給出的地址碼欄位來實現尋找真實操作數地址的方式。
1.寄存器定址
操作數的值在寄存器中,指令中的地址碼欄位給出的是寄存器編號,寄存器的內容是操作數,指令執行時直接取出寄存器值操作。
例如指令:
MOVR1,R2;R1←R2
SUBR0,R1,R2;R0←R1-R2
2.立即定址
在立即定址指令中數據就包含在指令當中,立即定址指令的操作碼欄位後面的地址碼部分就是操作數本身,取出指令也就取出了可以立即使用的操作數(也稱為立即數)。立即數要以「#」為前綴,表示16進制數值時以「0x」表示。
例如指令:
ADDR0,R0,#1;R0←R0+1
MOVR0,#0xff00;R0←0xff00
3.寄存器移位定址
寄存器移位定址是ARM指令集特有的定址方式。第2個寄存器操作數在與第1個操作數結合之前,先進行移位操作。
例如指令:
MOVR0,R2,LSL#3;R2的值左移3位,結果放入R0,即R0=R2*8
ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然後和R1相與操作,結果放入R1
可採用的移位操作如下:
LSL:邏輯左移(LogicalShiftLeft),寄存器中字的低端空出的位補0。
LSR:邏輯右移(LogicalShiftRight),寄存器中字的高端空出的位補0。
ASR:算術右移(ArithmeticShiftRight),移位過程中保持符號位不變,即如果源操作數為正數,則字的高端空出的位補0,否則補1
ROR:循環右移(RotateRight),由字的低端移出的位填入字的高端空出的位
RRX:帶擴展的循環右移(RotateRightextendedby1place),操作數右移一位,高端空出的位用原C標志值填充。
各移位操作過程如圖所示。
4.寄存器間接定址
指令中的地址碼給出的是一個通用寄存器編號,所需要的操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針,操作數存放在存儲器中。
例如指令:
LDRR0,[R1];R0←[R1](將R1中的數值作為地址,取出此地址中的數據保存在R0中)
STRR0,[R1];[R1]←R0
5.變址定址
變址定址是將基址寄存器的內容與指令中給出的偏移量相加,形成操作數的有效地址,變址定址用於訪問基址附近的存儲單元,常用於查表,數組操作,功能部件寄存器訪問等。
例如指令:
LDRR2,[R3,#4];R2←[R3+4](將R3中的數值加4作為地
址,取出此地址的數值保存在R2中)
STRR1,[R0,#-2];[R0-2]←R1(將R0中的數值減2作為地址,把R1中的內容保存到此地址位置)
6.多寄存器定址
採用多寄存器定址方式,一條指令可以完成多個寄存器值的傳送,這種定址方式用一條指令最多可以完成16個寄存器值的傳送。
例如指令:
LDMIAR0,{R1,R2,R3,R5};
7.堆棧定址
堆棧是一種數據結構,堆棧是特定順序進行存取的存儲區,操作順序分為「後進先出」和「先進後出」,堆棧定址時隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區域(堆棧),指針所指向的存儲單元就是堆棧的棧頂。存儲器生長堆棧可分為兩種:
向上生長:向高地址方向生長,稱為遞增堆棧(AscendingStack)。
向下生長:向低地址方向生長,稱為遞減堆棧(DecendingStack)。
堆棧指針指向最後壓入的堆棧的有效數據項,稱為滿堆棧(FullStack);堆棧指針指向下一個要放入的空位置,稱為空堆棧(EmptyStack)。
這樣就有四種類型的堆棧工作方式,ARM微處理器支持這四種類型的堆棧工作方式,即:
滿遞增堆棧:堆棧指針指向最後壓入的數據,且由低地址向高地址生成。如指令LDMFA,STMFA等。
滿遞減堆棧:堆棧指針指向最後壓入的數據,且由高地址向低地址生成。如指令LDMFD,STMFD等。
空遞增堆棧:堆棧指針指向下一個將要放入數據的空位置,且由低地址向高地址生成。如指令LDMEA,STMEA等。
空遞減堆棧:堆棧指針指向下一個將要放入數據的空位置,且由高地址向低地址生成。如指令LDMED,STMED等。
8.塊復制定址
塊復制定址用於把一塊從存儲器的某一位置復制到另一位置,是一個多寄存器傳送指令。例如指令:
STMIAR0!,{R1-R7};將R1~R7的數據保存到存儲器中,存儲器指針在保存第一個值之後增加,增長方向為向上增長。
STMDAR0!,{R1-R7};將R1~R7的數據保存到存儲器中,存儲器指針在保存第一個值之後增加,增長方向為向下增長。
9.相對定址
相對定址是變址定址的一種變通,由程序計數器PC提供基準地址,指令中的地址碼欄位作為偏移量,兩者相加後得到的地址即為操作數的有效地址。
例如指令:
BLROUTE1;調用到ROUTE1子程序
BEQLOOP;條件跳轉到LOOP標號處
LOOPMOVR2,#2
ROUTE1
㈤ arm 寄存器的問題
是 R2 寄存器的內容為地址的存儲器數據。
例如:R2 的值為 0x20001234,而存儲器中地址 0x20001234 中存儲的數據為 0x55AA55AA(32位),那麼 LDR R1, [R2] 執行後,R1 的內容將變成 0x55AA55AA。
㈥ 關於單片機(arm)中怎樣用指針訪問寄存器
你的方法基本正確。
不同倍數的寄存器定義成對應的數據類型指針就可。如:
8位: *(unsigned char *)addr = value
16位: *(unsigned short *)addr = value
32位: *(unsigned int *)addr = value
㈦ 關於arm寄存器地址的問題。
奇了怪了,你是從哪邊看出寄存器地址線只有4位的?!
㈧ ARM寄存器地址
簡單的歸納就是,CPU要通過BUS訪問的,都是統一編址的,包括內存和一些外設的寄存器之類。BUS負責address的map,並且有arbiter。
CPU能直接訪問的,就是不需要編址的,例如ARM的寄存器,Cache之類。