Hirdetés

2024. május 8., szerda

Gyorskeresés

Hozzászólások

(#201) P.H. válasza Fire/SOUL/CD (#198) üzenetére


P.H.
senior tag

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 ˙˙˙

(#202) Fire/SOUL/CD válasza t.timikee (#200) üzenetére


Fire/SOUL/CD
félisten

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 :Y )

Fire.

UI: Tanárbácsit meg el kell küldeni továbbképzésre. :C

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

(#203) t.timikee válasza Fire/SOUL/CD (#202) üzenetére


t.timikee
csendes tag

Értem már hogy mit mondasz. Amugy HLAban programozunk/programoznánk, ha lenne egyátalán gyakorlatunk, és nem magunktól kéne megtanulni...

(#204) t.timikee


t.timikee
csendes tag

értem már a dolgokat!!! :DD
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 :DDD

(#205) Fire/SOUL/CD válasza t.timikee (#204) üzenetére


Fire/SOUL/CD
félisten

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. :DD

Timikee, innentől már neked szól. Szóval ha FELTÉTELEZEM, hogy P.H. FELTÉTELEZÉSE a helyes :D , akkor íme a kód:
(elfogadtam P.H. verzióját, ezen már nem múlik semmi :R, 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)

(#206) t.timikee


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 :Y

(#207) Fire/SOUL/CD válasza t.timikee (#206) üzenetére


Fire/SOUL/CD
félisten

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)

(#208) Fire/SOUL/CD válasza t.timikee (#206) üzenetére


Fire/SOUL/CD
félisten

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)

(#209) t.timikee válasza Fire/SOUL/CD (#208) üzenetére


t.timikee
csendes tag

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

:Y

(#210) Fire/SOUL/CD válasza t.timikee (#209) üzenetére


Fire/SOUL/CD
félisten

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)

(#211) P.H. válasza Fire/SOUL/CD (#210) üzenetére


P.H.
senior tag

#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 Structures

Kb. 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 ˙˙˙

(#212) t.timikee válasza Fire/SOUL/CD (#210) üzenetére


t.timikee
csendes tag

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. :(

(#213) t.timikee válasza P.H. (#211) üzenetére


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?? :O

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!!!

(#214) P.H. válasza t.timikee (#213) üzenetére


P.H.
senior tag

Mi a teljes szöveg, amit felmásolsz?

Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙

(#215) t.timikee válasza P.H. (#214) üzenetére


t.timikee
csendes tag

Helló!
Ennyi az egész. Ezt írja, akármilyen forrást írok.

(#216) -AD4M-


-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!

(#217) P.H. válasza -AD4M- (#216) üzenetére


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 ˙˙˙

(#218) -AD4M- válasza P.H. (#217) üzenetére


-AD4M-
tag

Köszi!
A progi alatt nem lesz OS. Úgyhogy az nem kavar be.
A távoli ugrás: offszet és szelektor ?

Allons-y!

(#219) P.H. válasza -AD4M- (#218) üzenetére


P.H.
senior tag

"A távoli ugrás: offszet és szelektor ?"

Igen.

A feltett kérdések kapcsolatban vannak egy, a prog.hu-n péntek délután nyitott témával?

Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙

(#220) -AD4M- válasza P.H. (#219) üzenetére


-AD4M-
tag

Nem.

De mi az a téma? :))

Allons-y!

(#221) P.H. válasza -AD4M- (#220) üzenetére


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 ˙˙˙

(#222) -AD4M- válasza P.H. (#221) üzenetére


-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 összehozni :DD

Egyé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 :C

[ Szerkesztve ]

Allons-y!

(#223) Fire/SOUL/CD válasza -AD4M- (#222) üzenetére


Fire/SOUL/CD
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. :D

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)

(#224) #95904256


#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 ]

(#225) #95904256 válasza #95904256 (#224) üzenetére


#95904256
törölt tag

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... :(

(#226) #95904256 válasza #95904256 (#225) üzenetére


#95904256
törölt tag

szerk.: "legnagyobb közös többszörös" -> legnagyobb közös osztó
Látom nem figyeltek. ;)

(#227) pgyorgy válasza #95904256 (#225) üzenetére


pgyorgy
csendes tag

Ebben én csak azt nem értem, hogy oldod meg azt a problémát, hogy vannak processzormagok, amik (függőségek nélkül) akár három utasítást is végrehajtanak órajelenként (P6), másoknak meg a minimum két órajelciklus minden utasítás (386)...

(#228) labuwx


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.

(#229) PazsitZ válasza labuwx (#228) üzenetére


PazsitZ
addikt

Az egy parancssoros fordító alkalmazás. Indítsd egy cmd ablakban a megfelelő paraméterekkel.

- http://pazsitz.hu -

(#230) labuwx válasza PazsitZ (#229) üzenetére


labuwx
tag

Le tudnád írni, hogy milyen paraméterek kellenek?

(#231) PazsitZ válasza labuwx (#230) üzenetére


PazsitZ
addikt

nasm -h

kiírja a paramétereket.

Amúgy egy sima fordításhoz:
nasm [forrás file] -o [cél file] formát kell alkalmazni:

nasm prog.asm -o prog.com

- http://pazsitz.hu -

(#232) #95904256 válasza pgyorgy (#227) üzenetére


#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 ]

(#233) pgyorgy válasza #95904256 (#232) üzenetére


pgyorgy
csendes tag

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...

(#234) Desmond


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.

(#235) #95904256 válasza Desmond (#234) üzenetére


#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

(#236) Gabee001


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.

(#237) Jester01 válasza Gabee001 (#236) üzenetére


Jester01
veterán

Konkrétan melyik résszel van probléma?
Csinálj egy táblázatot amiben a római számok vannak felsorolva egymás után.
Aztán sorban hasonlítsd össze a beadott szöveget ezekkel. A hexa kiírást is csinálhatod egy táblázattal vagy számítással is.

Jester

(#238) Gabee001 válasza Jester01 (#237) üzenetére


Gabee001
csendes tag

E-mail és privi ment! Előre is köszönöm szépen a segítséget! :R

[ Szerkesztve ]

(#239) Jester01 válasza Gabee001 (#238) üzenetére


Jester01
veterán

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

(#240) Gabee001 válasza Jester01 (#239) üzenetére


Gabee001
csendes tag

nagyon szépen köszönöm!!! :R :R :R :R :R

(#241) #95904256 válasza Gabee001 (#238) üzenetére


#95904256
törölt tag

Szerintem nézz be ide: [link]
Találsz itt komplett megoldást, 99 bájtban is... ;)
...és nem csak X-ig működik.

(#242) #95904256


#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?

(#243) #95904256 válasza #95904256 (#242) üzenetére


#95904256
törölt tag

Azt hiszem marad a Newton-Raphson iteráció...

(#244) Jester01 válasza #95904256 (#242) üzenetére


Jester01
veterán

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

(#245) #95904256 válasza Jester01 (#244) üzenetére


#95904256
törölt tag

Köszönöm! :R

Ez legalább egy nagyságrenddel gyorsabb mint az iteráció.

Xn+1 = 2/3 * Xn + N/3 * 1/xn^2

(#246) Jester01 válasza #95904256 (#245) üzenetére


Jester01
veterán

Ja még annyi, hogy ha negatív számokra is akarod akkor az előjelet még le kell kezelni.

Jester

(#247) labuwx


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.

(#248) Fire/SOUL/CD válasza labuwx (#247) üzenetére


Fire/SOUL/CD
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-ok

Doksik: [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)

(#249) labuwx


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?

(#250) Fire/SOUL/CD válasza labuwx (#249) üzenetére


Fire/SOUL/CD
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.. :DDD
(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 )

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)

Copyright © 2000-2024 PROHARDVER Informatikai Kft.