2013-12-09 1 views
0

그래서 C 컴파일러의 하위 집합을 구현할 수 있으며 두통을 유발하는 기능이 하나 있습니다. 그래서 나는 그것을 해결하는 방법에 대한 아이디어를 원합니다.크기를 모르더라도 어셈블리에서 값으로 문자열 전달

내 프로그램에서 언어 문자열을 포함한 값으로 전달 된 모든 인수, 그의이 같은 선언은 다음과 같습니다

string str; 

이 그리고 내 문제는 당신이 볼 수 있듯이, 내가 선언 (C에서 차이) 동안 문자열 크기를 모르는 것입니다, 그래서 어셈블리를 생성 할 때 스택에 얼마나 큰 공간을 만들지 모르겠다. 나는이 같은 코드가있는 경우 :

string str; 
int number; 
str = something; 

을 내가 나중에 practicaly anythign 할당 할 수 있습니다 때, 문자열 str을위한 올바른 공간을 할당하는 방법을 모르겠어요. 마지막 조건은 힙을 사용할 수 없다는 것입니다.

감사합니다. 나쁜 영어로 죄송합니다.

편집 : 답변

감사합니다. 스택의 크기가 커지면 가장 큰 문제는 재 할당 문자열 일 것입니다.이 문자열 뒤에 뭔가가있는 경우 가장 간단한 해결책은 스택에 새로운 공간을 만들고 이전의 스택을 새로 만들 것이라고 생각하는 것입니다. 지역 범위가 폐기 될 때까지 ... 낭비 될 것입니다. 예 :

+0

스택에 동적 배열을 할당하는 것은 비교적 간단합니다. 오프셋이 다양하기 때문에 일반적으로 기본 포인터가 필요합니다. alloca 및 C99 가변 길이 배열이 선택한 아키텍처에서 어떻게 구현되는지 살펴보십시오.까다로운 부분은 혼합 된 호출/데이터 스택에서 동적 문자열을 반환하는 것입니다. 후자의 문제에 대한 비교적 단순한 해결책은 피 호출자가 결과를 획득 할 것으로 예상되는 고정 리턴 버퍼 (예를 들어, 단일 값에 대한 제 2 "스택") 일 수있다. – doynax

답변

0

새로운 메모리 블록에 문자열을 복제하는 일종의 dup_string 루틴이 있다고 가정합니다. 투명 발신자에를 사용하여

char *dup_string (char *s) 
{ 
    char *d = realloc(strlen(s)+1); 
    memcpy (d, s, strlen(s)+1); 
    return d; 
} 

그래서이 기능을 사용할 수 있습니다 : 그 DUP 루틴 소스 문자열이 같은 것을 복사가 수행되는 동안 만 판단 할 것이다 알 수없는 길이를 가지고 있음을 알고 있어야합니다 코드와 같은 당신의 칼레의 에필로그 ...

/* Source code: your programming language */ 
str s; 
s = "whatever..."; 
func (s); 

생성 된 어셈블리 코드 (예는 IA32 코드를 사용하고, C 호출 규칙)과 같이 될 것이다 : 당신은 일반적으로 수

[Caller: this block repeated for every string passed as parameter to a function] 
push offset s 
call dup_string ;string copy pointed by EAX 
add esp,4 ;get rid of parameter  
push eax 
call func 
add esp,4 ;get rid of parameter 
... 
... 

[Callee] 
push ebp 
mov ebp,esp 
mov esi,[ebp+8] ; ESI = pointer to string 
...use string in ESI... 
... 
... 
EPILOG 
    (this block repeated for every string passed as argument): 
    mov esi,[ebp+8] ;8 because in this example, it's the first argument. 
    call free /* standard free() function */ 
mov esp,ebp 
ret 
0

길이가 0 인 문자열로 시작할 수 있습니다.

당신은 앞으로 당신이 할당이, 범위를 남겨 등을 수행 또는 문자열이 연결될 때, 재 할당되면 동적 런타임에 할당하고 할당 해제 문자열 저장 할 것이다 시간의 크기를 알 수 없기 때문에

0

자신의 언어이므로 코드 생성 방법을 제어해야한다고 가정합니다. 따라서 충분한 스택 공간을 할당하고 거기에 문자열을 복사 할 수 있습니다. 필자는 malloc과 free에 신경을 쓰고 싶지 않았기 때문에 길이가 알려지지 않은 두 경로 부분 (기본 경로와 파일 이름을 인수로 추가 한)을 자체 함수에서 사용하고있었습니다. 당신이 처리해야 할 유일한 것은 스택을 정렬하는 것입니다. 왜냐하면 스택을 균일하게 유지해야하기 때문입니다.

물론 복잡한 프로그램의 경우 스택이 곧 커지기 때문에 프로그램의 크기에 따라 다릅니다.

+0

나는 이것을 고려했다. 그러나 문제는 문자열의 길이가 스택 크기에 의해서만 제한된다는 것이다 ... –

+0

그래서 메모리 사용에 관한 제약은 무엇인가? 당신은 힙을 사용하기를 원하지 않는다고 말했습니까? 그렇다면 메모리는 어디에서 오는 것이 좋을까요? 운영 체제 (어느 것을?)에서 할당 하시겠습니까? – Devolus

+0

a 힙 할당을 지원하지 않는 어셈블리를 heap cuz을 사용할 수 없다. 왜 그런지 물어 보지 마라. 그러나 나는 그 공간이 그 공간보다 크지 않기를 희망하면서 스택에 공간을 할당한다고 말하고 싶다. 나를 위해 –

관련 문제