Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 INFORMATICA - Primo Anno
 Architettura degli elaboratori
 Aiuto programmazione assembler
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

abdujaparov
Nuovo Utente



Inserito il - 28/06/2007 : 18:50:31  Mostra Profilo  Visita l'Homepage di abdujaparov Invia a abdujaparov un Messaggio Privato  Rispondi Quotando
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.

ekkekkazz
Utente innocuo



Inserito il - 01/07/2007 : 16:49:46  Mostra Profilo  Visita l'Homepage di ekkekkazz Invia a ekkekkazz un Messaggio Privato  Rispondi Quotando
sicuro che pulisci il registro cx? io non vedo nessun xor ecx, ecx prima e magari il tuo E008 rappresenta il valore del registro (ecx appunto) che è a 32-bit, mentre tu vai a scrivere solo un carattere di 8-bit (dove hai letto E008?).
Per quanto riguarda la call, di solito questa è una istruzione che inserisce nello stack l'instruction pointer ed anche il base pointer credo. Per cui, quando nella procedura vai a fare il pop dallo stack, vai a prelevare dei valori inaspettati. Forse si risolverebbe togliendo le prime due righe della procedura (che fanno quello che fa gia la call).
In ogni caso che assemblatore usi? ti consiglio di usare un debugger (tipo ollydbg che ti fa vedere tutto lo stack).
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,19 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000