Új hozzászólás Aktív témák

  • ZTE_luky

    aktív tag

    Sziasztok, ismét én, zárójelben kezdő vagyok, és C nyelvben kellene egy programot megírnom ami lényegében felistem karaktereket (utasításokat) és lefordítja azokat.

    pl: első sor: ADD R4 R5 RA
    ADD-nak az utasításkódja 1, és összeadás a jelentése, az utána lévő registerek pedig: az 5-ös és az A-dik registerben lévő elemeket adja össze és rakja a 4-es regiszterre.

    ezt a következőképp kéne kiiratni:
    10:145A

    tényleg nem fontos hoyg ez mire kell, lényeg hogy egy output file-t hozzunk létre egy inputból ezzel a c-vel ami sorokat hoz létre 10 11 12 13 stb stb.. kezdettel, rak utána egy kettőspontot, és kiírja a parancs megfelelőjét, hoyg azt le lehesen futtatni. Talán ha elolvassáto ka kódot rájöttök. nem is ez a lényeg. A lényeg az hogyha az input bármilyen érvénytelen karaktert tartalmaz írjon ki FFFF-et és álljon le, a szókö és sortörést ignorálja. úgy oldottam meg hogy beolvas egy sztringet, azt átírja, majd olvassa a kövit és az is, de valamiért nem fut le. azzal van gond hoyg nem áll le ( c != EOF) valamint nem olvassa be a következő sztringet (sort) ott a state inkrementálással van baj, valamiért. elég sokat foglalkoztam vele de nem megy, valaki legyen szíves segítsen köszönöm!

    #include<stdio.h>
    #include<string.h>
    #define SIZE 9

    //DEBUG -- Buffer Overflow, Read the following string

    int main()
    {
    char c;
    int counter = 0;
    int no[] = {0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B};
    char string[SIZE];
    int state = 0;
    int op;
    char r1;
    char r2;
    char r3;
    int i = 0;
    int o = 0;



    for (state = 0; c != EOF; ) //reading the strings
    {
    for (o = 0; o < 10 ;) // get the characters on a string
    {
    c = getchar();
    if(c != 0x20 && c != 0xA && c != 0x2C) // ignore whitespaces and \n
    {
    string[counter] = c;
    counter++;
    o++;
    }
    }
    // ---------- Search Function (Operating Code) ----------
    if (string[0] == 0x41 && string[1] == 0x44 && string[2] == 0x44)
    {
    op = 1; //add
    state++;
    no[i]++;

    r1 = string[4];
    r2 = string[6];
    r3 = string[8];

    printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
    o = 0;
    }

    else if (string[0] == 0x53 && string[1] == 0x55 && string[2] == 0x42)
    {
    op = 2; //sub
    state++;
    no[i]++;

    r1 = string[4];
    r2 = string[6];
    r3 = string[8];

    printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
    o = 0;
    }

    else if (string[0] == 0x41 && string[1] == 0x4E && string[2] == 0x44)
    {
    op = 3; //and
    state++;
    no[i]++;

    r1 = string[4];
    r2 = string[6];
    r3 = string[8];

    printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
    o = 0;
    }

    else if (string[0] == 0x58 && string[1] == 0x4F && string[2] == 0x52)
    {
    op = 4; //xor
    state++;
    no[i]++;

    r1 = string[4];
    r2 = string[6];
    r3 = string[8];

    printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
    o = 0;
    }

    else if (string[0] == 0x53 && string[1] == 0x48 && string[2] == 0x4C)
    {
    op = 5; //shl
    state++;
    no[i]++;

    r1 = string[4];
    r2 = string[6];
    r3 = string[8];

    printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
    o = 0;
    }

    else if (string[0] == 0x53 && string[1] == 0x48 && string[2] == 0x52)
    {
    op = 6; //shr
    state++;
    no[i]++;

    r1 = string[4];
    r2 = string[6];
    r3 = string[8];

    printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
    o = 0;
    }

    else if (string[0] == 0x48 && string[1] == 0x4C && string[2] == 0x54)
    {
    op = 0; //halt
    }
    else printf("FFFF\n");
    //---------- Define Register's Value ----------
    //---------- Print the current string ----------
    r1 = string[4];
    r2 = string[6];
    r3 = string[8];
    printf("%X:%d%c%c%c\n",no[i],op,r1,r2,r3);
    o = 0;
    }

    return 0;
    }

    Itt egy input file példának, és tesztelésnek:

    ADD R4 R5 RA
    AND RF R2 R3
    XOR R1 RE RA
    HLT

    RÖVIDEN: csak az a probléma hogyha felismer egy utasítást, inkrementálja a state-t majd ugorjon vissza a loop elejére, és csináljon meg mindent újra, és írja ki a kövi sort. itt van a legfőbb probléma szerintem. a másik a bufferrel van szerintem, mert ezt írja hibaüzenetnek:
    *** stack smashing detected ***: ./1531726 terminated
    Aborted (core dumped)

Új hozzászólás Aktív témák