Nem teljesen értem a bit forgatást, valaki aki igen, eltudná magyaráznmi? (assembly)
ARM assemblynél hogyan működik a kis/nagy konsansok tárolása/forgatása?
Ha jól értem 12 bitet használunk fel egy érték letárolására, de ebból az első 4 az igazából csak egy forgató érték, azaz hogy az alsó 8 bitet mennyivel kívánjuk elforgatni (és így kaphatunk 2^32-ig bármit).
#1 De hogyan tudom megállapítani, ha pl látok egy "random" konstanst, hogy az mely 0-255 számnak az elforgatása és hogy mennyivel, anélkül hogy le kellene írnom az binárisan?
Mármint pl hogy a 3758096399 az a decimális 254(0xFE) elforgatása jobbra 4-gyel (azaz hogy a 12 bit felső 4 bitje 0010, az alsó 8 meg 254).
#2 Mi számít "nagy" konstansnak, amit már nem tudok forgatással elérni? Ami nagyobb, mint 2^32 ??
#3 A nagy konstansokat mi alapján / hogyan darabolom fel több kisebb assembly utasításra, hogy el tudjam tárolni őket?
Azaz a 0x7EDC8765 -t mért így kell feldarabolni, hogy
MOV R0, #0x7E000000
ORR R0, R0, #0xDC0000
ORR R0, R0, #0x8700
ORR R0, R0, #0x65
Nem nagyon értek ARM assemblyhez, de az nekem gyanús, hogy 32 bitet tárolna 12 biten.
Itt nem egy utasításról van szó gépi kódban?
#3 ha jól értem akkor az értéket összevagyolod (OR) az R0 registerrel és lemented az R0 regiszterbe. Mivel a vége 0, ezért ott az R0 regiszter tarzalma nem változik. Az, hogy ezt miért így kell csinálni nem tudom, elvégre a MOV az beírja az egészet, nem? Hány bites a processzor?
A bit forgatás azt jelenti, hogy egy adott szám bináris formában történő elmozdítását végezzük el bizonyos számú pozícióval balra vagy jobbra. A forgatást azzal érjük el, hogy először a szám bináris formáját előállítjuk, majd elforgatjuk azt az előre meghatározott számú pozícióval balra vagy jobbra.
#1 Ha látunk egy "random" konstansot, például a 3758096399-et, akkor először meg kell állapítanunk, hogy ez egy 12 bites szám. Ezután konvertálnunk kell a számot bináris formába, és meg kell néznünk az első 4 bitet, amelyek az elforgatást határozzák meg. Ha például az első 4 bit 0010, akkor az alsó 8 bitet jobbra kell forgatnunk 4 pozícióval.
#2 A "nagy" konstansok azok a számok, amelyek nagyobbak, mint a 2^32. Ezeket több kisebb konstansra kell bontani, hogy el tudjuk őket tárolni.
#3 A nagy konstansokat azzal kell felbontani, hogy először kiszámítjuk azokat a számokat, amelyeket az egyes bájtok (8 bit) képviselnek. Például a 0x7EDC8765-öt először a 0x7E000000-ot kell kiszámítani, majd az 0xDC0000-ot, az 0x8700-ot és végül az 0x65-öt. Ezeket a számokat külön-külön kell tárolni az assembly programban, és össze kell őket fűzni az ORR utasítással.
#1 Sajnos én még annyira se értek ehhez, ez csak témakör amit tudnunk kell vizsgára, de nem igazán lett elmagyarázva. Egyébként igen, gépi kódot kell assembly-re oda-vissza tudni felírni alap szinten. Az architektúra pedsig 32 bites (ARMv7).
#2 Igen a forgatást tudom mi, és a kódolás az még talán megy is, a visszaalakítás nem teljesen tiszta.
De hogyan állapítom meg ezt a 12 bites bitsorozatot??, mármint ha a 37...399-et átalakítom binárisba annak az elején nem lesz 0010, ráádásul nem is 12, hanem (nyilván) 32 bites lesz. Valamint visszafele alakítástál(dekókolás) nem balra kéne forgatni (hamár kódolásnál jobbra van) ??
Másik kérdés, hogy ez a részt mindenkép csak bináris átalaítással lehet megoldani, 10-es számrendszeres számolással nem ?
A 3.-at aszem megértettem és ha jól értem nem is kell binárissá alakítani a számokat, mivel hogy tudjuk hogy 1 db hexa szám az 4 bit szóval csak 2 esével(1 byte) leírni (helyiérték megtartásra figyelve) a számokat.
Tovább tippelek:
A példában a szám hex alakja E000000F, ami az FE 4 forgatása, azaz egy teljes 16 számjegyet jobbra tolsz, ami így bal oldalt jön be.
Más számra viszont ennél több szükséges, ha nincs tele 0-val, ekkor gondolom több ehhez hasonló forgatást kell csinálni (aminek az eredménye két 16-os számjegy és 6 db 0), majd ezeket összeadni (OR). Ilyen akkor max 4 kell gondolom
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!