România
Roportal.ro

Algoritmi diversi-palindrom-assembler

Început de danyel7002, Joi 8 nov 2007 · 7 răspunsuri · 10.332 vizualizări

danyel700228 mesaje#1

M-am tot gandit la metode pt a verifica in assembler daca un sir de caractere este palindrom(citit de la stanga sau de la dreapta e acelasi...ex radar, 1907091...).

Am gasit 3 care cat de cat fac acelasi lucru:

1. se verifica prima litera cu ultima, a 2 a cu penultima samd

2. se inverseaza sirul de caractere si apoi se verifica prima litera a sirului inizial cu prima litera a sirului inversat, a doua cu a doua samd(ca in c++ strrev)

3. se taie sirul inizial in 2 bucati prima ramane asa iar a 2a se inverseaza, se verifica apoi ca la metoda 2 de mai sus

As dori sa aflu alte algoritme pt a verifica daca un sir este palindrom...daca se poate adaptate si la assembler:d

ms

Editat Joi 8 nov 2007 22:34

soarce391 mesaje#2

eu as alege prima metoda pentru simplu motiv ca nu necesita spatiu suplimentar de stocare pe cand celelalte doua da.

pentru mai multi algoritmi in cod masina iti recomand cartile lui D. Knuth din seria "The art of computer programming" (3 volume)

danyel700228 mesaje#3

un posibil algoritm ar fi recursivitatea...numai ca in assembler nush cum se face...

Argv2.495 mesaje#4
danyel7002 a scris:
un posibil algoritm ar fi recursivitatea...numai ca in assembler nush cum se face...

Recursivitatea este algoritm?

In cazul tau e mult mai rapid si probabil mai simplu sa-l faci iterativ. Daca tot lucrezi in asamblare ar trebui sa stii ca recursivitatea penalizeza viteza de executie pt ca la fiecare apel recursiv se salveaza parametrii in stack.

Primul algoritm pe care l-ai listat pare cel mai eficace si mai simplu

http://oopweb.com/Assembly/Documents/asm/Volume/asm.htm

Editat Mar 27 nov 2007 18:36

soarce391 mesaje#5

da, recursivitatea nu este un algoritm ci o metoda.

limbajul de asamblare nu are definit apelul recursiv si de aceea va trebui sa te ocupi de toata bucataria interna a apelului recursiv: salvari de date (registrii) in stiva.

se gasesc pe internet exemple de implementare a apelului recusiv in limbaj masina, insa cred ca toata chestia ramane la nivel didactic.

rox94ana3 mesaje#6

buna. am o intrebare legata de aceasta problema. am incercat sa o fac comparand primul element din sir cu ultimul, al doilea cu penultimul si tot asa. Eu m-am gandit sa numar elementele din sir (asta am reusit), dar nu stiu cum pot folosi al n-lea element din sir.

am scris asa:

MOV SI, OFFSET SIR
MOV AL, [sI]
CMP AL, SIR[NR] (SIR[NR] m-am gandit sa fie al nr-lea element, dar nu functioneaza).
.............
Imi puteti da o idee de rezolvare?
rox94ana3 mesaje#7

Acesta este codul, nu imi apar erori, dar dupa ce introduc sirul de caractere nu-mi afiseaza nimic. Ce este gresit?

.MODEL SMALL

.STACK 100H
.DATA
NR DB '00','$'
SIR DB 50 DUP('$')
INV DB 50 DUP('$')
mesaj db 13,10,'Introduceti sirul: ','$'
mesaj_nu db 13,10,'Numarul nu este palindrom!','$'
mesaj_da db 13,10,'Numarul este palindrom!','$'
.CODE
MOV AX,@DATA
MOV DS,AX
MOV AH,9H
MOV DX,OFFSET mesaj
INT 21H
MOV BX,0
MOV CX,50
MOV AH,3FH
MOV DX,OFFSET SIR
INT 21H
MOV SI,OFFSET SIR
E1:MOV AL,[sI]
CMP AL,0DH
JNE E2
E2: INC SI
JMP E1
DEC SI
MOV DI,SI
MOV SI,OFFSET SIR
E3:MOV AL,[sI]
CMP AL,0DH
JNE E4
E4:MOV BL,[sI]
MOV AL,[DI]
CMP AL,BL
JNE E5
INC SI
DEC DI
JMP E3
E5: MOV AH,09H
MOV DX, OFFSET mesaj_nu
JMP sfarsit
MOV AH,09H
MOV DX,OFFSET mesaj_da
INT 21H
sfarsit:MOV AH,4CH
INT 21H
END
rox94ana3 mesaje#8

Buna. Cum pot salva elementul din mijlocul unui sir?

Am incercat asa:

mov bx,2

div bx

mov si,ax ;catu este salvat in ax

mov cl,[si]

mov char,cl

dar imi afiseaza dimensiunea sirului.

Ma puteti ajuta?

← Înapoi la Programare