search results for 'Assembly'

  1. 2007/07/06 ARM Assembly - Jump from FLASH to RAM
Boot Loader가 하는 일중에 여러가지가 있지만, 하드웨어의 기본적인 Init이후 Boot Loader를 구동하게 됩니다.
Flash Memory에 있는 Boot Loader Image를 RAM에 Load하고 해당 주소로 Jump하는 것이 있습니다.

Boot Loader를 보면 ARM Assembly 로 되어 있습니다.
어떻게 Jump하는지 보도록 하지요

add r2, pc, #CODEINRAM-(.+8)                                        ; 1
sub r2, #BOOTLOADER_IMAGE_FLASH_OFFSET                ; 2
ldr   r1, =BOOTLOADER_IMAGE_START_ADDRESS_IN_RAM ; 3
add r1, r1, r2
mov pc, r1

자 이게 핵심 소스 이지요 ㅋ
- 해당 소스는 WinCE 6.0 Evaluation 180days에 있는 MAINSTONE BSP중 Eboot의 Startup.S의 일부입니다.

먼저 CODEINRAM, BOOTLOADER_IMAGE_FLASH_OFFSET, BOOTLOADER_IMAGE_START_ADDRESS_IN_RAM 이 세가지는 include 파일에 이미 정의되어 있습니다. C언어에서의 Constant로 보면 되겠지요 ㅋ

1. add r2, pc, #CODEINRAM-(.+8)
- 사전 용어 설명이 필요하겠지요?
r2는 register, pc는 program counter, #CODEINRAM 은 상수, .은 address of current instruction, +8은 two dword
그럼 설명 들어 갑니다.
pc는 current instruction이 수행되고 있을때, address of next instruction을 가지고 있습니다.
그러면 pc = (.+8) --> pc = current + two dword로 같다고 생각할 수 있습니다.
하지만, ARM Instruction Set을 살펴보면 일반적인 32bit Instruction과 16bit Instruction인 Thumb Instruction이 있습니다. 따라서 위에서 설명한 것처럼 항상 32bit는 아니기에 pc 와 (.+8)은 항상 같다고는 말할 수 없죠
그러면 이런것은 안될까 생각하실 껍니다.
mov r2, #CODEINRAM or ldr r2, =CODEINRAM
이거.. 절대 안됩니다. CODEINRAM은 code상 Flash에 있지만 이것을 실행하기 위해 현재 RAM에 적재되어 있죠
따라서 현재 PC는 Flash영역의 Address를 가리키고 있고 우리가 수행하고자 하는 것은 RAM영역의 Address인겁니다. 따라서 저렇게 하시면 절대 안됩니다. 아마 존재하지도 않는 Address를 가리키는 것으로 Boot Loader가 뻗겠지요?

=====================================================================================================

아~ 이런 벌써 시간이 이렇게 되었군요
워크샵 갈 시간입니다. ;;;;;
다음 설명은 다녀와서 할께요 ^^

===================================================================================