2014-03-26 6 views
1

ARM M4 어셈블리에서 printf를 호출하려고하는데 몇 가지 문제가 있습니다. 목적은 R1의 콘텐츠를 덤프하는 것입니다. 이 코드는 내가 둘 때, R0에 주소를 "output_string"것을 충족 다음ARM Cortex-M4 : 어셈블리에서 printf를 호출 할 때 문제가 발생했습니다.

.data 
    .balign 4 
output_string: 
    dcb "content in R1 is 0x%x\n", 0 
.... 
    .text 
.... 
    push {r0, r1} 
    mov r1, r0 
    ldr r0, =output_string 
    bl printf 
    pop {r0, r1} 

문제처럼, 값은 심볼이 "output_string"경우에 값이, 예를 들어 추가 1. 추가 0x2000이면 R0은 0x2001 값을 가져옵니다.

THUMB/ARM 모드와 관련이 있다고 생각합니다. 하지만 데이터 섹션에 "output_string"을 선언했습니다. 왜 어셈블러가 여전히 명령어 주소로 변환합니까?

또는 이러한 어셈블리 내 함수 호출을 수행하는 좀 더 공식적인 방법이 있습니까?

+0

어떤 툴체인? – auselen

+0

iar를 사용하고 있습니다. 6.73 –

답변

0

내가 사용한다고 생각 :

ldr r0, =output_string 

= 접두사는 임의의 32 비트 상수를로드하기 위해 어셈블러 속기이다. this ARM Information Center 페이지를 참조하십시오.

+0

'ldr r0, output_string'이 홀수 번지를 생성하는 버그라고 생각합니까? – auselen

+0

문제를 지적 해 주셔서 고마워요. 실제로이 문제를 설명 할 때 오타입니다. 나는 능동적으로 "ldr r0, = output_string"을 내 코드에서 사용하지만 r0에로드 된 주소는 "output_string + 1"입니다. 원래 게시글에서 수정했습니다. –

관련 문제