문제

저는 작업중 인 사용자 정의 마이크로 컨트롤러에 대한 어셈블러를 작성하고 있습니다. 어셈블러가 지침을 바이너리로 조립하는 지점으로 가져 왔습니다.

그러나 이제는 라벨을 작동시키는 데 문제가 있습니다. 현재 내 어셈블러가 새 레이블을 만나면 레이블의 이름과 참조하는 메모리 위치를 저장합니다. 명령어가 레이블을 참조하면 어셈블러는 레이블을 조정하고 레이블을 적절한 값으로 바꿉니다.

이것은 괜찮고 멍청하지만, 지침을 참조한 후에 레이블이 정의되면 어떻게됩니까? 이로 인해 소포자가 코드를 두 번 실행해야합니다.

현재 내 주요 기능에 대해 제가 가지고있는 것은 다음과 같습니다.

303 int main(int argc, char* argv[])
304 {
305 
306     if(argc < 1 || strcmp(argv[1],"-h")==0 || 0==strcmp(argv[1],"--help"))
307     {
308         //printf("%s\n", usage);
309         return 1;
310     }
311     // redirect stdin to the file pointer
312     int stdin = dup(0);
313     close(0);
314 
315     // pass 1 on the file
316     int fp = open(argv[1], O_RDONLY, "r");
317     dup2(fp, 0);
318 
319     yyparse();
320 
321     lseek(fp, SEEK_SET, 0);
322 
323     // pass 2 on the file
324     if(secondPassNeeded)
325     {
326         fp = open(argv[1], O_RDONLY, "r");
327         dup2(fp, 0);
328         yyparse();
329     }
330     close(fp);
331 
332     // restore stdin
333     dup2(0, stdin);
334 
335     for(int i = 0; i < labels.size(); i++)
336     {
337         printf("Label: %s, Loc: %d\n", labels[i].name.c_str(), labels[i].memoryLoc);
338     }
339     return 0;
340 }

Flex/Bison 구성 내부에서 이것을 사용하고 있습니다.

도움이 되었습니까?

해결책

그것이 필요한 전부라면, 당신은 전체 2 패스 어셈블러가 필요하지 않습니다. 라벨이 참조 할 때 정의되지 않은 경우 스탠드 인 주소 (예 : 0x0000)를 출력하고 전방 참조가있는 모든 장소와 참조 된 기호가있는 데이터 구조가 있습니다. 파일 끝에서 (또는 로컬 기호가있는 경우 블록) 해당 목록을 통해 주소를 패치합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top