Z80 어셈블러 작성 - ASM을 렉싱하고 컴포지션을 사용하여 구문 분석 트리를 구축하시겠습니까?

StackOverflow https://stackoverflow.com/questions/1305091

문제

저는 어셈블러 작성 개념이 매우 낯설고 많은 자료를 읽은 후에도 몇 가지 개념을 이해하는 데 여전히 어려움을 겪고 있습니다.

  1. 실제로 소스 파일을 토큰으로 나누는 프로세스는 무엇입니까?나는 이 프로세스를 렉싱(lexing)이라고 믿으며, 이해가 되는 실제 코드 예제를 찾기 위해 여기저기 검색해 보았지만 그렇게 간단한 코드 예제를 찾을 수는 없었습니다. ;)

  2. 구문 분석할 때 정보를 트리 위 또는 아래로 전달해야 합니까?제가 묻는 이유는 다음과 같습니다.

    LD BC, nn

토큰화되면 다음 구문 분석 트리로 변환되어야 합니다(???).

  ___ LD ___
  |        |
 BC        nn

이제 이 트리를 순회하면 다음과 같은 기계 코드를 생성해야 합니다.

01 n n

지시사항이 다음과 같다면:

LD DE,nn

그러면 출력은 다음과 같아야 합니다.

11 n n

즉, LD 노드는 피연산자에 따라 다른 것을 반환합니까, 아니면 무언가를 반환하는 피연산자입니까?그리고 이것이 어떻게 달성됩니까?시간이 허락한다면 더 간단한 코드 예제가 좋을 것입니다.

저는 기존의 고급 도구를 살펴보는 것보다 여기서 원시 프로세스 중 일부를 배우는 데 가장 관심이 있으므로 저를 보내기 전에 이를 염두에 두시기 바랍니다. 야크 또는 몸을 풀다.

도움이 되었습니까?

해결책

글쎄, 당신이 정말로 원하는 나무의 구조 레지스터와 메모리에서 작동하는 명령어 오프셋 변위와 인덱스 레지스터를 포함하는 주소 지정 모드 다음과 같이 보일 것입니다.

    INSTRUCTION-----+
    |      |        |
  OPCODE  REG     OPERAND
                  |     |
                OFFSET  INDEXREG

그리고 그렇습니다. 트리 위아래로 값을 전달하고 싶습니다.이러한 값 전달을 공식적으로 지정하는 메서드가 호출됩니다 "attribute grammars"를 호출하고, 문법을 장식합니다. langauge (귀하의 경우, 어셈블러 구문)를 값 전달과 함께 사용합니다. 그리고 그 값에 대한 계산.더 많은 배경 지식을 원하시면, 보다 속성 문법에 관한 Wikipedia.

안에 당신이 질문한 관련 질문, 나는 논의했다 도구 DMS, 표현 문법을 다루고 나무를 만듭니다.만큼 언어 조작 도구, DMS는 정확히 이와 동일한 위아래를 직면합니다. 트리 정보 흐름 문제.놀랄 일은 아니지만, 고급 언어 조작 도구로서 다음을 처리할 수 있습니다. 문법 계산을 직접 속성화합니다.

다른 팁

구문 분석 트리를 만들 필요는 없습니다. Z80 OP 코드는 매우 간단합니다. 그들은 OP 코드와 0, 1 또는 2 개의 피연산자로 구성되어 있으며 쉼표로 분리됩니다. 매우 간단한 파서를 사용하여 Opcode를 (최대 3) 구성 요소로 분할하면 트리가 필요하지 않습니다.

실제로, Opcodes는 바이트베이스가 아니라 옥탈베이스가 있습니다. 내가 아는 최고의 설명은 Z80 Opcodes 디코딩.

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