Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [ASSEMBLY MIPS]noob inside-->da minuscolo a maiuscolo in una stringa

    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

  2. #2
    codice:
    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 , la logica è comunque la stessa

  3. #3
    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...

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

  4. #4
    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:
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.