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;