Среда: EWARM 5.50, контроллер SAM7
Привожу "кусок" cstarup.asm, полученный из дизассемблера C-SPY. Здесь инициализируются стеки для режимов,
[font="Lucida Console"]
__handlerReset:
1 LDR SP, =SFE(CSTACK)
2 0x100cd8: 0xe59fd028 LDR sp, _?0 [0x100d08] ; ABT_STACK$$Base
3 MSR CPSR_c, #ARM_MODE_ABT | I_BIT | F_BIT
4 0x100cdc: 0xe321f0d7 LDRD pc, [r1, -r7]!
5 LDR SP, =SFE(ABT_STACK)
6 0x100ce0: 0xe59fd024 LDR sp, _?1 [0x100d0c] ; ABT_STACK$$Limit
7 MSR CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
8 0x100ce4: 0xe321f0d2 LDRD pc, [r1, -r2]!
9 LDR SP, =SFE(IRQ_STACK)
10 0x100ce8: 0xe59fd020 LDR sp, _?2 [0x100d10] ; IRQ_STACK$$Limit
11 MSR CPSR_c, #ARM_MODE_ABT | I_BIT | F_BIT
12 0x100cec: 0xe321f0d7 LDRD pc, [r1, -r7]!
13 LDR SP, =SFE(ABT_STACK)
14 0x100cf0: 0xe59fd014 LDR sp, _?1 [0x100d0c] ; ABT_STACK$$Limit
15 MSR CPSR_c, #ARM_MODE_SYS | I_BIT | F_BIT
16 0x100cf4: 0xe321f0df LDRD pc, [r1, -pc]!
17 LDR SP, =SFE(CSTACK)
18 0x100cf8: 0xe59fd008 LDR sp, _?0 [0x100d08] ; ABT_STACK$$Base
19 BL LowLevelInit
[/font]
Если рассмотреть сроку [1]. IAR преобразовал эту строчку (убрал оператор SFE и подставил адрес)
1 LDR SP, =SFE(CSTACK)
в строчку [2]
2 0x100cd8: 0xe59fd028 LDR sp, _?0 [0x100d08] ; ABT_STACK$$Base
Пока все понятно.
Теперь рассмотрим строчку [3]
3 MSR CPSR_c, #ARM_MODE_ABT | I_BIT | F_BIT
IAR преобразовал ее в строку [4]
4 0x100cdc: 0xe321f0d7 LDRD pc, [r1, -r7]!
которая мне непонятна. Откуда взялась команда LDRD? Ее не должно быть в этой версии архитектуры ядра.
Воспользовавшись "ARM Arhitecture referene manual" разобрал код команды 0xe321f0d7. Получается правильная команда MSR, как и задумывалось.
Тогда перечитал "Assembler Reference Manual", главу "Assembler psevdo-instructions", но там не оказалось такой псевдо-инструкции.
Есть разные варианты LDR, но LDRD нет.
Что это может быть? Специфика C-SPY при отображении?