이것은 숙제 문제입니다. 솔직하게 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 값입니다. 이것으로 문자열 작업을 시작할 수 있습니다.
답안 섹션에서 첫 번째 어셈블리 주석에서 "건너 뛴다"라고 말하면 포스트 증가 R0을 의미합니까? 전체 문자열을 트래버스하려는 경우 일반적으로 R0을 사후 증가 시키려면 "LDRB R4, [R0], # 1"과 같은 것을 원할 것입니다 (단일 문자이기 때문에 1 씩 증가시킵니다). 또한 R0에 R4를로드 할 때 문자열 포인터를 효과적으로 잃어 버렸습니다 (다음 명령에서)? – Dan
앞으로 건너 뛰기는 사용자가 그 이후에 무엇을하고 싶은지를 나타내는 것입니다. 하지만 네가 1 호에 대해 알고 있음을 알았습니다. R0에 R4를 삽입했습니다. 어셈블리 프로그램에서 C로 뛰어 내렸을 때 응답은 R0 레지스터에 저장 되었기 때문입니다. 그러나, 당신은 정확합니다, 그것은 다소 가난한 예입니다, 나는 그것을 바꿀 것입니다. – IAE
문제 없습니다. 혼란이 없었는지 확인하고 싶었습니다.학교에있을 때도 재미있게 놀았습니까? – Dan