0

원시 컴퓨터 코드 명령을 출력하는 어셈블러 파일을 가져 오기 위해 컴파일러를 작성하려고합니다.어셈블리 언어를 기계어 코드로 컴파일하는 단계는 무엇입니까?

컴파일러를 작성하는 방법에 대한 자습서가 많이 있습니다. 그러나 모든 단계가 어셈블러 니모닉과 관련이 있는지 궁금합니다. 예를 들어, 단순화 된 단계별 어셈블러 형식이 주어지면 어휘 분석이 필요합니까 아니면 더 간단한 형식으로 필요합니까?

답변

2

어휘 분석기가 여전히 필요합니다. 텍스트를 개별 토큰 (단어, 숫자, 구두점 등)으로 나눌 수있는 것이 있어야합니다. 훨씬 단순화되었지만 파서도 필요합니다. 결국 은 문법이므로입니다.

0

필자가 보았 듯이, 어휘 분석은 어셈블리의 평면 구조로 인해 구문 분석기의 필요성이 줄어든 곳에서 필요한 모든 것입니다.

0

처음에는 유효하지 않은 명령어/피연산자가 없는지 확인한 다음 사용 된 모든 변수가 선언되었는지 확인합니다. 파일이 유효한 프로그램이라는 것을 확신하면 주석을 삭제하고 변수 및 절차를 주소로 바꿉니다 (주소를 즉시 알 수 없기 때문에 번역 중에 "즉시"레이블에 주소를 할당해야합니다). 마지막으로 실제 변환을 2 진 코드로 수행합니다.

모든 명령에 고유 한 행이 있다고 가정하면 현재 행이 레이블이면 현재 주소가있는 모든 참조를 현재 주소로 바꾸고 그렇지 않으면 모든 공백을 삭제하고 두 단어 사이에 하나씩 남겨 둡니다. "(명령어 및 피연산자). 이제 명령을 처리하는 것은 농담입니다. ;)

0

저는 컴파일러의 거의 모든 단계를 어셈블러에 적용 할 수 있습니다. 물론 당신에게 적용되는 것은 당신이 할 일에 달려 있습니다. 1 대 1 매핑을 만들려면 구문 분석을 통해 오류를 확인하고 구문 분석기를 사용하여 섹션 지정, 메모리 보호 .data (또는 심지어 매크로!)과 같은 지정자에 대한 텍스트를 처리하는 데 필요한 렉서 및/또는 파서를 필요로합니다. 또한 가능한 한 가장 작은 크기로 즉시 상수를 퍼널 링하여 적용 할 수있는 크기 '최적화'도 있습니다. 물론 당신은 모두 밖으로 나가서 명령 재주문과 융합을하기 위해 깊은 분석을 수행 할 수 있습니다. 정적 분석 단계에서 유효하지 않은 (불법적 인) 시퀀스가 ​​있는지 확인할 수도 있습니다 (LOCK CMPXCHG EDX,EDX은 구문 상 올바르지 만 잘못된 어셈블리 iirc의 예입니다)

관련 문제