yyparse ()를 사용하여 2 개의 패스 어셈블러를 만들었습니까?
-
23-08-2019 - |
문제
저는 작업중 인 사용자 정의 마이크로 컨트롤러에 대한 어셈블러를 작성하고 있습니다. 어셈블러가 지침을 바이너리로 조립하는 지점으로 가져 왔습니다.
그러나 이제는 라벨을 작동시키는 데 문제가 있습니다. 현재 내 어셈블러가 새 레이블을 만나면 레이블의 이름과 참조하는 메모리 위치를 저장합니다. 명령어가 레이블을 참조하면 어셈블러는 레이블을 조정하고 레이블을 적절한 값으로 바꿉니다.
이것은 괜찮고 멍청하지만, 지침을 참조한 후에 레이블이 정의되면 어떻게됩니까? 이로 인해 소포자가 코드를 두 번 실행해야합니다.
현재 내 주요 기능에 대해 제가 가지고있는 것은 다음과 같습니다.
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)를 출력하고 전방 참조가있는 모든 장소와 참조 된 기호가있는 데이터 구조가 있습니다. 파일 끝에서 (또는 로컬 기호가있는 경우 블록) 해당 목록을 통해 주소를 패치합니다.
제휴하지 않습니다 StackOverflow