10 septembrie 2010

Aflare maxim dintr-un sir (asm)

; aflare maxim dintr-un sir / sau minim

date segment word public 'data'
sir dw 16, 41, 40, 3 ; sau val lor in hexa
lung equ $-sir
max dw ?
mesaj db 13,10,'sir vid de valori - nu exista maxim',13,10,'$'
date ends

prog segment word public 'code'
assume cs:prog, ds:date
start:
mov ax, date
mov ds, ax
lea si,sir ; aduce offsetul sirului
mov cx, lung
call afla_max
jz depune_max ; daca ZF = 1, terminare cu succes
lea dx, mesaj ; in caz contrar
mov ah, 9 ; afisare mesaj
int 21h
jmp gata
depune_max:
mov max, ax ; maximul va fi initial in ax
gata:
mov ax, 4c00h
int 21h ; terminare
; intrari: SI, CX = offset si lungime sir in care se cauta
; iesiri: ZF = 1 daca s-a aflat max, returnat in AX
; ZF = 0, sir vid
afla_max:
cmp cx, 0 ; test sir vid
jnz maxim ; nu e vid, se determina maximul
; in caz contrar
cmp cx, 1 ; ZF devine 0, sir vid , se termina
ret
maxim:
push bx
push si
lodsw ; preia prima val. din sir, intra in AX, implicit CX = CX - 1
mov bx, ax ; init maxim temporar, care va fi in BX
jcxz gata ; daca CX == 0, a fost o singura val si deci e maxim
caut_maxim:
lodsw ; urmatoarea val din sir, intra in AX
cmp ax, bx ; compar cu maximul temporar aflat in BX
; daca aveam de gasit minimul, scriem jae in loc de jbe
jbe next ; daca AX mai mic sau egal cu BX (maximul temporar) trec la next
mov bx, ax ; altfel se actualizeaza noul maxim temporar
next: loop caut_maxim
gata:
mov ax, bx ; maximul temporar se pune in AX
cmp ax, ax ; ZF = 1
; refacere registri
pop si
pop bx
afla_max endp
prog ends

stiva segment stack 'stack'
dw 100 dup(?)
stiva ends

end start

Niciun comentariu: