Assembly/Adatmozgatás

A Wikikönyvekből, a szabad elektronikus könyvtárból.

Összefoglalás[szerkesztés]

Az adatokat (legalábbis a 32 bites architektúrákon) 1, 2 vagy 4 bájtonként mozgathatjuk. Erre az assembly-ben a mov műveletet használjuk.

mov[szerkesztés]

Etimológia: mov <- move = mozgat

Cél: Adatok mozgatása.

Használat:

mov reg reg/mem/konst
mov mem reg/konst

Megjegyzések: Az adatokat mozgathatjuk memóriából regiszterbe, regiszterből memóriába vagy regiszterből regiszterbe, azonban nincs lehetőség adatok áthelyezésére közvetlenül a memórián belül. Ezt csak közvetett módon tehetjük meg: olvassuk be az adatot egy regiszterbe, majd a regiszterből írjuk ki a célhelyre.

Példák:

mov      eax, ebx        ; eax := ebx
mov      eax, [10h]      ; eax := 10h memóriacímen lévő 4 bájtos egész

; Az x memóriacímen lévő 4 bájtos adat mozgatása az y memóriacímre
mov      eax, [x]
mov      [y], eax

Ha a paraméterek között egy regiszter is szerepel, akkor egyértelmű, hogy hány bájtot kell másolni, azonban előfordulhat olyan eset is, amikor a szövegösszefüggésből nem derül ki egyértelműen, hogy hány bájtnyi adatra gondoltunk. Tekintsük a következő példát:

mov      [x], 2

Az x memóriacímen kezdőd bájtra, szóra vagy dupla szóra akarunk 2-t írni? Ilyen esetekben explicite meg kell határozni a cél méretét a byte, word illetve dword kulcsszavakkal.

mov      byte [x], 2        ; Az x címen lévő bájt 2 lesz.
mov      word [x], 2        ; Az x címen kezdődő szó 2 lesz.
mov      dword [x], 2       ; Az x címen kezdődő duplaszó 2 lesz.

Kidolgozott példák[szerkesztés]

példa[szerkesztés]

Feladat: Mit lesz a regiszterek értéke az alábbi kódrészlet lefutása után?

mov      eax, 2
mov      ebx, eax
mov      ecx, ebx

Megoldás: eax = 2, ebx = 2, ecx = 2

példa[szerkesztés]

Feladat: Mi lesz az ax, az ah és az al regiszter értéke az alábbi kódrészlet lefutása után?

mov      eax, 12345678h

Megoldás: ax = 5678h, ah = 56h, al = 78h

példa[szerkesztés]

Feladat: Mi lesz ebx értéke az alábbi kódrészlet lefutása után?

mov      ax, 1234h
mov      ah, al
mov      ebx, 0
mov      bx, ax

Megoldás: ebx = 00003434h

példa (csere)[szerkesztés]

Feladat: Cseréljük meg az x és az y memóriacímen lévő szavakat.

Megoldás:

mov      ax, [x]
mov      bx, [y]
mov      [x], bx
mov      [y], ax

Megjegyzést: A magasszintű programozási nyelvekkel ellentétben most nem elég egy ideiglenes változó. Ennek az az oka, hogy nem lehet közvetlenül memóriából memóriába adatokat mozgatni.