Keresés

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

  • ZTE_luky

    aktív tag

    Sziasztok! Tudnátok segíteni? Kell írnom egy programot (c) ami lefordít egy *.asm fájlt (egy adott programnyelv) Visual X-toy-ra (virtuális számítógép ami egy 1960-as gépet szimulál, és csak ezt a különleges utasításrendszerből álló *.asm fájt szedi be helyesen)

    A lényeg h első sorban szedjünk be vmit getcharral szóközt sortörést ignoráljuk és nem szabad labeleket hazsználnunk, de én már itt elakatam.

    #include<stdio.h>
    #include<string.h>

    #define SIZE 256

    int main()
    {
    char c;
    char buffer[SIZE];
    int i = 0;
    // char* bp;
    //bp = &buffer[0];
    while ((c = getchar()) != EOF)
    {
    c = getchar();
    if(c != 0x20 || c != 0xA)
    {
    // *bp = c;
    //bp++;
    buffer[i] = c;
    i++;
    }
    }
    //bp = &buffer[0];
    i = 0;
    while(i < strlen(buffer))
    {
    printf("%04X\n", buffer[i]);
    i++;
    }
    return 0;
    }

    Ez a c kódom, és ez az inputom:

    ABCDEFG

    tesztelésképpen néztem meg ezt az inputot, viszont csak ezt dobja ki outputra:

    0042
    0044
    0046
    000A

    Ami BDF, szóval kidob minden második karakter és belerak egy sortörést, amikor azt ignorálnia kéne. nem értem mi a rossz. tudnátok segíteni?

    [ Szerkesztve ]

  • ZTE_luky

    aktív tag

    válasz axioma #5804 üzenetére

    köszönöm szépen, mindkettőtöknek, kijavítva, működik :)

  • 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)

    [ Szerkesztve ]

  • ZTE_luky

    aktív tag

    válasz buherton #5807 üzenetére

    de a countert hol nullazzam hogy teljesüljön a kiiratás? mi az a makró? bocsi ,de tényleg kezdő vagyok

  • ZTE_luky

    aktív tag

    válasz buherton #5809 üzenetére

    Ez látható outputként:
    10:145A
    10:145A
    11:3F23
    11:3F23
    12:41EA
    12:41EA
    12:0���

    Ennek kéne lennie:

    10:145A
    11:3F23
    12:41EA
    13:0000

  • ZTE_luky

    aktív tag

    válasz ZTE_luky #5810 üzenetére

    köszi, kezd megoldódni, már csak apróságokon csiszolgatok, mégegyszer nagyon szépen köszönöm!!! nagyon hazsnos volt :))

  • ZTE_luky

    aktív tag

    A fent látható kódot szeretném átírni LABEL-ökre, de megint megakadtam.

    Eredeti (persze csak egy része, a tartalom és változók kivágva)
    for (state = 0; c != EOF;) // Reading the strings
    {
    counter = 0;
    for (o = 0; o < 9 ;) // Get the characters on a string
    {
    c = getchar();
    if(c != 0x20 && c != 0xA) // Ignore spaces and \n
    {
    string[counter] = c;
    counter++;
    o++;
    }

    }
    }

    És ez a próbálkozásom LABEL-ökkel, de nem nagyon értem el vele semmit (szintén Segmentation fault (core dumped), amit még mindig nem tudok hogy miért van :( )

    if ( c!= EOF)
    {
    init:
    counter = 0;
    o = 0;
    goto thestring;

    thestring:
    if (o < 9)
    c = getchar();

    if (c != 0x20 && c != 0xA)
    {
    string[counter] = c;
    counter++;
    o++;
    }

    goto thestring;

    és persze még az egész kód végére beraktam hogy goto init; és bezártam a bracket-et

    Kérem aki tud, segítsen hogy mit rontok el. Válaszokat előre is köszönöm szépen!

  • ZTE_luky

    aktív tag

    válasz dobragab #5814 üzenetére

    ez a feladat :(

    Az a baj h már ebbe is beleköt.

    goto_1.c: In function ‘main’:
    goto_1.c:53:4: warning: ‘c’ is used uninitialized in this function [-Wuninitialized]
    if (c != EOF)

    [ Szerkesztve ]

  • ZTE_luky

    aktív tag

    válasz dabadab #5816 üzenetére

    az a baj hogy akár hova rakom az EOF ellenőrzst sehogy se jó. NAgyobb baj, ha kiveszem belőle úgy se fut le normálisan

  • ZTE_luky

    aktív tag

    válasz dabadab #5818 üzenetére

    igen ezzel már próbálkoztam csak az a baj akár mit ki vagy betesze még mindig
    Segmentation fault (core dumped)
    és nem ír ki semmit hogy mit hova hogyan :(

    mi folyhat le, mi lehet a hiba? mikor írja ezt?

    [ Szerkesztve ]

  • ZTE_luky

    aktív tag

    válasz Domonkos #5820 üzenetére

    köszönöm szépen a nagyon hasznos választ :))

    igen teljesen igazad van. a counter és az o változó (index counter) véleméynem szerint ugyan azt a funkciót látta el. nem is tudom hoyg került bele kétszer. át is írtam az o-t counterre, máshol meg kitöröltem de valamiért így se jó :( ugyan az a hibaüzenet. hol lehet még hiba? :(

  • ZTE_luky

    aktív tag

    Köszönöm szépen a segítséget, hát igen no [] tömböm random meg van határozva, de annál kevesebb értéket is kivehet mint a max, többet nem. Nem tudom az mennyire lehet probléma. Jelenleg se történik semmi, valami ilyesmit kellett kihozni az egészből 14:00-kor kell leadnom, de nem működik, tele van warning-al és nem is csinál semmi értelmeset sajnos. PEdig a kiinduló C-file gyönyörűen működik. Nem tudom mi lehet a baj, eléggé belekeveredtem sajnos.

    #include<stdio.h>
    #include<string.h>

    // ---------- Globale Variablen ----------
    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};
    // Address array
    char string[9]; // String array
    int R0; // (--int halt--) 0 Constant
    int R1;
    int R2; // (--int counter--) Index counter (String)
    int R3; // (--int op--) Index Operation-Code
    int R4; // (--int state--) Index strings
    int R5; // (--int i--) Index counter (Address)
    char R6; // (--char c--) Character to getchar
    char R7; // (--char r1--) Register 1
    char R8; // (--char r2--) Register 2
    char R9; // (--char r3--) Register 3
    int *RA; // (--int *no0--) BP of Address-array NEW
    int *RB; // (--int *noi--) Flexibe Array Pointer NEW
    char *RC; // (--char *string0--) BP of String-array NEW
    char *RD; // (--char stringi--) Flexibe Array Pointer NEW
    int RE; // SIZE 9
    int RF; // FFFF

    // ---------- Main Function ----------
    int main()
    {
    R0 = 0;
    R1 = 1;
    R2 = 0;
    R4 = 0;
    R5 = 0;
    RA = &no[0];
    RC = &string[0];
    RE = 9;
    RF = 0xFFFF;
    //no0 = &no[R0]; // Zero Element (in array "no") NEW
    //string0 = &string[R0]; // Zero Element (in array "string") NEW

    // ---------- Program ----------
    L0: //init
    R2 = R0; //counter
    goto L1; //thestring;

    L1: //thestring:

    if (R2 < RE) // for (counter = 0; counter < 9 ;)
    R6 = getchar(); //c
    if ( R6 != EOF) //c
    goto L2; //ignore;
    else {goto L3;} //end

    L2: //ignore:
    if (R6 != 0x20 && R6 != 0xA) // R6=c
    {
    R2 += R1; //counter++;
    //o++;
    goto L1; //thestring;
    }


    // ---------- Search Function (Operating Code) ----------


    // if (string[0] == 0x41 && string[1] == 0x44 && string[2] == 0x44)
    if (*RC == 0x41 && *RC + R1 == 0x44 && *RC + R1 + R1 == 0x44) //NEW
    { //----- Function ADD -----
    R3 = R1;
    R4 += R1;
    RB += R1;
    R7 = RC + R1 * 4;
    R8 = RC + R1 * 6;
    R9 = RC + R1 * 8;
    printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
    }

    //else if (string[0] == 0x53 && string[1] == 0x55 && string[2] == 0x42)
    else if (*RC == 0x53 && *RC + R1 == 0x55 && *RC + R1 + R1 == 0x42)//NEW
    { //----- Function SUB -----
    R3 = R1;
    R4 += R1;
    RB += R1;
    R7 = RC + R1 * 4;
    R8 = RC + R1 * 6;
    R9 = RC + R1 * 8;
    printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
    }

    //else if (string[0] == 0x41 && string[1] == 0x4E && string[2] == 0x44)
    else if (*RC == 0x41 && *RC + R1 == 0x4E && *RC + R1 + R1 == 0x44) //NEW
    { //----- Function AND -----
    R3 = R1;
    R4 += R1;
    RB += R1;
    R7 = RC + R1 * 4;
    R8 = RC + R1 * 6;
    R9 = RC + R1 * 8;
    printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
    }

    //else if (string[0] == 0x58 && string[1] == 0x4F && string[2] == 0x52)
    else if (*RC == 0x58 && *RC + R1 == 0x4F && *RC + R1 + R1 == 0x52) //NEW
    { //----- Function XOR -----
    R3 = R1;
    R4 += R1;
    RB += R1;
    R7 = RC + R1 * 4;
    R8 = RC + R1 * 6;
    R9 = RC + R1 * 8;
    printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
    }

    //else if (string[0] == 0x53 && string[1] == 0x48 && string[2] == 0x4C)
    else if (*RC == 0x53 && *RC + R1 == 0x48 && *RC + R1 + R1 == 0x4C) //NEW
    { //----- Function SHL -----
    R3 = R1;
    R4 += R1;
    RB += R1;
    R7 = RC + R1 * 4;
    R8 = RC + R1 * 6;
    R9 = RC + R1 * 8;
    printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
    }

    //else if (string[0] == 0x53 && string[1] == 0x48 && string[2] == 0x52)
    else if (*RC == 0x53 && *RC + R1 == 0x48 && *RC + R1 + R1 == 0x52) //NEW
    { //----- Function SHR -----
    R3 = R1;
    R4 += R1;
    RB += R1;
    R7 = RC + R1 * 4;
    R8 = RC + R1 * 6;
    R9 = RC + R1 * 8;
    printf("%D:%d%c%c%c\n",RB,R3,R7,R8,R9); //Print the current string
    }

    //else if (string[0] == 0x48 && string[1] == 0x4C && string[2] == 0x54)
    else if (*RC == 0x48 && *RC + R1 == 0x4C && *RC + R1 + R1 == 0x54) //NEW
    { //----- Function HLT -----
    R3 = R1;
    R4 += R1;
    RB += R1;
    R7 = RC + R1 * 4;
    R8 = RC + R1 * 6;
    R9 = RC + R1 * 8;
    printf("%D:%d%d%d%d\n",RB,R0,R0,R0,R0); //Print the current string
    }

    else printf("%04X\n", RF); //Print FFFF when it's an incorrct Value

    goto L0; //init;
    L3: //end

    return 0;
    }

    [ Szerkesztve ]

  • ZTE_luky

    aktív tag

    válasz Domonkos #5825 üzenetére

    nálam se sajnos. igen a pointerekkel elég nagy gáz van, de sajnos nem áll össze. Köszi szépen rövidült azóta, és le kell előbb adnom sajnos. hát ez van. :( nagy fába vágtam a fejszém

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