|
대부분의 어셈블러는 두개의 Pass로 제작이 됩니다.
Pass : 파일을 한번 읽는 것을 뜻합니다.
One Pass : 심볼의 정의 (아래의 소스에서는 배열로 정의 되었습니다.)
char *p[9][4] = // 배열
{
{"PRG1","START","",""},
{"","USING","*","15"},
{"","L","1","FIVE"},
{"","A","1","FOUR"},
{"","ST","1","TEMP"},
{"FOUR","DC","F'4'",""},
{"FIVE","DC","F'5'",""},
{"TEMP","DS","1F",""},
{"","END","",""}
};
Two Pass : 위에 정의된 명령을 조립하고 출력을 하는 것을 이야기 합니다.
아래 소스에스는 해당 명령을 조립하고 출력을 하는 것이라고 생각 하시면 됩니다.
for(i=0;i< 9;i++)
{
if(strcmp(p[i][1],"START")==0)
{
print(p[i][0],location_counter,1,'R');
}
else if(strcmp(p[i][0],"")!=0)
{
print(p[i][0],location_counter,4,'R');
location_counter=4+location_counter;
}
else if(strcmp(p[i][1],"USING")==0)
{}
else{location_counter=4+location_counter;}
}
---------------------------------------------------------------------------------------------
초딩밤톨 님이 쓰신 글 :
: 외국 사이트에서 발견한 two pass assembler라고 쓰여있는 C++소스입니다.
:
: 나름 이해 하려고 고민고민 해봤는데 대충 이런게 이런거구나 라고 생각은 되지만
: 정확하게 이해가 잘 안되네요. (특히 마지막에 for문)
:
: 아래 소스를 좀 자세하게 설명해주실 분 계신가요? ㅠㅠ
:
:
: #include<iostream>
: using namespace std;
:
: void print(char *p,int loc,int len,char ra) // print함수
: {
: cout << p << "\t" << loc << "\t" << len <<"\t" << ra << "\n";
: }
:
: void main()
: {
:
: char *p[9][4] = // 배열
: {
: {"PRG1","START","",""},
: {"","USING","*","15"},
: {"","L","1","FIVE"},
: {"","A","1","FOUR"},
: {"","ST","1","TEMP"},
: {"FOUR","DC","F'4'",""},
: {"FIVE","DC","F'5'",""},
: {"TEMP","DS","1F",""},
: {"","END","",""}
: };
:
: int i,j=0,location_counter=0; // 변수선언
:
:
: for (i=0;i< 9;i++) // 선언한 배열을 화면에 표시
: {
: for(j=0;j< 4;j++)
: {
: cout << p[i][j] << "\t";
: }
: cout << "\n" ;
: }
:
: cout << "\n\n\n Symbol ";
: cout << "Table:\nSYMBOL\tVALUE\tLENGTH\tRelocatable/Absolute\n" ;
: cout << "---------------------------------------------\n";
:
: for(i=0;i< 9;i++)
: {
: if(strcmp(p[i][1],"START")==0)
: {
: print(p[i][0],location_counter,1,'R');
: }
: else if(strcmp(p[i][0],"")!=0)
: {
: print(p[i][0],location_counter,4,'R');
: location_counter=4+location_counter;
: }
: else if(strcmp(p[i][1],"USING")==0)
: {}
: else{location_counter=4+location_counter;}
: }
:
: }
|