CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): ddaeng (金京哲)
날 짜 (Date): 1993년10월31일(일) 19시49분38초 KST
제 목(Title): 우왕.. 이거 골때려여..



으.. 회사서 골때리는 케이스를 당해써여...

문제는 HP735기계에서.. HPUX 9.01을 쓰문서.. 이러면서 어떤 프로그램을

컴파일을 했는데.. 그게 잘 안돌아여...

고노무게.. HP730/HPUX8.05에선 문제읍시 잘 돌던 거거덩여..

하이간.. 잠시간의 삽질로 그 문제를 피해가는 방법을 찾아냈는데..

여기다가 한번 써볼께여.. 


문제의 프로그램은.. malloc으로 받은 메모리 블럭의 일부를 

그 블럭내부의 다른곳으로 옮기는게 목적이엇어여..

------------

    InsertHandleSize(insertpos, addsize)
    unsigned long   insertpos, addsize;
    {
        char     *tmp;
        int newsize;
        int     j;

        .......

331:        for( j = newsize-1; j >= insertpos+addsize; j--)
332:            *(tmp+j) = *(tmp+j-addsize);

        .......

    }

-------------

이게 보시다시피..(tmp+insertpos)를 (tmp+insertpos+addsize)로 카피하는건디..

시상에.. 이게 안대드라구여.. 8.05에선 물론 잘 대구여..

그 부분을 디스어셈불 한 결과는 다음과 같아여..

이거.. PA-RISC니모닉인디.. 

------------

   332: 0x0001d554   InsertHa+0138   LDW     -68(0,30),21
        0x0001d558   InsertHa+013c   LDW     -76(0,30),22
        0x0001d55c   InsertHa+0140   ADD     22,21,1
        0x0001d560   InsertHa+0144   LDW     -172(0,30),31
        0x0001d564   InsertHa+0148   EXTRS   31,31,4,19
        0x0001d568   InsertHa+014c   SUB     0,19,20
        0x0001d56c   InsertHa+0150   LDBX,S  20(0,1),21
        0x0001d570   InsertHa+0154   EXTRS   21,31,8,22
        0x0001d574   InsertHa+0158   LDW     -68(0,30),1
        0x0001d578   InsertHa+015c   LDW     -76(0,30),31
        0x0001d57c   InsertHa+0160   ADD     31,1,19
        0x0001d580   InsertHa+0164   STBS    22,0(0,19)
        0x0001d584   InsertHa+0168   LDW     -68(0,30),20
        0x0001d588   InsertHa+016c   LDO     -1(20),21
        0x0001d58c   InsertHa+0170   STW     21,-68(0,30)
        0x0001d590   InsertHa+0174   LDW     -68(0,30),22
        0x0001d594   InsertHa+0178   LDW     -168(0,30),1
        0x0001d598   InsertHa+017c   LDW     -172(0,30),31
        0x0001d59c   InsertHa+0180   ADD     1,31,19
        0x0001d5a0   InsertHa+0184   COMBF,<<        22,19,InsertHandleSize+013
        0x0001d5a4   InsertHa+0188   OR      0,0,0

------------

하이간에.. 이 문제를 해결하는 방법을 두개를 찾았아여..

1) 포인터 조작을 간단하게...

    ----------
    int ti;

    .......

        for( j = newsize-1; j >= insertpos+addsize; j--) {
            ti = j - addsize;
            *(tmp+j) = *(tmp+ti);
        }

    .......

    ----------
    루프내의 어사인먼트 하는걸 *(tmp+j-addsize)를, j-addsize를
    먼저 계산해서 ti에 넣구서 *(tmp+ti)하니까 되데여..

2) memmove()를 이용해서..

    ----------

        memmove( tmp+insertpos+addsize, tmp+insertpos,
                newsize-(insertpos+addsize) );

    ----------
    이러케 해두 대드라구여...

하여간.. 우끼는게.. 만약 포인터 조작에 문제가 있는거라면

두번째 방법으로 해도 안되어야 할텐데 말에여..

음.. 하나 의심되는것은.. *(tmp+j-addsize)에서..

addsize 는 unsigned long이고.. j는 int거덩여..

근데.. 비슷하게 쬐꾸만 예제 프로그램을 짜보니까..

이건 또 제대루 대드라구여.. 9.01에서여..


전에도 9.01에서 펑션 파라메타를 줄때.. float를 주면.. 이게 그 값을

제대로 못받는 경우가 있었던걸로 기억해여... 그래서 더미 파라메타를

끝에다가 하나 더 주구 .. 막.. 그러면 됐던걸루 기억하는데여..

혹시.. 관련되는 머시기 읍슬까여?

고시기.. 730, 710하던거하고 735, 715 하던거하구 씨피유가

수퍼스칼라 기법을 사용한 PA-RISC7100으루 바낀거라는디..

혹시 그런거에 관련된 문제는 아닐까여? 아니면.. 새로운 칩에대한

컴파일러를 잘몬 맹그러서 그런걸까여?



아.. 그리고.. 악마헝.. 알아봐 주신거 고마버여~~ :)

음.. 상용뿌로구램에는 몬쓴다.. 면.. 좀 그러쿤여..

울회사가 한국일보하구 합병된다문.. 한국일보 기계에는 쓸수 있겟지만여..

애고.. 힘들긴 해도.. 그 데이터 얼라인먼트 문제는.. 그 대상이 되는

화일들이 망할노무 미친토쉬서 부터 따라온거라서 문제인데..

한번 뒤집어 엎어야져.. 무지 귀찬트라두.. 쫍.. 노가다..



                                       땡치루



[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.