현재 ASSEMBLER를 직접 짜보라는 과제물과 전쟁중인 컴퓨터공학과 학생입니다. ㅠㅠ
지금 당면한 과제는 OBJFILE 에서 각 앞의 코드들을 받아 그 코드들에 맞게 각각 라벨이나 CODE길이를 분리하여 나타내는 건데요.
지금 제가 테스트할때 쓰는 OBJFILE 의 코드입니다.
HLAB1 001000000060
T0010001E0010510C105A04105A0010541890270C105400105A18104E0C105A28104B
T00101E183810060010540C10570000050000040000030000020000011
T0010391E00000700000700000700000700000700000700000F000003000000000000
M00000705
E001000
이 OBJFILE의 코드를 각각 맨앞의 코드가 뭔지 판별하는데는 성공했습니다.
그런데 구현도중 T 코드의 문장을 처리하는데 문제가 발생했어요 ㅠ.ㅠ
각각의 태그, 저장할주소, 코드의 사이즈는 그냥 문자배열에 때려박아서 출력하면되는데
뒤의 나머지 CODE들을 16진수로 변화하여 6자씩 끊어서, 말그대로 ASSEMBLER처럼 받아서 처리하라는 건데요.
strtol 을 이용하여 16진수로 변환하여 저장하는것 까진 알겠습니다.!!
그런데...
T TAG라인 처리하는 2번째!! 2번째 줄을 보시면 000001 하고 나머지 뒤의 12개 숫자는 출력이 되면 안되는데.....
제 지식 선에선 별 수를 다써봐도 출력이 되버리네요.... 배열도 초기화 해보고, NULL값 처리도 해보고....
이미 과제는 지각제출인지라 기왕 지각인거 완벽하게라도 해서 제출해 보고자 오유에 질문을 올립니다.....ㅠㅠ
저부분만 처리가 되면 나머지 M이랑 E 태그 라인도 일사천리로 진행될거 같거든요 ㅠ.ㅠ
어디가 어떻게 잘못된건지 알려주시면 정말 감사할게요 ㅠ.ㅠ(전문가가 아니시더라고 비슷한 과제를 해본 경험이 있는 대학생여러분 환영합니다! 웰컴!)
대망(大亡)의 소스코드 따라갑니다...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define LINESIZE 71
#define LABELSIZE 1
#define ADDRESS_SIZE 6
#define PGSIZE 6
#define LENGTH_SIZE 2
#define COD_SEL_SIZE 6
#define CODESIZE 61
int main(int argc, char *argv[]){
char cline[LINESIZE];
char label;
char pgname[PGSIZE];
char code[COD_SEL_SIZE];
char address[ADDRESS_SIZE];
char addres[LENGTH_SIZE];
long length;
long staddress;
long realcode;
int i;
char *cptr;
FILE *rfd; //파일을 읽고 쓸 인자 생성
if (argc != 2){
printf("Uusage : %s OBJFILE\n", argv[0]);
exit(0);
}
if ((rfd = fopen(argv[1], "r")) == NULL){ //srcfile을 읽어들임.
fprintf(stderr, "%s : %s: cannot open for reading : %s\n", argv[0], argv[1], strerror(errno));
exit(0);
}
while (fgets(cline, LINESIZE, rfd) > 0){ //srcfile을 줄단위로 읽어들임.
label=cline[0];
cptr=cline;
if(label=='H'){
strncpy(pgname,cptr+LABELSIZE,PGSIZE);
strncpy(address,cptr+LABELSIZE+PGSIZE,ADDRESS_SIZE);
staddress=strtol(address,NULL,16);
strncpy(addres,cptr+LABELSIZE+PGSIZE+ADDRESS_SIZE,LENGTH_SIZE);
length=strtol(addres,NULL,16);
printf("TAG : %c PROGNAME : %s ADDR : %lx PGSIZE : %06lx CODE : %s\n",label,pgname,staddress,length,cptr);
}
else if(label=='T'){
long objcode[CODESIZE]={0,};
strncpy(address,cptr+LABELSIZE,ADDRESS_SIZE);
staddress=strtol(address,NULL,16);
strncpy(addres,cptr+LABELSIZE+ADDRESS_SIZE,LENGTH_SIZE);
length=strtol(addres,NULL,16);
cptr=cptr+LABELSIZE+ADDRESS_SIZE+LENGTH_SIZE;
printf("TAG : %c ADDR : %06lx SIZE : %lx CODE : ",label,staddress,length);
for(i=0; i<10; i++){
strncpy(code,cptr,COD_SEL_SIZE);
cptr=cptr+COD_SEL_SIZE;
realcode=strtol(code,NULL,16);
objcode[i]+=realcode;
printf("%06lx ",objcode[i]);
}printf("\n");
}
}
fclose(rfd); //srcfile파일을 닫음.
return 0;
}
살려주시와요 ㅠ.ㅠ