PDA

View Full Version : Aiuto programma assembler


Abdujaparov
28-06-2007, 17:41
Salve a tutti sto provando a scrivere un programma assembler x86 che prendendo una stringa del tipo "6 444 1 7 444 2 222 33" (tasti battuti sulla tastiera del telefonino) la trasforma in testo ("mi piaci" in questo esempio), tutto in assembler solo che non mi funziona niente e comincio ad avere errori sin dall'inizio del programma.


.model small
.stack
.data
tastiera db ' ', '&', '&', '&'
db 'a', 'b', 'c', '&'
db 'd', 'e', 'f', '&'
db 'g', 'h', 'i', '&'
db 'j', 'k', 'l', '&'
db 'm', 'n', 'o', '&'
db 'p', 'q', 'r', 's'
db 't', 'u', 'v', 'x'
db 'w', 'x', 'y', 'z'
risultato db 15 dup(?)
ingresso db "6 444 1 7 444 2 222 33"
.code
.startup
xor si,si
lea ax, tastiera; tastiera
lea bx, ingresso; ingresso
lea dx, risultato; stringa finale
mov cx, 8 ; numero caratteri
dec cx ;decremento il numero di rilevazioni
push ax
push bx
push dx
push cx
call messaggio
add sp,8 ; perchè sto inserendo 4 parametri
jmp fine

messaggio proc
push bp
mov bp, sp
sub sp, 2
xor dx, dx
mov cx, [bp+4] ; numero caratteri
mov bx, [bp+6] ; risultato
mov si, [bp+8] ; ingresso
mov di, [bp+10]; tastiera
xor ax, ax; azzero ax
ciclo: mov dl, [si]; sposto il carattere in dl
cmp dl, ' ' ;confronto dl con lo spazio
jne continua ; se non è spazio vado a continua
aggiungi: sub al, 30h ;altrimenti continuo trasformando il carattere in numero decimale
dec al; decremento per trovare la riga
add ah, al
mov [bp-2], word ptr 0
add [bp-2], ah
add [bp-2], di
xor ax, ax
mov al, [bp-2];seleziono il carattere dalla riga
mov [bx], al
add [bx], word ptr 1; avanzo nella stringa risultato
xor ax, ax; azzero ax
dec cx ; decremento cx
jmp ciclo
continua: cmp cx,1
jne normale
cmp al, dl
jne aggiungi
normale: mov al, dl ;in continua metto dl in al
inc ah; incremento ah
add [si], word ptr 1
loop ciclo
mov [bx], byte ptr 0
add sp, 2
pop bp
ret
messaggio endp

fine: lea dx, risultato
mov ah, 09h
int 21h
.exit
end


In pratica ho definito una matrice in cui ogni riga corrisponde ad un tasto del telefono (1, 2, 3, 4, 5 ,6, 7, 8, 9) e da tante colonne quante sono le lettere associate al tasto. Se un tasto ha associati meno caratteri metto una & nella matrice. Cmq questo non è un problema.
Io conosco la stringa in ingresso, conosco la dimensione della stringa in uscita 8 e non la dimensione della stringa di ingresso.
Io ho provato a scrivere la procedura come si può vedere dal codice incollato (devo necessariamente utilizzare una procedura) ma ho dei problemi non indifferenti, prima di tutto quando metto il valore 8 nel registro CX, proprio all'inizio del programma, non so perchè mi spunta il valore E008 anche avendo prima azzerato CX, com'è possibile?
Quando prendo il valore dalla procedura mi spuntano valori che non c'entrano niente con il valore che dovrebber ricevere la procedura (cioè 7).
Poi sempre nella procedura, sembra che mi venga preso correttamente l'offset della stringa di ingresso solo che c'è un problema con la:
cmp dl, ' '
jne salta
in pratica questo confronto risulta sempre diverso e non capisco il perchè.
Qualcuno può aiutarmi a capire i vari errori perchè non riesco a capirci più nulla.
Grazie a tutti, ciao ciao.