Assemblyben,hogyan kell értelmezni az alábbi ciklusokat?
2019-04-03T14:01:38+02:00
2019-04-03T16:20:28+02:00
2022-08-11T11:35:29+02:00
stik
Sajnos nagyon sok hiányosságom van assemblyben és ezen az alábbi két kód értelmezésén ez meg is mutatkozik ,szóval a segítségeteket előre is köszönöm! Amik nem világosak a számomra,azok a következők:

-Mikor egy regiszterre hivatkozunk,akkor 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
Mutasd a teljes hozzászólást!
-Mikor egy regiszterre hivatkozunk,akkor 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?

Memóriacím lesz belőle:
- add eax,edx : hozzáadja eax-hoz az edx-et
- add eax,[edx] : hozzáadja az edx által mutatott memóriacímen kezdődő 32-bites számot az eax-hoz
Assembly-ben nincsenek típusok, azért ír [array+ecx*4-4]-et, mert 4 byte-osak a számok. A -4 meg azért kell, mert 5 és 1 között változik majd az ecx, így 4-et le kell majd vonni, hogy [array] és [array+16] közötti címek jöjjenek ki eredményül.

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

A loop. Nem szimbolizálja, hanem az a ciklus, angolul ez a gyűjtőnevük (és emberi szövegben "for loop", "while loop", "do-while loop" néven illetik a magasszintű nyelvek különféle ciklusait, illetve van ahol kulcsszóként is használják). A loop utasítás csökkenti eggyel az (e)cx-et, és amennyiben az eredmény nem 0, elugrik a megadott címre (_loop cimke a kódban). Ezért lesz 5, 4, ... 1 az ecx értéke, mert 0-nál már nem ugrik vissza (az elején meg 5-öt tölt be a "mov ecx,len".

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

A programból való kilépés végén az eax-be töltött 0 jelzi, hogy nem volt hiba. Ez az a bizonyos errorlevel, exit code, stb, amit shell scriptekben, .bat file-okban nézegetni lehet.

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

Assembly forráskódban vannak bonyolultabb szintaxisok, de a gép szintjén nincs olyan, hogy függvény, címek és ugrások vannak. A második példában a "sum:" a függvény belépési pontja, és a "call sum" a függvényhívás (a "ret" meg a return-t rövidíti). Függvényhívásoknál szokástól (de tényleg, "hívási konvenció" a neve) függően a regiszterekbe és/vagy a veremre kerülnek a függvény paraméterei, itt a két push teszi őket, a veremre, és az "add esp,2*4" tűnteti el (lehetne ott két pop is, csak így rövidebb). Az ebp-s esp-s varázslás az úgynevezett veremkeret kiépítését szolgálja, oda kerülhetnének a függvény lokális változói, csak ebben a példában minden elfér a regiszterekben, így a verem ilyen célú használata nem látszik.
Mutasd a teljes hozzászólást!

  • Szerintem először tanuld meg a nyelv alapjait (syntax), majd utána tutorial alapján így meg a saját hello world-öd, for ciklusod, első függvényed, stb..
    Akkor nem fognak felmerülni ezek a kérdések. Jelenleg túl messziről próbálsz nekifutni szerintem.

    első találat..
    Assembly Programming Tutorial
    Mutasd a teljes hozzászólást!
  • Az alapok nagyjából meg vannak. Csak itt ütköztem probléma ,mikor ezeket vettük. :/
    Mutasd a teljes hozzászólást!
  • -Mikor egy regiszterre hivatkozunk,akkor 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?

    Memóriacím lesz belőle:
    - add eax,edx : hozzáadja eax-hoz az edx-et
    - add eax,[edx] : hozzáadja az edx által mutatott memóriacímen kezdődő 32-bites számot az eax-hoz
    Assembly-ben nincsenek típusok, azért ír [array+ecx*4-4]-et, mert 4 byte-osak a számok. A -4 meg azért kell, mert 5 és 1 között változik majd az ecx, így 4-et le kell majd vonni, hogy [array] és [array+16] közötti címek jöjjenek ki eredményül.

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

    A loop. Nem szimbolizálja, hanem az a ciklus, angolul ez a gyűjtőnevük (és emberi szövegben "for loop", "while loop", "do-while loop" néven illetik a magasszintű nyelvek különféle ciklusait, illetve van ahol kulcsszóként is használják). A loop utasítás csökkenti eggyel az (e)cx-et, és amennyiben az eredmény nem 0, elugrik a megadott címre (_loop cimke a kódban). Ezért lesz 5, 4, ... 1 az ecx értéke, mert 0-nál már nem ugrik vissza (az elején meg 5-öt tölt be a "mov ecx,len".

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

    A programból való kilépés végén az eax-be töltött 0 jelzi, hogy nem volt hiba. Ez az a bizonyos errorlevel, exit code, stb, amit shell scriptekben, .bat file-okban nézegetni lehet.

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

    Assembly forráskódban vannak bonyolultabb szintaxisok, de a gép szintjén nincs olyan, hogy függvény, címek és ugrások vannak. A második példában a "sum:" a függvény belépési pontja, és a "call sum" a függvényhívás (a "ret" meg a return-t rövidíti). Függvényhívásoknál szokástól (de tényleg, "hívási konvenció" a neve) függően a regiszterekbe és/vagy a veremre kerülnek a függvény paraméterei, itt a két push teszi őket, a veremre, és az "add esp,2*4" tűnteti el (lehetne ott két pop is, csak így rövidebb). Az ebp-s esp-s varázslás az úgynevezett veremkeret kiépítését szolgálja, oda kerülhetnének a függvény lokális változói, csak ebben a példában minden elfér a regiszterekben, így a verem ilyen célú használata nem látszik.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd