Hirdetés
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Projektor topic
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Kormányok / autós szimulátorok topikja
- Léghűtés topik
- Soundbar, soundplate, hangprojektor
- Milyen billentyűzetet vegyek?
- Gaming notebook topik
- OLED TV topic
- AMD Navi Radeon™ RX 9xxx sorozat
-
PROHARDVER!

Új hozzászólás Aktív témák
-
Sceemz
újonc
Sziasztok!
A segítségeteket szeretném kérni, jelenleg egy programot írok Visual Studioban (x86 assembly). A program lényege, hogy:"Készítsen programot, ami a felhasználó által megadott elemszámú, véletlen számokkal feltöltött tömbben, megadja a következő statisztikai eredményeket: átlag, medián, szórás. Az eredményeket írja ki a képernyőre. Az elemszám megadását billentyűzetről kell bekérni."
Jelenleg a kódom nagy része már kész van és az átlag, szórás számítás tökéletesen működik, visszont a medián számítás részére nem találok megoldást, ha esetleg valaki tudna benne segíteni azt nagyon meg köszöném.
//A változók létrehozásaint N, temp;int a;const char* hun = "Hun";//Setlocale_asm{mov temp, esp;//setlocale(LC_ALL, "Hun");//"Hun" -> LC_ALLpush hun;push LC_ALL;call dword ptr setlocale;mov esp, temp;}//Véletlen szám véletlenítése_asm{mov temp, esp;push 0;call dword ptr time;push eax;call dword ptr srand;mov esp, temp;}//N bekéréseconst char* be_N = "Kérem adja meg a tömb elemszámát: ";const char* intformat = "%d";_asm{mov temp, esp;rossz_N:push be_N;call printf;lea eax, N;push eax;push intformat;call scanf;//N vizsgálata, hogy pozítiv-ecmp N, 0;jle rossz_N;mov esp, temp;}// Az N elemű tömb létrehozása és feltöltése véletlen számokkalint* A = new int[N];//ESP mentő változóint saveESP;_asm{mov saveESP, ESP;}//Ciklus a feltöltéshez_asm{mov esi, 0;ciklus_feltölt:call rand; //eax->be elteszi a rand() értékétmov edx, 0;mov ecx, 1000; // a legnagyobb kigenerált szám 1000 lehetdiv ecx;add edx, 1; // a legkisebb kigenerált szám az 1 lehetmov a, edx;mov eax, esi;mov ebx, 4;mul ebx;mov ebx, eax;mov edx, ebx;mov ecx, dword ptr A;add ebx, ecx;mov eax, a;mov dword ptr[ebx], eax;//ciklus végeinc esi;cmp esi, N;jl ciklus_feltölt;}const char* tomkiiras = "A feltöltött tömb: ";const char* sortores = "\n";const char* szam = "%d, ";int ciklusValtozo;// A feltöltött tömb kiírása ellenőrzésképen_asm{push tomkiiras;call printf;pop tomkiiras;// for ciklusmov eax, N; // N alkalommal fut le a ciklus -> ciklusváltozómov ciklusValtozo, eax;mov esi, 0; //tömbindexhezciklus:// tömb elemeinek kiírása//memóriacím kimentése változóba a dinamikus tömb eléréséhez:mov ebx, dword ptr[A];add ebx, esi; //eltolás hozzáadása a pontos helyhezpush dword ptr[ebx]; //érték verembe helyezéspush szam;call printf;add esi, 4; //int típus 4 bájtospop szam;pop dword ptr[ebx];// tömb elemeinek kiírásának végedec ciklusValtozo;cmp ciklusValtozo, 0;jne ciklus; // ha nem egyenlő az ciklusValtozo tartalma 0-val akkor folytatódi a ciklus// for ciklus vegepush sortores;call printf;pop sortores;}// Átlag kiszámításafloat osszeg = 0.0;float atlag = 0.0;//A tömb átlaga_asm{mov esi, 0;ciklus_atlag://index kiszámításmov eax, esi;mov ebx, 4; // mivel int típusú tömbünk van, 4 byte méretű elemekkel dolgozunkmul ebx;mov ebx, eax; //i*4 kerül az ebx-be//-bmov edx, ebx;mov ecx, dword ptr A;add ebx, ecx;fild dword ptr[ebx]; // fild az integer értéket betölti a FPU regiszterbefld osszeg;fadd;fstp osszeg;//ciklus végeinc esi;cmp esi, N;jl ciklus_atlag;fld osszeg;fidiv N;fstp atlag;}// Átlag kiíratásaconst char* atlagText = "Átlag: ";const char* atlagFormat = "%.1f\n";_asm{mov eax, dword ptr[atlagText];push eax;call printf;add esp, 4;fld atlag; // az átlag értékének betöltése a lebegőpontos regiszterbesub esp, 8; // hely foglalása a veremben a kiíratáshozfstp qword ptr[esp]; // az átlag értékének a veremre helyezésepush dword ptr[atlagFormat];call printf;add esp, 12; // a hely felszabadítása a veremben}// Medián kiszámításafloat median;_asm{mov ecx, N; // ecx-be betöltjük a tömb méretétmov ebx, 2; // ebx-be betöltjük az 2-es értéket, hogy megkaphassuk a tömb középső elemétcdq; // eax regisztert bővíti edx regiszterrelidiv ebx; // az N-t osztjuk 2-vel, az eredmény az eax-ben lesz, a maradék pedig az edx-benmov edx, 0; // az edx-t nullázzuk, hogy ne maradjon benne az osztás eredményecmp edx, 0; // összehasonlítjuk a maradékot 0-val, hogy megállapítsuk, páros vagy páratlan a tömb méreteje paros_meret; // ha a maradék 0, akkor a tömb mérete páros// Ha a tömb mérete páratlan, a medián az N/2. elem leszmov ebx, N; // ebx-be betöltjük a tömb méretétmov eax, ebx; // az N-t mozgatjuk az eax-besar eax, 1; // az N-et osztjuk 2-vel, az eredmény az eax-ben leszmov ebx, eax; // az eredményt áttesszük a ebx-bemov edx, 0; // az edx-t nullázzukmov eax, dword ptr A[ebx * 4]; // az N/2. elemet betöltjük az eax-bejmp kiir; // ugorjunk a kiíratáshozparos_meret:// Ha a tömb mérete páros, a medián az N/2. és (N/2)+1. elem átlagamov ebx, N; // ebx-be betöltjük a tömb méretétmov eax, ebx; // az N-t mozgatjuk az eax-besar eax, 1; // az N-et osztjuk 2-vel, az eredmény az eax-ben leszmov ecx, eax; // az eredményt áttesszük a ecx-beadd eax, 1; // az N/2-hez hozzáadjuk 1-et, az eredményt az eax-be tesszükmov edx, 0; // az edx-t nullázzukmov ebx, dword ptr A[ecx * 4]; // az N/2. elemet betöltjük a ebx-beadd ebx, dword ptr A[eax * 4]; // az (N/2)+1. elemet hozzáadjuk a ebx-hezmov eax, ebx; // az eredményt áttesszük az eax-besar eax, 1; // az összeget osztjuk 2-vel, az eredmény az eax-ben leszkiir:movsd median, xmm0; // az eredményt áttesszük a median változóba}// Medián kiíratása:cout << "Medián: " << fixed << setprecision(2) << median << endl;// Szórás kiszámításafloat standardDeviation = 0.0;float variance = 0.0;int ezzelosztunk = N; // Módosítás: az ezzelosztunk változó értéke N lesz, mert a szórás számításánál N-el osztunk, nem N-1-gyel_asm{// for ciklusmov eax, N; // N alkalommal fut le a ciklus -> ciklusváltozómov ciklusValtozo, eax;mov esi, 0; //tömbindexhezszoras_ciklus:mov ebx, [A];add ebx, esi; //eltolás hozzáadása a pontos helyhezfild[ebx];fld atlag;fsub st(1), st(0); // kivonjuk a generált számból az átlagotfxch st(1); // st(1)-ben lévő eredményt átrakjuk st(0)-bafstp st(1); // st(1)-ben lévő értéket kiszedjük (töröljük)fmul st(0), st(0); // st(0)-ban lévő értékét megszorozzuk önmagával (négyzetre emelés)fadd variance; // a variance-hez hozzáadjuk az eredménytfstp variance; // az eredményt elmentjük a variance-baadd esi, 4; //int típus 4 bájtosdec ciklusValtozo;cmp ciklusValtozo, 0;jne szoras_ciklus; // ha nem egyenlő az ciklusValtozo tartalma 0-val akkor folytatódi a ciklus// ciklus végefld variance; // betöltjük st(0)-ba a variance változó értékétfidiv ezzelosztunk; // elosztjuk az st(0)-ban lévő értéket N-nelfsqrt; // gyökvonásfstp standardDeviation; // az st(0)-ban lévő értéket eltároljuk a standardDeviation változóban}// Szórás kiíratása:const char* standardDeviationText = "Szórás: ";const char* standardDeviationFormat = "%.1f\n";_asm{mov eax, dword ptr[standardDeviationText];push eax;call printf;add esp, 4;fld standardDeviation; // a szorás értékének betöltése a lebegőpontos regiszterbesub esp, 8; // hely foglalása a veremben a kiíratáshozfstp qword ptr[esp]; // a szórás értékének a veremre helyezésepush dword ptr[standardDeviationFormat];call printf;add esp, 12; // a hely felszabadítása a veremben}delete[] A; // Dynamikusan allo tomb memoria felszabaditasareturn 0;}
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
- Autós topik
- Gurulunk, WAZE?!
- Motorolaj, hajtóműolaj, hűtőfolyadék, adalékok és szűrők topikja
- A fociról könnyedén, egy baráti társaságban
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Nintendo Switch 2
- Projektor topic
- Kuponkunyeráló
- EAFC 26
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- További aktív témák...
- Akko, Gateron, Haimu x Geon kapcsolók
- Szép! Lenovo ThinkPad X1 Yoga G6 x360 Érintős Hajtogatós Laptop Tab 14" -50% i5-1135G7 16/256 +Toll
- Samsung Galaxy Tab S10 Ultra 256 GB újszerű állapot
- GamerPC RX 9070/7700X/32GB DDR5/1TB M2
- Szép! Lenovo ThinkPad X1 Yoga G6 x360 Érintős Hajtogatós Laptop Tab 14" -50% i5-1135G7 16/256 +Toll
- Apple iPhone 14 Pro Max 256GB, Kártyafüggetlen, 1 Év Garanciával
- Akció! Gamer PC-Számítógép! Beszámítás! X870 /R7 7800X3D / RX 9070XT / 32GB DDR5 / 2TB SSD
- MacBook Pro 16" M1 16GB RAM 27%-os áfás számla (0231)
- GYÖNYÖRŰ iPhone 12 mini 128GB Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3854,94% Akkumulátor
- BESZÁMÍTÁS! Sapphire B650M R7 8700F 32GB DDR5 1TB SSD RX 6800 16GB Zalman Z1 PLUS Seasonic 750W
Állásajánlatok
Cég: Central PC számítógép és laptop szerviz - Pécs
Város: Pécs
Cég: Laptopműhely Bt.
Város: Budapest



