9. gyakorlat
Mi a ~~[tetszőleges káromkodás]~~ péklapátért pont Assembly?
"Mert hozzátartozik a programozói műveltséghez!"
Assemblyben vannak olyanok, hogy regiszterek
Regiszter - olyan gyors, hogy nem is a RAM-ban van, hanem a processzorban
- eax (32 bites)
- ax (az eax felső 16 bitje)
- al (az ax/eax felső 8 bitje)
Ugyan ezek működnek a helyett b-vel, c-vel és d-vel.
esp - stack pointer
call read_natural ; Az értéke az eax-be landol
inc eax
push eax ; write_natural paraméterét feldobjuk a stack-re
call write_natural
add esp,4 ; csökkentjük 4 bájttal a stack méretét 4 bájttal, ezzel effektive kitörölni az előbb pusholt értéket
mov eax,0
ret
call- procedúra hívásinc- inkrementáláspush <reg a>-aregiszter tartalmát push a stack-repop <reg a>- stackről leveszi a legfelső elemet azaregiszerbemov <reg a> <reg b>- abregiszter tartalmát átrakja azaregiszterbeadd <reg a> <reg b>- azaésbregisztereket összeadja, majd azaregiszterben tároljasub <reg a> <reg b>- azaésbregisztereket kivonja, majd azaregiszterben tároljamul <reg a>- azeaxregiszer tartalmát beszorozza azaregiszer tartalmával.div <reg a>- azeaxregiszer tartalmát beszorozza azaregiszer tartalmával. Azeax-be kerül a hányados, azedx-be a maradék.not <reg a>- BIT-SZERINTI negálásxor <reg a>,1- xor 1-el, tehát a legkisebb helyiértékű bit cseréje. Hasznos boolean értékekhez
Assembly buildelése:
nasm -felf inc.asm # Létrehoz egy inc.o fájl
gcc -m32 io.c inc.o # összefabrikálja az inc.o és io.c fájlt egy futtatható fájllá
Ha nem a stack-re szeretnénk rakni az értékeket, foglalhatunk le nekik memóriát is:
section .bss ;block starting storage, according to Arnold
a resd 1 ; reserve double sized, 1 db
b resd 1
section .text
; ...
call read_natural
mov [a],eax ; szögletes zárójel: adott MEMÓRIAHELYEN lévő érték (olyan mint a C-ben a csillag. így `a` gyakorlatilag egy pointer)
call read_natural
mov [b],eax
Ha már itt tartunk, legtöbb instruction-nek meg lehet adni indirekt címlekérdezést is (a szögletes zárójelek) általában csak egy ilyet lehet megadni egy instructionnek.
Miért is használunk regisztereket?
A következő nem működik: mul [b]. Miért? Mert nem tudja, hogy b egy mekkora méretű konstrukcióra mutat. Megadhatjuk a mul-nak a szükséges méretet: mul dword [b].
Boolean
A boolean csak egy sima bájtban van tárolva. Így itt az al és bl etc. regisztereket használjuk, illetve memória rezervációkor resb-t.
Ennek ellenére, mivel a stacken a legkisebb tárolható érték 16 bit (2 bájt), al helyett ax-t pusholjuk a veremre.
cmp <reg a>, <reg b>- beállítja a speciális regisztereket (pl. a "nulla" regisztert, haaésbregiszterek megegyeznek)jne <pointer>- a megadott címre ugrik, ha a nulla regiszter nincs beállítva