PDA

View Full Version : [Assembler] sostituire le occorrenze in una stringa


annam90
11-02-2010, 19:46
avevo questo esercizio da svolgere: stampare un vettore di stringhe, definito nei dati. sempre nei dati definire la variabile "ricercato", come una delle lettere che ci sono nella stringa. L'esercizio richiedeva poi di inserire un carattere da tastiera, e sostituire questo carattere in tutte le occorrenze di "ricercato"


ho provato a farlo varie volte, ma non riesco a scambiarlo, avrò sbagliato qualcosa nel ciclo sostituisci ma non riesco a capire cosa..questo è il codice:


codice:data segment
vetst db 'p','o','s','t','o'
ricercato db 'o'
newc db ?
msg1 db "Inserisci carattere: $"
; add your data here!
pkey db "press any key...$"
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax


mov ax, 0
mov cx, 5
mov si, 0
ciclo_stampa: mov dl, vetst[si]
mov ah, 2
int 21h
inc si
loop ciclo_stampa

mov dl,13
mov ah, 2
int 21h
mov dl,10
mov ah, 2
int 21h

lea dx, msg1
mov ah, 9
int 21h
mov ah, 1
int 21h

mov newc, al
mov dl, ricercato
mov bl, newc
mov cx, 5
mov ax, 0
mov si, 0
mov dx, 0
mov bx, 0

ciclo_sost: cmp dl, vetst[si]
je sost2
inc si
loop ciclo_sost
sost2: mov vetst[si], bl


mov ax, 0
mov cx, 5
mov si, 0
mov dx, 0
ciclo_stampa2: mov dl, vetst[si]
mov ah, 2
int 21h
inc si
loop ciclo_stampa2


; add your code here

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.

annam90
11-02-2010, 20:05
se qualcuno sa come aiutarmi, è urgente =(

cionci
12-02-2010, 13:12
Così fai una sola sostituzione.

ciclo_sost: cmp dl, vetst[si]
je sost2
inc si
loop ciclo_sost
sost2: mov vetst[si], bl

La sostituzione deve avvenire all'interno del loop.

annam90
12-02-2010, 14:57
ho provato..ho messo sost2 sotto a je sost2 e non mi fa il ciclo stampa2
poi l'ho messo sotto ad inc si e mi stampa "p sto"..

cionci
12-02-2010, 15:06
Certo, hai azzerato bl:

mov bl, newc
mov cx, 5
mov ax, 0
mov si, 0
mov dx, 0
mov bx, 0

Inoltre non basta spostare quella linea devi anche ragionare su quando devi fare la sostituzione e quando non devi.

annam90
12-02-2010, 15:59
io ho pensato che dovesse far ela sostituzione una volta verificato che i due elementi sono uguali..però poi dovrebbe esserci qualcosa che riporta al ciclo

cionci
12-02-2010, 16:01
io ho pensato che dovesse far ela sostituzione una volta verificato che i due elementi sono uguali..però poi dovrebbe esserci qualcosa che riporta al ciclo
Oppure "non fare la sostituzione quando i due elementi non sono uguali"

annam90
12-02-2010, 16:03
ho provato a sostituirew con questo..

ciclo_sost: cmp dl, vetst[si]
jne non_sost2
mov vetst[si], bl
non_sost2:
inc si
loop ciclo_sost


ma non và comunque..

cionci
12-02-2010, 16:07
Mi fai vedere com'è ora il codice completo ?

annam90
12-02-2010, 16:24
Ho risolto! :) Avevo inizializzato anche bx a 0, e quindi non metteva newc! grazie dell'aiuto ^^



; multi-segment executable file template.

data segment
vetst db 'p','o','s','t','o'
ricercato db 'o'
newc db ?
msg1 db "Inserisci carattere: $"
; add your data here!
pkey db "press any key...$"
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax


mov ax, 0
mov cx, 5
mov si, 0
ciclo_stampa: mov dl, vetst[si]
mov ah, 2
int 21h
inc si
loop ciclo_stampa

mov dl,13
mov ah, 2
int 21h
mov dl,10
mov ah, 2
int 21h

lea dx, msg1
mov ah, 9
int 21h
mov ah, 1
int 21h

mov newc, al
mov dl, ricercato
mov bl, newc


mov cx, 5
mov si, 0
mov ax, 0

ciclo_sost: cmp dl, vetst[si]
jne non_sost2
mov vetst[si], bl
non_sost2:inc si
loop ciclo_sost


mov dl,13
mov ah, 2
int 21h
mov dl,10
mov ah, 2
int 21h

mov ax, 0
mov cx, 5
mov si, 0
mov dx, 0
ciclo_stampa2: mov dl, vetst[si]
mov ah, 2
int 21h
inc si
loop ciclo_stampa2






; add your code here

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.