
Вот сам код хорошо всем известного startup (v4.42a ... arm\examples\AnalogDevices\ADuC712x\InterruptBlinl\cstartup.s79):
Код
MODULE ?RESET
COMMON INTVEC:CODE:NOROOT(2)
PUBLIC __program_start
EXTERN ?cstartup
EXTERN undef_handler, swi_handler, prefetch_handler
EXTERN data_handler,irq_handler, fiq_handler
CODE32; Always ARM mode after reset
org 0x00
__program_start
ldr pc,=?cstartup; Absolute jump can reach 4 GByte
org 0x04
ldr pc,=undef_handler
org 0x08
; ldr pc,=swi_handler
org 0x0c
ldr pc,=prefetch_handler
org 0x10
ldr pc,=data_handler
org 0x14
DCD 0x00000000
org 0x18
ldr pc,=irq_handler
org 0x1c
ldr pc,=fiq_handler
; Constant table entries (for ldr pc) will be placed at 0x20
org 0x20
LTORG
ENDMO
COMMON INTVEC:CODE:NOROOT(2)
PUBLIC __program_start
EXTERN ?cstartup
EXTERN undef_handler, swi_handler, prefetch_handler
EXTERN data_handler,irq_handler, fiq_handler
CODE32; Always ARM mode after reset
org 0x00
__program_start
ldr pc,=?cstartup; Absolute jump can reach 4 GByte
org 0x04
ldr pc,=undef_handler
org 0x08
; ldr pc,=swi_handler
org 0x0c
ldr pc,=prefetch_handler
org 0x10
ldr pc,=data_handler
org 0x14
DCD 0x00000000
org 0x18
ldr pc,=irq_handler
org 0x1c
ldr pc,=fiq_handler
; Constant table entries (for ldr pc) will be placed at 0x20
org 0x20
LTORG
ENDMO
Приведен только кусок до метки ?csartup. Но это не важно. Вопрос собственно вот какой: где найти систематизированное описание этого ассемблера? Причем и инструкций компилятора, и самих кодов. Сразу скажу, что help к IAR EWB и pdf Assemler Reference Manual оттуда же прочел. Прочел также ARM Arсhitecture Reference Manual (ARM DDI 0100E). И все равно много вопросов. Вот один из них:
Что такое, например, команда
Код
org 0x18
ldr pc,=irq_handler
ldr pc,=irq_handler
Смысл ее в общем то понятен. По этому адресу располагается команда перехода на обработку прерывания IRQ. Но что такое "=" перед irq_handler? Описания такого формата нигде не нашел. Может плохо искал?
Ладно, пусть это адрес irq_handler, который находится где-то в области памяти и этот вдрес получим только после работы линкера. Но почему этото слово должно находиться по адресу 0x18 + 0x20? Т.е. в какой собственно код транслируется эта команда? В формате команд ldr всегда присутствует кроме регистра назначения (pc) еще и регистр, содержащий базовый адрес, а также (часто) смещение. Наверное (мне так кажется) данная конструкция транслируется относительно какого-то базового регистра, содержащего "0" со смещением 0x20, но относительно какого регистра? Или я не прав? А если мне смещение нужно не 0x20, а 0x40, например?
PS. Ну, короче, нихрена я не пойму этой команды. Объясните, плиз.