Keresés


Toplista

Toplista
  • betöltés...

Magántanár kereső

Ha szívesen korrepetálnál, hozd létre magántanár profilodat itt.
Ha diák vagy és korrepetálásra van szükséged, akkor regisztrálj be és írd meg itt, hogy milyen tantárgyban!

Az alábbi assembly kódokban ,hogyan kell értelmezni a ciklusokat?

395
Amik nem világosak a számomra,azok a következők:

-Mikor egy regiszterre hivatkozunk,akár add-nál vagy mov-nál,akkor az mit jelent ,hogy ha kapcsos zárójelbe írjuk őket. Emellett ha a kapcsos zárójelben lévő regiszterhez hozzá adunk egy másik értéket vagy szorozzuk vagy kivonjuk ,akkor mi történik ,mi ennek a lényege?

-Ez a két assembly kód ,egy összeadást végez el úgy,hogy végig megy egy "tömbön" és a benne lévő elemeket össze adja. Tehát ebben a kódban ,mi "szimbolizálja" a ciklust? Illetve ez a ciklus milyen elemekből épül fel és miért ? (ha lehet a kódra hivatkozzatok)

-Miért szerepel ez a kizáró vagy a kód végén? (xor eax, eax)

-Utolsó sorban ,ugyan ez lenne a kérdésem mint az előbb csak a függvényekre kicserélve. Tehát mi "szimbolizálja" itt a függvényt ,illetve milyen elemekből épül fel és miért? (itt is a kódra hivatkozzatok ha lehet)

-----------------------------------------

.text
.global main
main:
mov ecx, len
mov eax, 0

_loop:
add eax, [array + ecx*4 - 4]
loop _loop
.intel_syntax noprefix

.data
formatstr:
.asciz "%d\n"
array:
.int 2,3,4,8,6
len:
.int 5

.text
.global main
main:
mov ecx, len
mov eax, 0

_loop:
add eax, [array + ecx*4 - 4]
loop _loop


push eax
push offset formatstr
call printf
add esp, 2*4


xor eax, eax
ret

-----------------------------------------

.intel_syntax noprefix

.data
formatstr:
.asciz "%d\n"
array:
.int 2,3,4,8,6
len:
.int 5

.text
sum:
push ebp
mov ebp, esp


mov eax, 0
mov edx, [ebp + 8]
mov ecx, [ebp + 12]

_loop:
add eax, [edx + ecx*4 - 4]
loop _loop

mov esp, ebp
pop ebp
ret


.global main
main:

push len
push offset array
call sum
add esp, 2*4

push eax
push offset formatstr
call printf
add esp, 2*4


xor eax, eax
ret

A válaszokat előre is köszönöm!
Jelenleg 1 felhasználó nézi ezt a kérdést.
0
Felsőoktatás / Matematika

Válaszok

1
Ööö...
Más assembly-ben programoztam, amikor még ezt tanultam, szóval most kicsit utána olvastam, és hátha segít, amit eddig elolvastam.
1.) Indirekt címzés. Olyan, mint a pointer. Egy tömbben nem tudod, hogy mi van, ezért az értékét nem tudod megadni, viszont tudod, hogy hol van, ezért a címét adod meg.
A hozzáadás, szorzás, kivonás pedig a mutatót mozgatja.
https://www.tutorialspoint.com/assembly_programming/assembly_loops.htm
2.) Meglepő módon a loop a ciklus, és ebből a három sorból áll az első esetben:
_loop:
add eax, [array + ecx*4 - 4]
loop _loop
Ennek az első sora egy címke, ahova ugrani lehet, és ezt is adja meg a 3. sorban, hogy oda térjen vissza. A loop parancs maga (tehát a 3. sor első szava) úgy működik, hogy addig ugrik vissza a _loop-ra, amíg az ecx nem nulla, és minden egyes lépsében csökkenti az értékét.
Az add pedig elvégzi az array tartalmának összeadását. A kapcsos zárójelben az array-t azért írjuk oda, mert az a tömb első elemére mutat. Az összeadást pedig hátulról előre végzi. Mivel az értékek 4 byte-onként vannak (legalábbis ez a feltételezésem, azt megtaláltam, hogy 4-enként vannak az adatok, de hogy tényleg azért mert 4 byte-okról, azaz 32 bitekről beszélünk, azt már nem tudom), ezért az ecx*4 pont a tömbön túlra mutat, ezért vonunk ki egyszer 4-et. Ezután csökken a loop miatt az ecx értéke, ekkor már az 5. értékre mutat az ecx*4, viszont azt márhozzáadtuk az előbb, ezért megint kivonunk 4-et. És így tovább.
http://www.cs.virginia.edu/~evans/cs216/guides/x86.html
3.) Az okot szintén nem találtam. Viszont 0-ra kell állítani az eax-t, és ez a leggyorsabb parancs hozzá.
https://stackoverflow.com/questions/1396527/what-is-the-purpose-of-xoring-a-register-with-itself
4.) Hasonlóan a loop-hoz itt is egy elnevezett területre hivatkozunk, még pedig a call paranccsal: call sum. Az sum-ot korábban, még a main előtt meghatároztuk, és a ret (return) parancsnál tér vissza.
A függvénnyel kapcsolatban ennél sokkal konkrétabb dolgot nem nagyon tudok mondani. A loop maga hasonlóan működik, mint az előző esetben, viszont az array nélkül. Ahhoz, hogy ezt meg tudjam magyarázni, ismernem kellene a registerek kiosztását, mivel úgy néz ki, hogy oda navigálja a 'pointer'-t, ahol az adatok kezdődhetnek. Ez persze szintén egy feltételezés, de ebből ne mtudom megmondani.

Remélem valamennyire segítettem.
0