Поддерживает ли серия LPC111x инструкцию MOV с регистрами High?

UM10398 LPC111x/LPC11Cxx Руководство пользователя Ред. 12.3 - 10 июня 2014 г.

В этих инструкциях 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 Регистры ядра)

Еще одна вещь, что когда я прочитал http://www.coranac.com/files/gba/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), я использовал этот документ в качестве ссылки, надеясь, что набор инструкций LPC111x подобен описанному в этом документе.

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

  • MOV R0, R1 (Низкие регистры в Низкие регистры)
  • MOV R8, R1 (Низкие регистры в Высокие регистры)
  • MOV R0, R9 (Высокие регистры в Низкие регистры)
  • MOV R8, R9 (Высокие регистры в Высокие регистры)

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

1 ответ

Решение

LPC1114FN28 имеет ядро ​​ARM Cortex-M0, поэтому его инструкция MOV не имеет ограничений на низкие / высокие регистры. Однако, поскольку в наборе команд 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, которая имеет это ограничение.

Другие вопросы по тегам