PDA

Visualizza la versione completa : [ASSEMBLY MIPS]noob inside-->da minuscolo a maiuscolo in una stringa


DarkMessiaH
11-12-2008, 23:54
Salve a tutti...sto cercando di imparare questo assembly...vorrei chiedere qlc dritta...per esempio io ho un codice che deve fare questo:
1)prende una stringa da tastiera
2)prende un char da tastiera
3)scorro la stringa...se il char è presente nella stringa sostituisco con la lettera maiuscola(ad esempio(stringa-->ciao sono mario char-->o stringa risultante-->ciaO sOnO mariO)

So caricare la stringa ed il char...ma mi fermo qua perchè non so diciamo così..."ragionare i loop" nell'ottica assembly:( ne far scorrere l'indice di un array...qualcuno può darmi una dritta per favore??^^

grazie mille!

DM

menphisx
12-12-2008, 00:19
section .data
str db "Ciao non mi chiamo mario", 0
carattere db 'O'
index db ?

xor index, index
xor ax, ax

for:
mov ah, byte [str + index] ;; ah = *(str + index)
inc index ;; index++
cmp ah, 0 ;; ah == 0 ?
jz exitfor ;; if (ah == 0) goto exitfor
cmp ah, carattere ;; ah == carattere ?
jz toupper ;; if(ah == carattere) goto tolower
jump for

toupper:
and ax, 0x5F ;; ax &= 0x5F
mov byte [str + index - 1], ah ;;*(str + index - 1) = ah
jump for

exitfor:
;;...Codice...



EDIT: mi sono accorto che non è MIPS :stordita: , la logica è comunque la stessa :stordita:

DarkMessiaH
12-12-2008, 13:06
grazie per la risposta!^^

mi sa che non lo le skills per capire al 100% quello che hai scritto...allora vediamo un pochetto:

section .data
str db "Ciao non mi chiamo mario", 0
carattere db 'O'
index db ?

per questa parte io farei così:


.data
str: .asciiz "Ciao non mi chiamo Mario"
carattere:.asciiz 'O' # 'O' ma non me l'accetta lo SPIM...come faccio a fargli "digerire"
# il valore numerico del carattere?"
index : .asciiz ? #dal manuale x86 dice che ? è non inizializzato...come faccio a
#dichiarare una variabile e non inizializzarla in MIPS?




xor index, index
xor ax, ax


a che pro fare questi due xor?? e se index non è inizializzato che cosa ne risulta?
stessa cosa dicasi per il registro ax...

passiamo aquesta porzione di codice:


for:
mov ah, byte [str + index] ;; ah = *(str + index)
inc index ;; index++
cmp ah, 0 ;; ah == 0 ?
jz exitfor ;; if (ah == 0) goto exitfor
cmp ah, carattere ;; ah == carattere ?
jz toupper ;; if(ah == carattere) goto tolower
jump for

toupper:
and ax, 0x5F ;; ax &= 0x5F
mov byte [str + index - 1], ah ;;*(str + index - 1) = ah
jump for

exitfor:
;;...Codice...


/*inserisce nel registro ah il puntatore(?) al valore (str + index) dove index,che non è inizializzato. perchè?
incrementa index di 1
se il valore in ah è = 0 salta all'istruzione exitfor
se il valore in ah è = al carattere salta all'istruzione tolower
ripeti for*/

/*in tolower invece abbiamo:
and logico tra il valore contenuto in ah e 0x5f ovvero 95...perchè?
inserimento in ah di (str+index-1) anche questo...perchè?
ritorno al for*/

io avrei fatto così:

che poi sarebbe un approccio dinamico rispetto al codice gentilmente postato da menphisx,che ringrazio ancora per la disponibilità...

inserisco la stringa
inserisco il carattere
scorro la stringa
se l'i-esima lettera della stringa è == carattere
sostituisco l'i-esima lettera con il valore dell'i-esima -32 se la stringa è in minuscolo...se è in maiuscolo viceversa...ma non lo so tradurre in assembly... :dhò: :(

in attesa di una risposta...^^
DM.

menphisx
12-12-2008, 14:40
Originariamente inviato da DarkMessiaH
a che pro fare questi due xor?? e se index non è inizializzato che cosa ne risulta?
stessa cosa dicasi per il registro ax...

Non puoi sapere cosa ci sia dentro, quindi è solo questione di sicurezza ...


Originariamente inviato da DarkMessiaH
passiamo aquesta porzione di codice:

for:
mov ah, byte [str + index] ;; ah = *(str + index)
inc index ;; index++
cmp ah, 0 ;; ah == 0 ?
jz exitfor ;; if (ah == 0) goto exitfor
cmp ah, carattere ;; ah == carattere ?
jz toupper ;; if(ah == carattere) goto tolower
jump for

toupper:
and ax, 0x5F ;; ax &= 0x5F
mov byte [str + index - 1], ah ;;*(str + index - 1) = ah
jump for

exitfor:
;;...Codice...
/*inserisce nel registro ah il puntatore(?) al valore (str + index) dove index,che non è inizializzato. perchè?
incrementa index di 1
se il valore in ah è = 0 salta all'istruzione exitfor
se il valore in ah è = al carattere salta all'istruzione tolower
ripeti for*/

index è inizializzato a zero (xor index,index).
Non inserisco il puntatore, ma il valore contenuto in (str + index).


Originariamente inviato da DarkMessiaH
/*in toupper invece abbiamo:
and logico tra il valore contenuto in ah e 0x5f ovvero 95...perchè?
inserimento in ah di (str+index-1) anche questo...perchè?
ritorno al for*/


Semplicemente, prova con carta e penna, se fai l'and di un carattere con 0x5F, ottieni quel carattere maiuscolo ... una volta ottenuto maiuscolo lo reinserisco nella stringa; index è pero incrementato di uno, quindi la posizione corretta è la precedente.

L'algoritmo è semplice:
-Scorri la stringa fino a quando non trovi uno zero.
-Se il str[index] è uguale a carattere, lo metti in and con 0x5f

Tutto qua.

Loading