2016-05-19 50 views
0

UM10398 LPC111x/LPC11Cxx User manual啓12.3 - 10 2014年6月說LPC111x系列是否支持帶有高寄存器的MOV指令?

在這些指令中,Rd和Rm必須只在「28.5指定 「28.5.5.5.3限制」 R0-R7

。 5.5 MOV和MVN「。

在另一方面, 「實施例28.5.5.5.5」 在UM10398說

MOVS R0, #0x000B ; Write value of 0x000B to R0, flags get updated 
MOVS R1, #0x0 ; Write value of zero to R1, flags are updated 
MOV R10, R12 ; Write value in R12 to R10, flags are not updated 
MOVS R3, #23 ; Write value of 23 to R3 
MOV R8, SP ; Write value of stack pointer to R8 
MVNS R2, R0 ; Write inverse of R0 to the R2 and update flags 

在這個例子中,R10R12R8SP是儘管它們不使用似乎R0-R7。 (SP似乎相當於R13,根據UM10398 28.4.1.3內核寄存器)

一件事是,當我讀​​,我發現

MOV路,RM 0 1 0 0 0 1 1 0 H1 H2 _ Rm _ _ Rd _

並且此建議高寄存器可用於MOV指令。該文件還表示,

路或Rm必須是*高*登記

這個MOV Rd, Rm指令。

雖然與S指令(標誌更新)不是這份文件上(在無S這個文件的說明更新標誌表示)和本文件應該是另一個CPU(也許有在GBA使用,根據網址路徑),我用這個文檔作爲參考,希望LPC111x的指令集與本文檔中描述的類似。

最後,我可以做

  • MOV R0, R1(低寄存器低寄存器)
  • MOV R8, R1(低寄存器高寄存器)
  • MOV R0, R9(高寄存器低寄存器)
  • MOV R8, R9 (高寄存器到高寄存器)

在LPC111x(或LPC1114FN28/102,如果您需要指定特定的CPU)?

回答

1

LPC1114FN28具有ARM Cortex-M0內核,因此its MOV instruction對寄存器沒有低/高限制。但是,由於Thumb指令集原本沒有MOV低到低指令,爲了兼容性,彙編器可以使用MOV R0,R1的ADDS指令。

例如,如果我組裝與as -mcpu=cortex-m0 t117.s以下:

# .syntax unified 
    .thumb 

    MOV R0, R1 
    MOV R8, R1 
    MOV R0, R9 
    MOV R8, R9 

創建的對象文件包含以下說明作爲顯示由objdump -d

0: 1c08   adds r0, r1, #0 
    2: 4688   mov  r8, r1 
    4: 4648   mov  r0, r9 
    6: 46c8   mov  r8, r9 

通過取消註釋.syntax unified指令和重新組裝的拆卸結束如預期:

0: 4608   mov  r0, r1 
    2: 4688   mov  r8, r1 
    4: 4648   mov  r0, r9 
    6: 46c8   mov  r8, r9 

我相信「在這些指令中,Rd和Rm只能指定R0-R7」的說法僅僅適用於具有此限制的MOVS指令。