Поддерживает ли серия 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, которая имеет это ограничение.