유닉스에서는 되는데.. 리눅에선 안돌아가는군엽..

익명 사용자의 이미지

두군데서 돌렸는데.. 리눅스는 세그먼트 오류를 일으키는 군여...

갑갑해서 소스를 올려봅니다...

<>

#include
#include
#include
#include "node.c"

extern short ic;

int Dataln;

main(argc, argv)
{
int f_descrip;
load(f_descrip);
dump();
ic = 0;
printf("=========================================\n");
control();
}

load(filedes)
{
char buf[16*MSIZE];
int line_num=1, nread, i , j=0, tmp=0;
if( (filedes = open("pgm", O_RDONLY)) == -1 ) {
printf(" Can't open file \n");
exit(1);
}
nread = read(filedes, buf, sizeof(buf));
for (i = 0 ; i<(16*MSIZE) ; i++) {
if(buf[i] == '\n')
line_num++;
}
while(line_num--) {
for(i=0; i<17; i++) {
tmp=(tmp*2+(buf[j++]-'0'));
if(i==15)
memory[Dataln++].wd=tmp;
}
}
}

dump()
{
int i;
printf("=============\n value in memory\n ==============\n");
for (i = 0; i < Dataln-1; i++)
printf("%2d %7d \n", i*2, memory[i].wd);
printf("=============\n");
}

<>

#include "./node.h"

#define MSIZE 64

struct instruction {
unsigned op_code 4, operand 12;
};

struct data {
unsigned byte0 8, byte1 8;
};

typedef union {
short wd;
struct instruction inst;
struct data dat;
} word;

word memory[MSIZE];

int flag=0;
short ic = 0, od; /* instruction count */
short accumulator;
short mar, mdr;
control() /* instruntion cycle */
{
int i=0, acctmp[16], input, tmp=32768;
while(1) {
od=memory[ic].inst.operand;
if((od%2)==1)
flag=1;
switch(memory[ic].inst.op_code) {
case H
exit(1);
break;
case INC
accumulator++;
ic++;
break;
case ADD
alu(PLUS, od);
ic++;
break;
case SUB
alu(MINUS, od);
ic++;
break;
case AND
alu(ANDL, od);
ic++;
break;
case COM
alu(COMPL, od);
ic++;
break;
case RS
alu(RSHFT, od);
ic++;
break;
case LS
alu(LSHFT, od);
ic++;
break;
case LD
mu(SA);
mu(SD);
accumulator = mdr;
ic++;
break;
case ST
mu(SA);
mdr = accumulator;
mu(SM);
ic++;
break;
case RD
printf("input data");
scanf("%d", &input);
accumulator = input;
ic++;
break;
case WR
for(i=1; i<17; i++) {
if((accumulator&tmp)>0)
acctmp[i-1]=1;
else
else
acctmp[i-1]=0;
tmp/=2;
}
for(i=0; i<16; i++)
printf("%d",acctmp[i]);
printf("\n");
ic++;
break;
case B
ic = od/2;
break;
case BZ
alu(ISZERO,od);
break;
case BGZ
alu(GTZERO,od);
break;
case BLZ
alu(LTZERO,od);
break;
}
}
}

mu (code)
{
switch(code) {
case SA
mar=od;
break;
case SM
if(flag==1)
memory[(mar-1)/2].dat.byte1=mdr;
else if(flag==0)
memory[mar/2].dat.byte0=mdr;
break;
case SD
if(flag==1)
mdr=memory[(mar-1)/2].dat.byte1;
else if(flag==0)
mdr=memory[mar/2].dat.byte0;
break;
}
}

alu(code, operand)
{
short i;
int tmp;
switch(code) {
case PLUS
mu(SA);
mu(SD);
accumulator+=mdr;
break;
case MINUS
mu(SA);
mu(SD);
accumulator-=mdr;
break;
case ANDL
mu(SA);
mu(SD);
accumulator&=mdr;
break;
case COMPL
mu(SA);
mu(SD);
tmp=65535;
accumulator=(accumulator^tmp);
break;
case RSHFT
for(i=1; i accumulator/=2;
break;
case LSHFT
for(i=1; i accumulator*=2;
break;
case ISZERO
if(accumulator==0)
ic=operand/2;
else
ic++;
break;
case GTZERO
if(accumulator>0)
ic=operand/2;
else
ic++;
break;
case LTZERO
if(accumulator<0)
ic=operand/2;
else
ic++;
break;
}
}

<< node.h >>

/* codes for alu */

#define PLUS 1
#define MINUS 2
#define ANDL 3
#define COMPL 4
#define RSHFT 5
#define LSHFT 6
#define ISZERO 7
#define GTZERO 8
#define LTZERO 9

/* codes for control */

#define H 0
#define INC 1
#define ADD 2
#define SUB 3
#define AND 4
#define COM 5
#define RS 6
#define LS 7
#define LD 8
#define ST 9
#define RD 10
#define WR 11
#define B 12
#define BZ 13
#define BGZ 14
#define BLZ 15

/* codes for mu */

#define SA 0
#define SM 1
#define SD 2

익명 사용자의 이미지

어떻게 돌아가는지가 서술이 안되어있어..
정확한 답변을 드릴수 없으나..

OS에 따라 라이브러리가 틀리기때문에..
포팅시에 그부분을 수정하거나..
ifdef같은것으로 OS를 체크하여..
라이브러리 호출을 다르게 정의 할수 있구요..

또는 CPU에 따라 연산방식이 틀릴수가 있어..
데이터가 틀릴수 있습니다..

즉 다른 OS에서 돌아가는것을 그대로 사용할수 있는것은
드뭅니다..
그럼 즐프하세요 ^^

익명 사용자의 이미지

죄송합니다... 몇일 낑낑대다가 어제 새벽에 여기 올리고 답을 기다려보자
는 심뽀로 올리나 보니 날림으로 올리게되었군여..

근데 허접이라 정확하게 어디가 문제인지를 못 찾겠습니다...

mu()함수에서 세그먼트 폴트났는데..
나름대로 gdb를 돌려서 원인을 알아볼려고 했는데... 사용방법이 아직 익
숙치 않아서...
참고로 gdb 결과를 보여드리면..

Starting program /home/tai/Project/arun
=============
value in memory
==============
0 -32760
2 12297
4 -4088
6 -16382
8 4105
10 -20480
12 20
14 8
16 12038
=============
=========================================
(no debugging symbols found)...(no debugging symbols found)...
Program received signal SIGSEGV, Segmentation fault.
0x080489a3 in mu ()

이렇게 나옵니다...
정확히 제게 무엇을 듯하는지를 모르겠습니다..

읽으시느라 수고하셨습니다..

익명 사용자의 이미지

JT wrote..
죄송합니다... 몇일 낑낑대다가 어제 새벽에 여기 올리고 답을 기다려보 자
는 심뽀로 올리나 보니 날림으로 올리게되었군여..

근데 허접이라 정확하게 어디가 문제인지를 못 찾겠습니다...

mu()함수에서 세그먼트 폴트났는데..
나름대로 gdb를 돌려서 원인을 알아볼려고 했는데... 사용방법이 아직 익
숙치 않아서...
참고로 gdb 결과를 보여드리면..

Starting program /home/tai/Project/arun
=============
value in memory
==============
0 -32760
2 12297
4 -4088
6 -16382
8 4105
10 -20480
12 20
14 8
16 12038
=============
=========================================
(no debugging symbols found)...(no debugging symbols found)...
Program received signal SIGSEGV, Segmentation fault.
0x080489a3 in mu ()

이렇게 나옵니다...
정확히 제게 무엇을 듯하는지를 모르겠습니다..

읽으시느라 수고하셨습니다..

디버깅 하실때..
컴파일 옵션에 -g옵션을 주셨는지 모르겠네요...

-g옵션을 주어 core파일을 생성시켜
그것을 gdb로 보는게 빠르겠네요..

gdb 실행파일 core하시면 됩니다.

그리고 코드를 보니.. 버퍼 oveflow쪽에 문제가 아닐까 생각도 드네요..
MSIZE만큼 잡아논 버퍼인데..
mu()에서 사이즈 체크하는게 나와있는거 같지가 않은데..
한번 확인해 보시구여...

그리고 word structure의 데이타 타입과 mdr이나 mar의 short type과도
틀리네여 ^^
warnning이 뜰거 같은데... ^^

아니면 코드가 짧으니 하나씩 하나씩..
printf문으로 결과를 출력하면서 잡는것도 좋은 방법이라고 생각이 듭니
다.
그럼 즐프 하세요..

익명 사용자의 이미지

도움 주셔서 감사합니다.. ^^

또 한번 열띰히 삽질해봐야겠네엽..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.