2014-04-26 2 views
0

두 개의 벡터에 대해 연산을 수행하는 다음과 같은 간단한 프로그램이 있습니다. 메모리에 다시 그 결과를 (메모리에 저장)에 저장하고 A와 B는 C 벡터가 가리키는 :ARM 어셈블리는 레지스터를 메모리에 저장합니다.

 AREA MyProgram, CODE, READONLY 
     ENTRY 

Start ADR R0, VecA 
     ADR R1, VecB 
     ADR R2, VecC 

     ; R6 is a counter 
     MOV R6, #1 

Loop ; Get the value R0 is pointing to 
     LDR R3, [R0], #4 

     ; Get the value R1 is pointing to 
     LDR R4, [R1], #4 

     ; Add the values 
     ADD R5, R4, R3 

     ; Divide the value by 2 (i.e. shift right by 1) 
     LSR R5, #1 

     ; Store the resut to memory for C 
     STR R5, [R2] 

     ; Increment R2 to point to the next memory location 
     ADD R2, R2, #4 

     ; Increment the counter. If it's 9, we're done 
     ; (since the vector has 8 elements) 
     ADD R6, R6, #1 

     CMP R6, #9 
     BNE Loop 
     B Done 

Done b Done ; Loop forever 


     AREA MyProgram, DATA, READWRITE 

VecA DCD 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9 
VecB DCD 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9 
VecC DCD 0x0 


     END 

Eveything가 STR R5, [R2] 명령까지 잘 작동한다. 명령이 메모리를 업데이트하지 않는 것 같습니다 (R2에 의해 지정된 주소는 변경되지 않고 그대로, 즉 0x00입니다). 나는 지금 몇 시간 동안 이것을 알아 내려고 노력해 왔으며 무엇이 잘못 될지 전혀 모른다. 데이터 섹션은 명시 적으로 READWRITE라고 말합니다. 그래서 메모리가 업데이트되지 않는 이유를 알지 못합니다. 어떤 도움이라도 대단히 감사합니다.

+0

이 코드는 RAM이나 FLASH에서 실행 중입니까? 간단한 'STR'은 FLASH를 변경하지 않습니다. 나는 armasm이 같은 이름과 다른 속성을 가진 두 영역을 가지고 행복하다는 것을 확신하지 못합니다; 그리고 나는 당신이'VecC '형태의 일부 요소를 놓치고 있다고 생각한다; STR R5, [R2], # 4'를 사용할 수 있습니다. – scott

+0

그러나 VecC를 단 하나가 아닌 멋진 0으로 정의해야 할 수도 있습니다. – auselen

+0

@auselen 이미 시도했습니다. didn '일. – PoweredByOrange

답변

0

나는 문제가 무엇인지 알았다. 저는 Keil 시뮬레이터를 사용하고 있습니다. 분명히 쓰고있는 메모리 세그먼트를 수동으로 매핑해야했습니다. 나는이 프로그램을 실행하는 동안 Debug -> Memory Map... 메뉴를 클릭하여 다음 세그먼트 범위를 매핑하고 Read, Write, Execute 특권을 주었다.

enter image description here

관련 문제