2010-06-20 4 views
4

이것은 숙제 문제입니다. 솔직하게 C 프로그램이 문자열 매개 변수를 어셈블리 수준으로 전달하는 방법을 잘 모르겠습니다.ARM에서 문자열을 사용하는 방법은 무엇입니까?

내가 가지고있는 기능

StringSearchInString(text, searchString);

text = "Hallo Alles klar"

searchString = "ll"

내가 ARM 알고 레지스터 R0, 각각 텍스트 R1,되는 searchString에 매개 변수를 전달하는 매개 변수 ,하지만이 캐릭터가 어떻게 작동하는지 모르겠습니다. . 각 문자의 길이가 8 비트이면 레지스터는 들어오는 문자열에 의해 무자비하게 도살됩니다.

저는 ARM APCS가 인수를 인수로 변환한다는 것을 읽었습니다. 그 중 첫 4 바이트는 레지스터에 저장되고 나머지는 스택의 역순으로로드됩니다.

Sooo ... 무엇? 나는 이것을 이해하지 못한다. 문자열 text은 R0에 저장되며 처음 4 바이트 인 "Hall"은 R0에 저장되고 나머지는 스택의 역순으로 저장됩니까? 나는 그 권리를 이해하고 있는가? 어떻게 부르죠?

TL : DR : C-Program의 문자열 인수를 어셈블리로 전달하려면 어떻게해야합니까? 어떻게 작동합니까 /로드/수행합니까?

답변 : 원격 경우

사람이이에 대한 해결책을 찾고 있음은 여기있다 : 그렉 Hewgill가 말한 것처럼, 문자열은 포인터로 전달됩니다

끈. 따라서 R0의 값은 문자열에 대한 주소입니다. 따라서 간접 주소 지정을 사용하면 다음과 같이 값에 액세스 할 수 있습니다.

StringSearchInString(text, searchString); // calls the ARM function... 

//Going into the ARM function... 

LDRB R4, [R0], #1 // Load the first value of R0 into R4 and skip 
        // ahead one character(8 bits) 
        // Note the "B" in LDR. It indicates that you load ONLY 1 byte! 
MOV R0, R4  // Move the value of R4 into R0. This destroys the pointer 
        // Stored in R0! Careful! 

성공! 문자열이 "hallo Alles klar"인 경우 R0 레지스터에 0x68이로드됩니다. 이것은 "h"의 ASCII 값입니다. 이것으로 문자열 작업을 시작할 수 있습니다.

+0

답안 섹션에서 첫 번째 어셈블리 주석에서 "건너 뛴다"라고 말하면 포스트 증가 R0을 의미합니까? 전체 문자열을 트래버스하려는 경우 일반적으로 R0을 사후 증가 시키려면 "LDRB R4, [R0], # 1"과 같은 것을 원할 것입니다 (단일 문자이기 때문에 1 씩 증가시킵니다). 또한 R0에 R4를로드 할 때 문자열 포인터를 효과적으로 잃어 버렸습니다 (다음 명령에서)? – Dan

+0

앞으로 건너 뛰기는 사용자가 그 이후에 무엇을하고 싶은지를 나타내는 것입니다. 하지만 네가 1 호에 대해 알고 있음을 알았습니다. R0에 R4를 삽입했습니다. 어셈블리 프로그램에서 C로 뛰어 내렸을 때 응답은 R0 레지스터에 저장 되었기 때문입니다. 그러나, 당신은 정확합니다, 그것은 다소 가난한 예입니다, 나는 그것을 바꿀 것입니다. – IAE

+0

문제 없습니다. 혼란이 없었는지 확인하고 싶었습니다.학교에있을 때도 재미있게 놀았습니까? – Dan

답변

5

짧은 대답은 C에서 문자열이 포인터으로 다른 곳의 문자 데이터로 전달된다는 것입니다. 예를 들어, R0은 0x01000078 값을 포함 할 수 있습니다.이 값은 메모리의 "Hallo Alles klar" 데이터에 대한 포인터로 해석되며 그 뒤에 null 문자 (00 바이트)가옵니다. 이는 ARM에 고유하지 않습니다.

+0

그걸 상상했는데 어떻게 작동합니까? 나는 레지스터를로드하려고 시도했는데 이것은 이해가되지 않는다. 나는'ADR'과 함께 그것을 가리 키려고했다. 그러나 컴파일러는 불평했다. 그래서 무엇을해야할지 모르겠습니다. – IAE

+2

@SoulBeaver : 몇 년 전만해도 간단히 작업했기 때문에 ARM 어셈블리가 녹슬지는 모르지만 일반적으로 레지스터에 포인터를로드 한 다음 간접 주소 지정 모드를 사용하여 메모리에서 실제 문자를 읽습니다. (한 번에 하나씩). –

+0

감사합니다! 당신의 작은 통찰력으로 나는 무엇을해야 할지를 알 수있었습니다. 바라건대 나머지는 산들 바람이어야합니다! 내 질문을 업데이트하고 제안하고, 지금까지만 대답합니다. – IAE

관련 문제