Új hozzászólás Aktív témák
-
ZTE_luky
senior 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:145Até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
HLTRÖ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
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Sanyo akkutöltő + 2 használható akku
- GYÖNYÖRŰ iPhone 13 Pro 256GB Sierra Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3359
- Apple iPhone SE 2020 64GB, Kártyafüggetlen, 1 Év Garanciával
- HP 14 Pavilion FHD IPS i5-1135G7 4.2Ghz 16GB RAM 512GB SSD Intel Iris XE Graphics Win11 Garancia
- LG 27UN880-B - 27" IPS ERGO - 3840x2160 4K - 60Hz - DisplayHDR 400 - USB Type-C - AMD FreeSync - Mac
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest