Chiarimento su gestione di array e indici

di Anonimizzato13909 il
9 risposte
Salve a tutti ragazzi fra un paio di giorni dovrò affrontare un esame universitario che richiede una prova di laboratorio in cui si programma in assembly
avrei bisogno di chiarirmi un piccolo dubbio: quando devo gestire un array attraverso un registro indice come SI mi è stato detto che per partire dal primo elemento effettivo quando lavoro su una stringa devo partire da 2...vorrei tanto capire il perchè di questa cosa e se vale solo per le stringhe o anche per altri tipi di array...grazie mille in anticipo a chi mi risponderà

9 Risposte

  • Veramente non è così in assoluto ... dipende dal contesto in cui lavori.

    Con quali strumenti operi in assembly?

    Mostra qualche esempio di codice a cui fai riferimento.
  • Uso emu8086
    Comunque ti faccio un esempio perché ora non ho il pc sotto mano

    Acquisisco una stringa da tastiera che metto in un array che può contenere massimo 10 caratteri
    Supponiamo che la stringa sia "ciao"
    Voglio sostituire a 'c' la lettera 'a'
    Devo inizializzale il registro indice a 2 perché la c è in quella posizione nel array....volevo sapere invece nella posizione 0 e nella 1 cosa c'è a questo punto perché a c non corrisponde la posizione 0 dell array


    Inviato dal mio iPhone utilizzando Tapatalk
  • La risposta dipende unicamente da quale funzione usi per acquisire la stringa da tastiera. Ecco perché ti chiedevo un esempio concreto.
  • Ah allora ecco un esempio
    Lea dx,buf
    Mov ah,0Ah
    Int 21h

    Ret
    Max equ 10
    Buf db max,?,max dup('$')


    Inviato dal mio iPhone utilizzando Tapatalk
  • In questo *specifico* caso tu utilizzi una funzionalità del DOS e precisamente la funzione 0ah dell'INT 21h il cui funzionamento è descritto, ad esempio, in



    Come vedrai dalla descrizione, questa funzione si aspetta in input (in DS:DX) il puntatore ad un'area di memoria (chiamata DOS input buffer) fatta in questo modo

    Offset Size Description
    00 1 maximum characters buffer can hold
    01 1 number of chars from last input which may be recalled OR number of characters actually read, excluding CR
    02 n actual characters read, including the final carriage return

    in cui, come puoi facilmente vedere, il primo byte rappresenta il numero massimo di caratteri di cui fare l'input, il secondo byte rappresenta il numero di caratteri presenti dopo l'input e solo dal terzo byte (offset 2) l'effettiva sequenza di caratteri in input.

    E' per questo *specifico* motivo che i dati li prelevi a partire dall'offset 2 (rispetto all'inizio del buffer, Buf nel tuo caso).

    Se avessi utilizzato un'altra funzione del DOS (o una tua funzione) questa cosa non sarebbe andata così (dato che non è una regola universale).

    Oppure, se avessi scritto così

    Buf db max,?
    StrBuf max dup('$')

    basandoti su StrBuf per ottenere i caratteri in input (e utilizzando sempre Buf per la chiamata) avresti dovuto utilizzare 0 come indice.
  • Grazie mille per la risposta e per il chiarimento, di sicuro grazie a questa spiegazione mi eviterò qualche errore durante l'esame [SMILING FACE WITH OPEN MOUTH AND SMILING EYES]


    Inviato dal mio iPhone utilizzando Tapatalk
  • Di nulla ... se hai bisogno di altri chiarimenti, fai un fischio ...
  • Ciao un altra domanda
    ho un array parola,in parola[1] dovrebbe esserci la dimensione totale della parola giusto?
    mi serve inserire questa dimensione totale della parola in un registro indice però il compilatore mi dice che non posso inserirla in un registro a 16bit...come posso ovviare a questo problem visto che i registri indici son entrambi a 16bit??
  • andreflex ha scritto:


    ciao un altra domanda
    ho un array parola,in parola[1] dovrebbe esserci la dimensione totale della parola giusto?
    No ... non è una regola ... Di nuovo, in quale contesto operi? Parli di buffer utilizzato per l'input come prima? O di altro array ?
    mi serve inserire questa dimensione totale della parola in un registro indice però il compilatore mi dice che non posso inserirla in un registro a 16bit...come posso ovviare a questo problem visto che i registri indici son entrambi a 16bit??
    
        mov al,num
        xor ah,ah
        mov si,ax
    
Devi accedere o registrarti per scrivere nel forum
9 risposte