2012-04-17 37 views
2

在ARM程序集中執行ldr r0,[r0]是否合法?ldr中的相同源和目標寄存器

+3

爲什麼你不想試試看? – shift66 2012-04-17 10:30:29

+0

早期的arm內核可能有問題,但是從arm7(armv4)開始,我已經在許多不同的內核上使用過該指令,並且沒有任何問題,無論是手臂還是拇指模式......如何瞭解這些內容,請看技術參考手冊的具體核心,它會指定這樣的限制。還有手臂,手臂結構參考手冊,爲家人(armv7 armv6等)也可能告訴你。 – 2012-04-17 17:23:57

+0

@Ademiban我確實嘗試過,它確實有效。但我想確定,因爲並非所有顯然工作的東西都是nessecarily定義。例如,讀取緩衝區末尾的文字可以正常工作,但這並不意味着它已被定義。 – tangrs 2012-04-18 04:51:41

回答

3

如果有疑問,請務必參閱ARM體系結構參考手冊,該手冊可在arm.com上找到。它說:

The destination register. The SP can be used. The PC can be used, provided the 
instruction is either outside an IT block or the last instruction of an IT block. 
If the PC is used, the instruction branches to the address (data) loaded to the PC. 
In ARMv5T and above, this branch is an interworking branch, see Pseudocode details of 
operations on ARM core registers on page A2-12. 

它並不是說目標寄存器不能與基址寄存器相同。也就是說,答案是肯定的,他們可以是一樣的。

2

是的,它會獲取r0指向的值,並用它加載寄存器r0。 如果有疑問,可以使用模擬器進行測試。我使用的是GBA仿真器VBA,儘管GBA特定,但它是一個很好的ARM仿真器。要學習GBA編程的基礎知識,以便您可以進行這種測試,請訪問this教程。

+0

模擬器無法知道硬件對這些事情做了什麼,所以不要相信它們。無論如何vba不匹配硬件,有足夠的差異。 – 2012-04-17 17:21:52

+0

該指令集將讓你編碼這條指令,如果這是問題,那麼是的,它會... – 2012-04-17 17:23:08

+0

@dwelch是的,但不足以防止他們被用來嘗試像問題的小事情。而我是談論ARM裝配測試,而不是GBA測試。我不認爲有一個指令在VBA中沒有正確實現:) – byrondrossos 2012-04-17 17:25:26

1

當然,編碼對ARMv4的arm和thumb指令集均有效。

關於您感興趣的系列,請參閱ARM ARM(ARM體系結構參考手冊)(http://infocenter.arm.com)。在這種情況下,ARM7是ARMv4,它與ARMv5 ARM(用於成爲原始和唯一的ARM ARM,他們被分割成獨立的ARM ARM)。

您正在尋找這樣的事情:

if ConditionPassed(cond) then 
Rd = (Rm * Rs)[31:0] 
if S == 1 then 
N Flag = Rd[31] 
Z Flag = if Rd == 0 then 1 else 0 
C Flag = unaffected in v5 and above, UNPREDICTABLE in v4 and earlier 
V Flag = unaffected 

對於MUL或本

Specifying R15 for register <Rd>, <Rm>, or <Rs> has UNPREDICTABLE results. 

或本

Operand restriction: Specifying the same register for <Rd> and <Rm> was previously described as producing UNPREDICTABLE results. There is no restriction in ARMv6, and it is believed all relevant ARMv4 and ARMv5 implementations do not require this restriction either, because high performance multipliers read all their operands prior to writing back any results. 

對於在在ARMv4/5檔手動LDR指令:

操作數r限制 如果指定了基址寄存器寫回,並且爲和指定了相同的寄存器,則結果爲UNPREDICTABLE。

我覺得這意味着什麼是該指令

ldr r0,[r0,#+/-offset_12]! 

是不可預測的,你是在告訴指令來保存的負荷值與計算地址R0,只能有一個贏,聽起來就像是一個折騰起來。沒有!最後寫入r0的唯一東西就是加載的值。並且沒有關於限制的評論(在最初的ARM ARM的第一版中,可以回顧ARM ARM和E的Rev B和C這些是印刷版本,在這方面所有這些都是彼此不同的,這就是爲什麼我認爲手臂使用術語「相關」)。對於我的剪輯和粘貼上面。

拇指說明不對限制或不可預知的行爲發表評論。

現在,如果你的意思是ARMv7的,當你在ARMv7的手冊的一個標記這與ARM7看

對ARMv7從的ARMv7-AR手動同一個問題:

LDR<c> <Rt>, [<Rn>, #+/-<imm12>]! 
if wback && n == t then UNPREDICTABLE; 

比和使用其他在r15中,以這種方式使用指令沒有限制。

+0

ldr r0,[r0],#4也應該與ldr r0,[r0,#offset]!有相同的問題,但是ldr r0,[r0]沒問題。 – 2012-04-17 20:29:44