2012-09-07 2 views
3

저는 어셈블러 디자인 필드에서 초보자입니다. 나는 기계를 위해 내 자신의 어셈블러를 설계하고있다. 현재, 내 어셈블러는 첫 번째 토큰을 가져 와서 해당 객체 코드를 생성하려고 시도합니다. 이제 토큰을 니모닉 풀과 일치시킨 다음 해당 obj 코드를 생성해야합니다. 문제는 현재 if-else 구문을 사용하고 있습니다. 즉,파서에서 if-else 문이 많이 발생하지 않도록하는 방법

if(strcmp(mnemonic_read, "mov")==0) 
// generate code for mov instr 
else if(strcmp(mnemonic_read,"cmp")==0) 
// generate code for cmp 

if-else 문을 많이 사용하지 않고이 모든 작업을 수행 할 수 있습니까? mnemonic_read 문자열 변수를 통해 함수를 호출 할 수 있습니까?

+0

왜 실제 파서를 사용하지 않습니까? 그렇다면이 문제는 처음에는 존재하지 않습니다. – harold

+0

니모닉을 객체 코드로 변환하는 메타 어셈블러라는 도구가 있습니다. –

답변

2

일반적인 해결책으로 일반적인 문제입니다 (harold가 제안).

* nix 환경에서 잘 작동하는 lex/yacc 또는 flex/bison을 조사 할 수 있습니다. Antlr도 비슷한 일을하지만 Java를 사용합니다.

예를 들어, (http://dinosaur.compilertools.net/에서) 렉스를 사용할 수 있습니다

렉스 소스는 정규 표현식 및 해당 프로그램 조각의 테이블입니다. 이 테이블은 입력 스트림을 읽어 출력 스트림으로 복사하고 입력을 주어진 표현식과 일치하는 문자열로 분할하는 프로그램으로 변환됩니다. 이러한 각 문자열이 인식되면 해당 프로그램 조각이 실행됩니다.

그래서 렉스에서 정규 표현식과 일치하는 토큰과 생성 될 해당 코드를 지정할 수 있습니다. 토큰을 새로운 언어 용 컴파일러를 생성하는 데 사용할 수있는 yacc (아직 또 다른 컴파일러 컴파일러)에 공급할 수 있습니다. http://ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html

2

수십 개와 수십 개의 if-else-statements 또는 switch-construct 대신 해시 테이블을 사용해야합니다.

또한 간단한 구문 분석기 논리에서 "어셈블러 논리"를 분리해야합니다.

1

당신은 아마 해시 맵의 associative array의 어떤 종류를 원하는 키워드를 저장 : 여기

은 예제와 함께 유용한 가이드입니다. 이것은 기본적으로 어떤 유형 (귀하의 문제에 유용한 문자열)에 의해 색인이 생성됩니다 배열이며 함수 포인터가 포함 된 값이 될 수 있습니다. 그런 다음 구문 분석 된 각 명령에 대해 다른 함수를 호출합니다. 당신이 당신의 코드에서 C++를 사용하는 가정

는 생성자 또는 (기본적 점프 테이블 역할) 해시 맵을 설정해야 유사한 초기화 루틴에서

// map strings to function pointers 
// which take a string (maybe the operands) as parameter 
map<string, void (*)(string)> commands; 

를 작성할 수 니펫을 :

init() {   
    commands["mov"] = cmd_mov; 
    commands["cmp"] = cmd_cmp; 
    ... 
} 

void cmd_mov(string operands) { 
    // generate move instruction 
} 
void cmd_cmp(string operands) { 
    // generate cmp instruction 
} 

당신은 단순히 DIF하면

string mnemonic = mnemonic_read_cmd(); 
string operands = mnemonic_read_op(); 
*(commands[mnemonic])(operands); 

하여 함수를 호출 각 함수에 필요한 수의 매개 변수가 필요한 경우 간단한 함수 포인터 대신 functionoid 또는 boost::function이 올바른 선택 일 수 있습니다.

관련 문제