Assembly/Adatmozgatás
Összefoglalás
szerkesztésAz 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ésEtimoló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éspélda
szerkesztésFeladat: 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ésFeladat: 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ésFeladat: 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ésFeladat: 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.