2016-05-19 18 views
0

UM10398 LPC111x/LPC11Cxx User manual Rev. 12,3 - 10 июня 2014 говоритПоддерживает ли LPC111x инструкцию MOV с высокими регистрами?

В этих инструкциях, Rd и Rm должны указать только R0-R7

в "28.5.5.5.3 Ограничения" в «28.5. 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 

В этом примере, R10, R12, R8 и SP используются, несмотря на их не делает похоже R0-R7. (SP кажется эквивалентна R13, в соответствии с UM10398 28.4.1.3 Основные регистры)

Еще одна вещь в том, что, когда я прочитал re-ejected-thumbref2.pdf, я нашел

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

и это предполагает, что верхние регистры доступны для использования с инструкцией MOV. Этот документ также сказать, что

Rd или Rm должно быть * высокий регистр *

об этом MOV Rd, Rm инструкции.

Хотя инструкции с S (с обновлением флага) не указаны в этом документе (в этом документе указаны инструкции без S), и этот документ должен быть для другого ЦП (возможно, один из них используется в GBA, в соответствии с URL-адресом path), я использовал этот документ в качестве ссылки, надеясь, что набор команд LPC111x подобен описанию в этом документе.

В заключение, я могу сделать

  • MOV R0, R1 (Low регистров в низких регистрах)
  • MOV R8, R1 (Low регистров в высоких регистрах)
  • MOV R0, R9 (Высокие регистры в низких регистрах)
  • MOV R8, R9 (Высокие регистры к высоким регистрам)

в LPC111x (или LPC1114FN28/102, если вам нужен конкретный процессор)?

ответ

1

LPC1114FN28 имеет сердечник ARM Cortex-M0, поэтому its MOV instruction не имеет ограничений на регистрацию. Однако, поскольку набор инструкций Thumb первоначально не имел инструкции MOV с низким до низкого, для совместимости ваш ассемблер может использовать инструкцию ADDS для MOV R0, R1.

Например, если я объединяю следующее с 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, которая имеет это ограничение.

 Смежные вопросы

  • Нет связанных вопросов^_^