- Kábeleket és csövezést rejtő "kirakatház" a GameMax logójával
- Felvarrták az Arctic rackmount rendszerekhez szánt CPU-hűtőjének ráncait
- Háromféle kivitelben, és nem kis kapacitásokkal jönnek a Micron 6550 ION SSD-i
- Már a Samsung sem szolgálja ki modern AI lapkákkal Kínát
- Havazáshoz igazított kiadás kap a Steam Deck OLED
- Milyen TV-t vegyek?
- OLED TV topic
- Amlogic S905, S912 processzoros készülékek
- Már a Samsung sem szolgálja ki modern AI lapkákkal Kínát
- Apple asztali gépek
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Intel GPU-k jövője - amit tudni vélünk
- SSD kibeszélő
- Nvidia GPU-k jövője - amit tudni vélünk
- Fejhallgató erősítő és DAC topik
Új hozzászólás Aktív témák
-
P.H.
senior tag
válasz Fire/SOUL/CD #198 üzenetére
Ez igaz: "a "minden bitje" vs. "megfeleő bitje" azt jelenti, hogy az első változó(V1->eax) minden bitjét(32 bit), össze kell hasonlítani a második változó(V2->ebx) minden, azonos helyiértékű bitjével."
Itt tévedsz: "DE, elöbbi esetben teljesen felesleges a 31-től 1. bitek összehasonlítása hiszen az utolsó 0. helyiértékü bit összehasonlításakor veszi vel a végleges értékét AL. Az utóbbiban meg teljesen felesleges a 0-tól 30. bitek összehasonlítása hiszen az utolsó 31. helyiértékü bit összehasonlításakor veszi vel a végleges értékét AL. Nem is beszélve arról, hogy a két módszer két különböző eredményt ad ill. adhat."
Ahogy írtad, 32 db összehasonlításról van szó, amelyek között AND kapcsolat van, tehát egy 32-es számolt ciklusban bitenként haladva (akármelyik irányba):
- EAX és EBX aktuális bitjét ki kell tenni egy-egy registerbe
- össze kell hasonlítani őket
- az első olyan esetnél, ahol EAX bitje kisebb, mint EBX-é, ki kell lépni AL=0-val
- ha nincs ilyen helyzet, akkor AL=1 az eredmény.mov eax,[V1]
mov ebx,[V2]
mov cl,32
@ciklus:
mov dl,0
shr eax,1
adc dl,0
mov dh,0
shr ebx,1
adc dh,0
cmp dl,dh
jb @hamis
sub cl,1
jg @ciklus
mov al,1
jmp @kilep
@hamis:
mov al,0
@kilep:Vagy pedig (mivel felírtad az igazságtáblázatot):
xor ebx,eax
// EBX-ben 0 lesz azokon a bitpozíciókon, amelyek azonosak, 1,
// ahol eltérőek
and eax,ebx
// nullázzuk EAX-ben azokat az 1 biteket, ahol a bemeneti EBX
// is 1 volt
sub ebx,eax
// ezek után amelyik bitpozíción EBX 1 (nem azonosak), ott EAX-ben
// is 1-nek kell lennie, azaz meg kell egyezzen a két register
setz al
// vagy setz helyett bármilyen hosszabb kód, aminek jelentése
// (EBX == 0) ? AL=1 : AL=0[ Szerkesztve ]
Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
félisten
válasz t.timikee #200 üzenetére
Hali!
Miben is írtok Ti?
Előző kérdésedre: mi van ha több mint 8?
Szóval: AX-> Akkumlátor regiszter 16 bites, 2 részre bontható AH, AL egyenként 8-8 bitesek-
8 biten az ábrázolható számtartomány 0..255(előjel nélkül) ill. -128..127(előjelesen).32 bitet nézünk meg, legrosszabb esetben is 32 HAMIS vagy 32 IGAZ lesz, a 32 mint egész szám ábrázolható 8biten(1 byte).
Ez a kód meg köszönöviszonyba nincs az előzővel, itt két 64 bites számot hasonlítunk össze.
ha v1>v2 akkor al=1 egyébként meg al=0.
Ez legalább "értelmes" megoldható feladat.
(a MOV(1,AL) meg a MOV(0,AL) utasítást nem lehet lefordítani, az assembler compiler öngyilkosságot követ el ezen kódok láttán )Fire.
UI: Tanárbácsit meg el kell küldeni továbbképzésre.
[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
t.timikee
csendes tag
válasz Fire/SOUL/CD #202 üzenetére
Értem már hogy mit mondasz. Amugy HLAban programozunk/programoznánk, ha lenne egyátalán gyakorlatunk, és nem magunktól kéne megtanulni...
-
t.timikee
csendes tag
értem már a dolgokat!!!
Tehát nem kell végig nézegetni mind a 32 bitet, hanem az első esetben , amikor eltérés van, akkor ki lehet lépni a ciklusból
Már csak a kódot kéne megírni -
félisten
válasz t.timikee #204 üzenetére
Hali!
Elöször pár szó P.H. válaszára P.H:-nek.
Ezért írtam korábban hogy milyen fontos hogy egy feladat EGYÉRTELMŰEN ÉRTELMEZHETŐ legyen. Abban az esetben ahogy én gondoltam ott NEM TÉVEDEK, az más kérdés hogy TE másképp ÉRTELMEZTED a feladatot. Be kellet volna neveznünk a "Ki lesz Uri Geller útódja" című műsorba, gondolatolvasás kategóriába, hogy betekintsünk a tanárbácsi fejébe.Timikee, innentől már neked szól. Szóval ha FELTÉTELEZEM, hogy P.H. FELTÉTELEZÉSE a helyes , akkor íme a kód:
(elfogadtam P.H. verzióját, ezen már nem múlik semmi , tehát végignézi a biteket és az első előfordulásnál kilép AL=1-el, egyébként meg AL=0 )mov eax,10111111b //v2
mov ebx,11111111b //v1
mov ecx,8 //ciklusszámláló
mov edx,ecx //bitindex
dec edx //csökkenteni, mert 7.-0. bitet vizsgálunk
@lab001: bt ebx,edx //ebx edx-edik bit vizsgálata-> CarryFlag
jnc @lab002 //ha alacsony(0), akkor következő ciklus
bt eax,edx //eax edx-edik bit vizsgálata-> CarryFlag
jnc @lab003 //ha alcsony(0), akkor kilépés AL=1-el
@lab002: dec edx //bitindex csökkentése
loop @lab001 //következő ciklus
mov al,0 //cilus vége, nincs megfelelő bitkombináció
jmp @exit //kilépés AL=0-val
@lab003: mov al,1
@exit:Ezt Delphi-be készült ezért címkéket meg egyebeket átírod a HLA-nak megfelelőre.
A példában csak 8 bitet vizsgálok ill binárisan írtam be eax,ebx értékét, hogy lásd hogy a 6. bitpozíción fordul elő a feltétel. 32 bitnél meg csak át kell írni ecx-t 32-re.Fire.
[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
t.timikee
csendes tag
Hello !
Hát kipróbáltam/átírtam a kódokat, mindenkinek köszi. De sajnos nem megy még mindig. Case.hla-ban ír hibát.
Procedure Bitek(V1:int32 in EBX; V2:int32 in EAX);
VAR tmp:dword;
Begin Bitek;// AL=(V1 minden bitje >= V2 megfelelö bitje)?1:0
MOV(32, EDI);
MOV(EAX, ECX);
SUB(EAX, EAX);
while(EDI != 0) do
BT(EDI, ECX);
if(@C) then // amenyiben az aktuális bitje a V2-nek 1
BT(EDI, EBX);
if (@NC) then // és a V1 aktuális bitje 0, akkor -> 0
SUB(EDX, EDX); // legyártjuk a 0-t
RCR(1, EDX);
RCL(1, AL);
else // különben -> 1
SUB(EDX, EDX); INC(EDX); // legyártjuk az 1-et
RCR(1, EDX);
RCL(1, AL);
endif;
else
// ha az aktuális bit 0, akkor V1 mindenképpen nagyobb vagy egyenl?
SUB(EDX, EDX); INC(EDX); // legyártjuk az 1-et
RCR(1, EDX);
RCL(1, AL);
endif;
DEC(EDI);
endwhile;
End Bitek;bbj330@hallg:~/assembler$ asmtest 5
Error in file "case.hla" at line 10 [errid:3753/hlaparse.bsn]:
Expected ';', encountered ':'.
Near: << : >>case.hla [87]:
error: undefined symbol.
/home/asmzsuri/bin/asmtest: line 47: ./test: Nincs ilyen fájl vagy könyvtár
Kivetel!!!Ezt írja, erre a kódra. Állítólag az én kódomban van a hiba. Ha a Ti verziótokat írom, akkor is ugyanez a hiba üzenet.
Na erre varrjon valaki gombot -
félisten
válasz t.timikee #206 üzenetére
Hali!
Szeretem a kihívásokat, hla-ba még úgyse írtam.
Annyit árulj el hogy mit használsz a kódhoz, én két szerkesztőt találtam HIDE, meg RADASM néven.Letöltöttem a HLA v1.99-et, kell még valami hozzá?
Fire.
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
félisten
válasz t.timikee #206 üzenetére
Hali!
Bocs, de teljesen nulláról most elsőre ennyi tellett, befordítható, rendesen működik, HIDE segítségével írtam.
Majd holnap kicsit jobban átnézem a HLA-t, és akkor megírom "HLA-san".program hlafire;
#includeonce ("stdlib.hhf")
#includeonce ("hide/hidelib.hhf")
#includeonce ("macros/macros.hhf")
#includeonce ("macros/extensions.hhf")
?@nodisplay := true;
?@noalignstack := true;
begin hlafire;
mov (%10111111,eax); //v2
mov (%11111111,ebx); //v1
mov (8,ecx); //ciklusszámláló
mov (ecx,edx); //bitindex
dec (edx); //csökkenteni, mert 7.-0. bitet vizsgálunk
lab001: bt (edx,ebx); //ebx edx-edik bit vizsgálata-> CarryFlag
jnc lab002; //ha alacsony(0), akkor következő ciklus
bt (edx,eax); //eax edx-edik bit vizsgálata-> CarryFlag
jnc lab003; //ha alcsony(0), akkor kilépés AL=1-el
lab002: dec (edx); //bitindex csökkentése
loop lab001; //következő ciklus
mov (0,al); //cilus vége, nincs megfelelő bitkombináció
jmp fireexit; //kilépés AL=0-val
lab003: mov (1,al);
fireexit: stdout.put("AL=",al);
end hlafire;Fire.
[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
t.timikee
csendes tag
válasz Fire/SOUL/CD #208 üzenetére
Hello!
A kódodra ezt a hiba üzenetet adja:
Error in file "case.hla" at line 10 [errid:3753/hlaparse.bsn]:
Expected ';', encountered ':'.
Near: << : >>case.hla [87]:
error: undefined symbol.
Error in file "./unit.hla" at line 20 [errid:876/output.c]:
Undefined statement label referenced in procedure body.
Near: << cimke >>./unit.hla [94]:
error: undefined symbol.
/home/asmzsuri/bin/asmtest: line 47: ./test: Nincs ilyen fájl vagy könyvtár
Kivetel!!!nem tudom miaz h case.hla, és mért azt írja, mikor a forrásomnka más a neve...
10.sor:dec(edx);
20.sor: endFgv5; utáni üres sor.
47.sor pedig nincs is -
félisten
válasz t.timikee #209 üzenetére
Hali!
Igen látom, az a gond, hogy teljesen mindegy mit írsz, ugyanaz a hibaüzenet.
Azt javasolnám hogy a HLA-t töltsd le innét: [HLA v1.99]
Itt még sok más is van ami jól jöhet.A HIDE-t meg innét: [HIDE 1.27.01]
Miután megvan, abba illeszd be a kódom, ott mennie kell, aztán írj.
Fire.
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
P.H.
senior tag
válasz Fire/SOUL/CD #210 üzenetére
#206-ot látva mindenképp op src,dest formában kell írni a programot, tehát a HLA-t definiáljuk így (és ne definiáljuk át):
The Anatomy of an HLA Program
Some Basic HLA Control StructuresKb. ilyesmi az eredmény:
Procedure Bitek(V1:int32 in EBX; V2:int32 in EAX);
// EBX: bejövő V1
// EAX: bejövő V2
// eredmény: AL=(V1 minden bitje >= V2 megfelelö bitje)?1:0
Begin Bitek;
mov (32,cl);
mov (eax,esi);
mov (1,al);
while (cl > 0) do
mov(0,dl);
shr(1,ebx);
adc(0,dl);
mov(dh,0);
shr(1,esi);
adc(0,dh);
if (dl < dh) then
mov(0,al);
break;
endif;
sub(1,cl);
endwhile;
End Bitek;[ Szerkesztve ]
Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
t.timikee
csendes tag
válasz Fire/SOUL/CD #210 üzenetére
Hello!
Aza baj, hogy nekem ezt felkell másolnom egy szerverre, ahol már kivan alakítva a környezet, így én semmit nem tudok beállítani. CSak letesztelteni a kódomat.
-
t.timikee
csendes tag
Hello!
Szintén ugyanaz a hiba. Nem tudom miért van ez. Állítólag a kódban van a hiba. Nem tudja valaki miaz a case.hla?? Mert érdekes módon a többi feladatomat lefordítja, és leis teszteli a saját forrás nevével. Csak ezzel az egy feladattal van baja. De már kifogyok az ötletekből, meghogy egyátalán mitől milrt van ez??
Error in file "case.hla" at line 10 [errid:3753/hlaparse.bsn]:
Expected ';', encountered ':'.
Near: << : >>case.hla [87]:
error: undefined symbol.
Error in file "./unit.hla" at line 14 [errid:107981/hlaparse.c]:
syntax error, unexpected intconst.
Near: << 0 >>./unit.hla [87]:
error: undefined symbol.
/home/asmzsuri/bin/asmtest: line 47: ./test: Nincs ilyen fájl vagy könyvtár
Kivetel!!! -
-AD4M-
tag
Hali!
Lenne pár kérdésem:
/ DS - GS -t védett módban fel lehet tölteni MOV DS,.. -tal?
/ CS-nek hogy lehet értéket adni védett módban?
/ Ha egy adat és egy kódszegmens mérete és kezdési helye megegyezik, akkor lehet a kódon belül változókat használni?Köszi a válaszokat!
Allons-y!
-
P.H.
senior tag
"DS - GS -t védett módban fel lehet tölteni MOV DS,.. -tal?"
Igen, de a második paraméter védett módban nem szegmenscím, hanem egy előre beállított selector, tehát túlmutat az alkalmazásprogramozói szinten. Szóval nem."CS-nek hogy lehet értéket adni védett módban?"
Csak távoli ugrásokkal vagy call gate-ekkel, de többet azt hiszem, nem akarsz tudni; azaz sehogy."Ha egy adat és egy kódszegmens mérete és kezdési helye megegyezik, akkor lehet a kódon belül változókat használni?"
Valós módban simán, védett módban elméletileg tudtommal nincs akadálya, de az OS-ek nem engedik, és manapság nem is lenne érdemes, sokkal több a veszteség, mint a nyereség; pl. a változók értékének megváltoztatása a self-modifying code kategóriába esik.[ Szerkesztve ]
Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
P.H.
senior tag
-
P.H.
senior tag
Ez. Nehezen tudom elhinni, hogy egy hétvégén egyszerre két embernek jutott eszébe OS nélküli programot írni.
A védett mód amúgy miért kell, ha a konzervatív, valós módban megszokott technikák megvalósításának mikéntjét kérdezed? A 32 bites programozás miatt, az 1 MB-nál több memória használatáért, vagy csak a kihívás hajt?
Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙
-
-AD4M-
tag
Hát hogyismongyam...
Egy kernelt akarok írni assemblyben (mikrokernel!). Leginkább az alacsony szintű programozást akarom gyakorolni, meghát arra is kíváncsi vagyok, hogy mennyit tudok magam összehozniEgyébként nekem a védett mód sokkal szimpatikusabb mint a valós.
Beviszem a szegmensregiszterbe, hogy melyik szegmens kell, aztán a teljes címtartományban garázdálkodhatok.Szerk: Ja és ez az első progi amit asm-ben írok
[ Szerkesztve ]
Allons-y!
-
félisten
Hali!
Elöször rögtön annyit had mondjak, hogy amit leírok, azt nem azért teszem, hogy elvegyem a kedved az Assembly-től vagy lebeszéljelek róla, hanem csak jó tanácsnak szánom, amit megfogadsz vagy sem, rajtad múlik. 6 évet töltöttem Assembly programozással, rendszerszinten is, rendszerprogramozói szakon végeztem, a mai napig visszanyúlok az Assembly-hez ha szükséges. Nem tudom ismered-e ezt az idézetet?
"Amit nem lehet Pascal-ban megírni, azt C/C++-ban meg lehet. Amit nem lehet C/C++-ban megírni, azt Assembly-ben meg lehet. Amit nem lehet Assembly-ben megírni, azt nem lehet megírni!"
Ebből az a lényeg(többek közt), hogy az Assembly a legösszetettebb, legnagyobb információs hátteret igénylő programozási nyelv. Az a téma amit választottál(kernel) az egyik legnagyobb kihívás még tapasztalt programozók ill. programozó team-ek számára is.
Abból amit írtál:"Ja és ez az első progi amit asm-ben írok" nem javasolnám hogy belekezdj kernel szintű dolgokba. Miért? Mert saját magaddal fogod megutáltatni az Assembly-t, mert egész biztosan rengeteg "csalódás" fog érni folyamatosan.
"miért nem fordul be?"
"mit ír ki ez a ....?"
"most miért nem azt csinálja?"
"megint resetelhetek..."és még sok-sok hasonló mondat (és ennél sokkal durvább is) fogja elhagyni a szádat, miközben a fejedet vered az asztalba, majd megfogod a gépet és kivágod az ablakon, ezzel végetvetve Assembly-s (rövid) korszakodnak.
Ezért én azt javasolnám, hogy az alapokkal kezdj, mert anélkül esélytelen a dolog. Az Assembly-hez idő kell, rengeteg doksi bújása, na meg türelem.
Két könyvet javasolnék ami alapnak számít az Assembly-hez:
Peter Norton - Az IBM PC programozása
Ez egy alapkönyv, amiből megtanulható a képernyő-, memória- elsődleges ki/be eszközök- lemezekkezelés és még sok-sok alap dolog.Dr. Kovács Magda - 32 bites mikroprocesszorok II.
Ez már magas színtű könyv, a proci működés, valós ill védett mód, memóriakezelés, taszkok működése-kezelése és még sok rendszerszintű dolog van bent részletesen ismertetve, rengeteg hasznos és nélkülözhetettlen táblázattal. Valamint Assembly utasítások(386/486) részletes leírása, működésük.Remélem, válaszom jó tanácsnak veszed és nem okoskodásnak.
Fire.
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
#95904256
törölt tag
Sziasztok!
Szeretném megállapítani egy 386/486 kategóriájú processzor órajelét egy Win98 alá írodó kis programocskában. Hogyan lehet ez megoldani ( az RDTSC utasítás nélkül ), úgy hogy legalább 1% pontosságú eredményt kapjak?
A kérdés azért merült fel bennem mert a elindítottam a CPU-Z 1.45-ös verzióját pár régebbi processzoron és bizony sokszor össze-vissza ugráltak a mért értékek. ( Pl. egy K5-ös processzoron egyik pillanatban 0MHz-et, néha meg 3200MHz feletti értéket mért. )
szerk.: Természetesen szeretném elkerülni azt hogy meg kelljen állapítani a processzor típusát és processzor típusához rendelt konstansok alkalmazását.
[ Szerkesztve ]
-
#95904256
törölt tag
válasz #95904256 #224 üzenetére
Közben kikísérleteztem egy módszert, többé-kevésbé működik is, bár még van mit finomítani rajta. De a lényegi része elég egyszerű. Megmérem több különböző utasítás végrehajtási idejét úgy hogy a legkisebb értéknél se legyen az idő szórás nagyobb 10%-nál. Majd megkeresem a kerekített időadatok legnagyobb közös többszörösét, ez megadja az ( egy órajel * mért utasítások száma ) végrehajtási "virtuális" idejét. Sajna már a 10% pontosságú órajelmérés is eltart egy percig...
-
-
labuwx
tag
Sziasztok!
Azt szeretném kérdezni, hogy hogyan lehet elindítani a NASM-ot mert egy pillanatra bejön egy parancssor ablak és ennyi. 64-bites Vistát használok, de 32-es xp alatt is ugyanez a baj. A segítséget előre is köszönöm. -
#95904256
törölt tag
Hirtelen két megoldás is eszembe jutott.
Az egyik, hogy a párhuzamos végrehajtásra alkalmas processzorok már ismerik az RDTSC utasítást, így erre az egész mókára nincs szükség.
A másik hogy olyan utasításokat használsz amelyek mégis csak függőségben vannak. Tkp. a következő utasításhoz szükséges az előző utasítás eredménye, így csak egymás után hajtódnak végre az utasítások.
szerk.: Ha meg a 386-os esetre gondoltál, ahol minden utasítás legalább 2 órajel, akkor jó helyen jársz, mert épp ez a lényege a dolognak. Ugyanis azért kell több utasítás idejét megmérni hogy prímtényezőkre bontva (1 órajellel mindegyik osztható) számolható legyen az órajel. Ezért is javítottam gyorsan hogy nem többszöröst, hanem legnagyobb közös osztót kell keresni.
[ Szerkesztve ]
-
pgyorgy
csendes tag
válasz #95904256 #232 üzenetére
Az RDTSC utasítást minden CPU ismeri, amelyik a CPUID-t is (ennek tesztelési módját gondolom ismered, csak hogy az invalid instruction kizárást elkerüljük), vagyis nem kell hozzá, hogy "párhuzamos végrehajtásra alkalmas" processzor legyen, az Intel és AMD 486 késői szériáin (amik már write-back cache-esesek), a Cyrix késői 486-osain és 5x86-osán, valamint minden ez utáni procin működik, csak az általa adott eredményt össze kell hasonlítani egy ismert és lehetőleg pontos idővel. A DOS-os időkben az RTC-t használva referenciának értelmetlen pontossággal meg lehet határozni az órajelet már egytized másodperc alatt is.
A függőségekkel vigyázni kell, mert bizonyos függőségek (pl. a cache/memória késleltetés mérésére használt "módosított adatból a következő adat memóriacíme" tipusú utasítássorok extra késleltetést okozhatnak (AGI - address generation interlock), ami megintcsak CPU mag függő (486-oson és Pentium-on 1 órajel, Pentium4-en, Cyrix 5x86/6x86-on és az AMD K6 szériáján 2, míg PentiumPro/II/III procikon és a K7/K8 szérián 3 órajel), valamint probléma lehet az is, hogy az OOO végrehajtásra képes procik a teszt-loop egyéb (független) utasításait bekeverik a függők közé, hogy hasznosan töltsék a várakozási időt és ez is megzavarhatja a mérés pontosságát...
-
Desmond
csendes tag
Sziasztok!
Azt szeretném kérdezni, hogy mivel tudnám lefordítani a .asm fájlokat?
We can't solve problems by using the same kind of thinking we used when we created them. ASUS P8P67, Intel Core i7-2600k, G.Skill 2*4GB 1600MHz, Sapphire Radeon HD6970, Scythe Ninja 3, Samsung SyncMaster P2770HD.
-
#95904256
törölt tag
Egy assembler program kell hozzá, de hogy milyen az attól függ hogy milyen szintaxissal és milyen processzorra íródott. Próbáld meg ezzel: Flat Assembler
-
Gabee001
csendes tag
Sziasztok! Volna egy probléma, amit sehogy nem tudok megoldani:
Kérjen be ellenőrzötten a billentyűzetről egy római számot (1-tól 10-ig), konvertálja át
hexadecimálissá és írassa ki a VDU -ra.Légyszi segítsetek nagyon fontos lenne! Köszönöm előre is.
-
-
Jester01
veterán
válasz Gabee001 #238 üzenetére
64 bites gas assemblerrel pl. a következő egy megoldás lehet magára a konverzióra:
.text
.globl getroman
.type getroman, @function
getroman:
movq %rax, %rbx
movq $numbers, %rdx
LOOP1:
movq %cs:(%rdx), %rdi
or %rdi, %rdi
jnz OK
movb $'?', %al
jmp DONE
OK:
movq %rbx, %rsi
LOOP2:
movb (%rsi), %al
cmpb %cs:(%rdi), %al
je MATCH
addq $8, %rdx
jmp LOOP1
MATCH:
cmpb $'\n', %al
movb %cs:1(%rdi), %al
je DONE
incq %rsi
incq %rdi
jmp LOOP2
DONE:
ret
numbers:
.quad r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, 0
r1: .ascii "I\n1"
r2: .ascii "II\n2"
r3: .ascii "III\n3"
r4: .ascii "IV\n4"
r5: .ascii "V\n5"
r6: .ascii "VI\n6"
r7: .ascii "VII\n7"
r8: .ascii "VIII\n8"
r9: .ascii "IX\n9"
r10: .ascii "X\nA"A függvényt C-ből a char getroman(const char* s) formában lehet hívni. (Bemeneti pointer a rax regiszterben, kimeneti karakter az al regiszterben.) Alakítsd át igényeid szerint. A MATCH címke előtt van egy add utasítás, oda a megfelelő pointer méretet kell tenni. HTH.
Jester
-
#95904256
törölt tag
Köbgyököt szeretnék vonni, lehetőleg valami gyors FPU-s megoldás érdekelne.
Tud erre valaki valamit javasolni? -
Jester01
veterán
válasz #95904256 #242 üzenetére
x^(1/3) = 2^ (log2(x) / 3)
A 2^x lépést két lépésbe kell szétszedni, mert az f2xm1 csak -1..+1 intervallumban működik tehát az egész részt fscale segítségével lehet..globl cuberoot
.type cuberoot, @function
cuberoot:
movlpd %xmm0, -8(%rsp)
fld1
fldl -8(%rsp)
fyl2x
fmull third
fld %st(0)
frndint
fsub %st(0), %st(1)
fxch
fchs
f2xm1
fld1
faddp
fscale
fstp %st(1)
fstpl -8(%rsp)
movlpd -8(%rsp), %xmm0
ret
.data
third: .double 0.333333333333#include <stdio.h>
extern double cuberoot(double x);
int main()
{
double x;
scanf("%lf", &x);
printf("cuberoot(%g) = %g\n", x, cuberoot(x));
return 0;
}Jester
-
labuwx
tag
Sziasztok!
Tudnátok linkelni egy nagyon részletes és szájbarágós leírást az assembly alapokhoz?
+Kérlek mondjatok egy programot ami a program futása közben és után kiírja a változók és regiszterek értékét.
A segítséget előre is köszönöm. -
félisten
Hali!
Nem kis fába vágtad a fejszéd...Sajnos Assembly-ben a "szájbarágós" dolgok is elég "csúnyán" hangzanak. Ezek x86-os és nem x64-es cuccok, mert "kezdetnek" épp elég lesz.
Assembler(jó a súgó) :[MASM32]
Jó a debuggere, a súgóban bent vannak a 386/486 opcode-okDoksik: [NAGYON JÓ]
[Magyar jegyzet]Fire.
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
labuwx
tag
Üdv.
Azt szeretném kérdezni, hogy ha én a memóriába az első bittől kezdve elkezdek írni, akkor az a valóságban is az első bitnél kezdődik? Ha egyszerre elindítok két programot ami ugyanezt csinálja akkor mi történik? -
félisten
Hali!
Először is: Bitenként nem lehet írni, csak BYTE-onként, az más dolog, hogy bitenként fel lehet dolgozni. Tehát az első byte-tól kezdődően, az valóban az első byte-tól kezdődően..
(remélem nem arra gondoltál, hogy a memória 0000:0000 címétől(32 bites rendszernél) kezdve, merthogy ide is lehet írni, csak akkor biztos hogy csontra fagy a gépezet )Két progi ugyanarra a memóriacímre ír, akkor nem történik semmi, az egyik felülírja a másik által korábban a memóriacímre helyezett adatot.
(remélem jól értelmeztem a kérdésed)Fire.
[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
Új hozzászólás Aktív témák
Hirdetés
- LEGO klub
- Fortnite - Battle Royale & Save the World (PC, XO, PS4, Switch, Mobil)
- Hálózati / IP kamera
- Politika
- Milyen TV-t vegyek?
- Ukrajnai háború
- OLED TV topic
- Amlogic S905, S912 processzoros készülékek
- Okos Otthon / Smart Home
- Már a Samsung sem szolgálja ki modern AI lapkákkal Kínát
- További aktív témák...
- Legion 5 15ARH7 15.6" FHD IPS Ryzen 5 6600H RTX 3050Ti 16GB 512GB NVMe magyar vbill gar
- ÁR ALATThinkPad Thunderbolt 3 Dock (40AC) úttörő, 13 portos dokkoló megoldás akár ingyenes szállítás
- Dell Precision 5550 - CORE I7-10850H 2.70 GHZ/32GBb/2TB SSD/
- Gigabyte Core i7 Gamer PC: i7-9700 / RTX 3060 Ti / 1Tb SSD / 16Gb Ram
- 7320 2-in-1 27% 13" FHD+ IPS érintő i7-1180G7 16GB 512GB NVMe ujjlolv IR kam gar
Állásajánlatok
Cég: HC Pointer Kft.
Város: Pécs
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest