NASM 소스 코드 의 데이터 구조

5259 단어
개술
NASM 은 모듈 화 된 재 활용 가능 한 어셈블러 입 니 다.그것 과 관련 된 데이터 구 조 는 배열, 링크, HASH 표 등 이 있다.
상세 하 게 해석 하 다
  • 표현 식 값 구하 기 프로그램 으로 계 산 된 값 을 배열 로 저장 합 니 다.

  • 이 생 성 된 값 은 조회 에 만 사용 되 고 수정 되 지 않 기 때문에 배열 로 표시 하기에 적합 합 니 다.
     /*
      * Expression-evaluator datatype. Expressions, within the
      * evaluator, are stored as an array of these beasts, terminated by
      * a record with type==0. Mostly, it's a vector type: each type
      * denotes some kind of a component, and the value denotes the
      * multiple of that component present in the expression. The
      * exception is the WRT type, whose `value' field denotes the
      * segment to which the expression is relative. These segments will
      * be segment-base types, i.e. either odd segment values or SEG_ABS
      * types. So it is still valid to assume that anything with a
      * `value' field of zero is insignificant.
      */
     typedef struct {
         long type;                             /* a register, or EXPR_xxx */
         long value;                            /* must be >= 32 bits */
     } expr;
    

    2. HASH 값 을 통 해 배열 과 링크 를 결합 하여 예비 처리 에서 만난 매크로 를 저장 합 니 다.
    이렇게 HASH 배열 의 모든 항목 은 하나의 링크 를 가리 키 고 링크 의 모든 노드 는 하나의 매크로 와 관련 된 정 보 를 저장 하 며 각 노드 매크로 이름 은 같은 HASH 값 을 가지 고 있 습 니 다.이러한 배열 과 링크 는 HASH 알고리즘 을 결합 한 구 조 를 통 해 지 정 된 이름 의 매크로 를 더욱 빠르게 찾 을 수 있다.
    3. NASM 은 실행 할 때 두 개의 메모 리 를 동적 으로 분배 합 니 다.
    하나의 블록 은 랜 덤 메모리 액세스 에 사용 되 며, 트 리 구조 로 표시 되 며, 각 잎 노드 에 실제 데 이 터 를 저장 합 니 다.
    다른 하 나 는 순차 메모리 액세스 에 사용 되 며 체인 구조 로 표 시 됩 니 다.
    이러한 프로그램 은 많은 작은 메모리 블록 이 필요 할 때 매번 분배 할 필요 가 없고, 분 배 된 메모리 블록 이 다 썼 을 때 만 재분배 할 수 있다.효율 을 높이 더 라 도 관리 하기 쉽다.
    SAA :dynamic sequential-access array.
    RAA :dynamic random access array.
     struct SAA {
         /*
          * members `end' and `elem_len' are only valid in first link in
          * list; `rptr' and `rpos' are used for reading
          */
         struct SAA *next, *end, *rptr;
         long elem_len, length, posn, start, rpos;
         char *data;
     };
    
     struct RAA {
         /*
          * Number of layers below this one to get to the real data. 0
          * means this structure is a leaf, holding RAA_BLKSIZE real
          * data items; 1 and above mean it's a branch, holding
          * RAA_LAYERSIZE pointers to the next level branch or leaf
          * structures.
          */
         int layers;
         /*
          * Number of real data items spanned by one position in the
          * `data' array at this level. This number is 1, trivially, for
          * a leaf (level 0): for a level 1 branch it should be
          * RAA_BLKSIZE, and for a level 2 branch it's
          * RAA_LAYERSIZE*RAA_BLKSIZE.
          */
         long stepsize;
         union RAA_UNION {
         struct RAA_LEAF {
             long data[RAA_BLKSIZE];
         } l;
         struct RAA_BRANCH {
             struct RAA *data[RAA_LAYERSIZE];
         } b;
         } u;
     };
    

    4. 기타
    모든 합 법 적 인 명령 의 템 플 릿 은 다음 과 같다.
     struct itemplate {
         int opcode;                    /* the token, passed from "parser.c" */
         int operands;                  /* number of operands */
         long opd[3];                   /* bit flags for operand types */
         const char *code;              /* the code it assembles to */
         unsigned long flags;           /* some flags */
     };
    

    그 중에서 네 번 째 코드 에서 특정한 값 으로 생 성 된 기계 코드 에 나타 날 수 있 는 상황 을 나타 낸다. 예 를 들 어 명령 템 플 릿 에 \ 320 이 존재 하면 이 명령 은 16 비트 의 고정 크기 의 조작 수가 필요 하 다 는 것 을 나타 낸다.이렇게 하면 목표 코드 가 32 비트 일 때 기계 코드 는 조작 수 접두사 가 필요 하 다.

    좋은 웹페이지 즐겨찾기