NASM 소스 코드 의 데이터 구조
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 비트 일 때 기계 코드 는 조작 수 접두사 가 필요 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.