Príklady preberané na prednáškach
Naprogramujte assemblerovú funkciu
function pocet1(x:cardinal):byte;
Jej výstupom je počet jedničiek v dvojkovom zápise
vstupného čísla x.
function
pocet1(x:cardinal):byte;
asm
mov cl,0
@1: shr eax,1
adc cl,0
cmp eax,0
jne @1
mov al,cl
end;
Naprogramujte assemblerovú funkciu
function obrat(x:cardinal):cardinal;
Jej výsledkom je hodnota x otočená po bitoch naopak.
Teda ak rozpísané po bitoch x = b31 b30
b29 ... b1 b0 tak výsledok
funkcie má byť číslo b0 b1 b2
... b30 b31
function
obrat(x:cardinal):cardinal;
asm
mov ecx,32
@1: rol eax,1
rcr edx,1
loop @1
mov eax,edx
end;
Naprogramujte assemblerovú funkciu
function jePalyndrom(x:cardinal):boolean;
Jej výsledkom je true, ak zápis vstupnej hodnoty x v
dvojkovej sústave na 32 bitov je palyndróm.
Poznámka: boolean je v Delphi zobrazený v jednom bajte a
jeho hodnota je 0 pre False a 1 pre True.
function
jePalyndrom(x:cardinal):Boolean;
asm
mov ecx,32
@1: rol eax,1
rcr edx,1
loop @1
cmp eax,edx
sete al
end;
Naprogramujte assemblerovú funkciu
type pole = array[1..10] of integer;
function pocetvyskytov(var a:pole; p:integer):byte;
Jej výstupom je počet výskytov hodnoty p v poli a
type
pole = array[1..10] of integer;
function
pocetvyskytov(var a:pole;
p:integer):byte;
asm
push esi
mov esi,eax
mov al,0
mov ecx,10
@1: cmp [esi],edx
jne @2
inc al
@2: add esi,4
loop @1
pop esi
end;
Naprogramujte assemblerovú procedúru
type pole = array[1..10] of integer;
procedure vynuluj(var a,b:pole);
pole b obsajuje čísla od 0 do 10. Hodnoty 1 až 10 sa
interpretujú ako index do poľa a, hodnota 0 je koncová
značka.
V poli b je teda 1 až 9 indexov do poľa a ukončených koncovou
značkou.
Úlohou procedúry vynuluj je vynulovať tie prvky poľa a,
ktorých indexy sú v poli b.
type
pole = array[1..10] of integer;
procedure
vynuluj(var a,b:pole);
asm
push esi
mov esi,eax // esi - a ,
edx - b
@1: mov ecx,[edx]
cmp ecx,0
je @2
mov dword ptr [esi+ecx*4-4],0
add edx,4
jmp @1
@2: pop esi
end;