Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9

    [assembly] array di strings

    ciao ragazzi, vi spiego il problema...
    devo fare un programma (assembly 80x86)che legga da tastiera dei nomi (lunghezza max 15 caratteri)
    e li salvi in un array, per poi riutilizzarli per scorrere la lista, stamparli e fare altre cose..
    il problema è dopo aver acquisito il nome, come copiarlo nell'array. vi riporto parte del codice,
    sembra che qualcosa scriva nell'array, ma quando vado a stamparlo mi visualizza dei caratteri completamente diversi...
    nell'esempio prendo solo 2 nomi... mi basterebbe che funzionasse questo

    codice:
    dseg
    ...
    inserisci_nome	  DB    CR,LF,LF,'INSERIRE UN NOME:$'
    ACCAPO 		  DB 	13,10,'$'
    nuovo_nome  DB	 18,0,16 DUP (00h)
    nuovo_nome2  DB	 18,0,16 DUP (00h)
    nameArray     DB   200 dup (?)                                     ;array statico, max 200 nomi 
    ...
    dseg
    
    
    (nuovo_utente viene chiamata dal main)
    
    NUOVO_UTENTE PROC NEAR
    		
    		MOV	DX,OFFSET inserisci_nome	              ;stampo istruzioni
    		CALL	STAMPA_STRINGA	                      ;la routine stampa_stringa mostra   
                                                                                  ;a video carattere per carattere la 
                                                                                  ;stringa
    		
    		LEA DX, nuovo_nome 				      ;acquisizione della stringa da 
                                                                                  ;tastiera
    		MOV AH, 0Ah
    		INT 21h
    		
    		MOV	DX,OFFSET ACCAPO                           ;stampa un accapo
    		CALL STAMPA_STRINGA
    		
    		
    		MOV	DX,OFFSET inserisci_nome                   ;richiesta secondo nome
    		CALL STAMPA_STRINGA
    		
    		LEA DX, nuovo_nome2				      ;acquisizione il secondo nome
    		MOV AH, 0Ah
    		INT 21h
    		
    		MOV	DX,OFFSET ACCAPO
    		CALL STAMPA_STRINGA
    		
    
    		
    		mov di, offset NameArray
    		cld
    		
    		mov ax, ds
    		mov es, ax
    		mov bx, offset nuovo_nome
    		mov ch, 00h
    		MOV CL, [BX+1]	                                        ;all'offset 1 dovrebbe essere contenuta la lunghezza della stringa, la metto nel contatore
    		mov si, [BX+2]	                                        ;all'offset 2 comincia la stringa
    		rep movsw                                                  ;copia primo nome
    		
    		mov bx, offset nuovo_nome2                     ;il reg DI dovrebbe essere aumentato in automatico dopo ogni operazione, quindi questa dovrebbe scrivere nell'indice successivo
    		mov ch, 00h
    		MOV CL, [BX+1]	
    		mov si, [BX+2]	
    		rep movsw                                                  ;copia secondo nome
    		
    		
    	
    			RET
    NUOVO_UTENTE ENDP

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [assembly] array di strings

    Le correzioni in rosso ...

    codice:
    		mov di, offset NameArray
    		cld
    		
    		mov ax, ds
    		mov es, ax
    		mov si, offset nuovo_nome
    		mov ch, 00h
    		mov cl, [si+1]
    		add si,2
    		rep movsb
    Devi correggere anche il codice dello spostamento del secondo nome ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    codice:
    rep movsb
    decrementa cx

    facendo
    codice:
    mov bx, offset nuovo_nome 	
    mov ch, 00h 	
    MOV CL, [BX+1]
    gli davo appunto il numero di caratteri da copiare...

    seguendo il tuo consiglio ho riscritto il codice così
    codice:
    mov di, offset NameArray
    cld
    		
    mov ax, ds
    mov es, ax
    mov si, offset nuovo_nome
    
    add si,2
    movsb
    ora mi copia solo la prima lettera del nome inserito,
    se invece uso movsw , copia le prime 2 lettere.
    almeno ora qualcosa di leggibile nell'array c'è

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    così invece mi copia tutto il nome:

    codice:
    	mov di, offset NameArray
    		cld
    		
    		mov ax, ds
    		mov es, ax
    		mov bx, offset NUOVO_COGNOME
    		mov si, offset NUOVO_COGNOME
    		mov ch, 00h
    		MOV CL, [BX+1]	
    		add si, 2        
    		rep movsb

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Avevo dimenticato una correzione ... l'ho inserita nel primo suggerimento ...

    Non e' necessario utilizzare sia bx che si ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    adesso però salva carattere per carattere dentro l'array.
    per stampare un solo elemento come posso fare??
    io ora faccio in modo di salvare, prima del nome, il numero di caratteri
    quando lo leggo, metto questo numero di caratteri nel contatore e poi stampo i caratteri che seguono. può essere corretto?

    codice:
    		mov di, offset NameArray
    		cld
    		mov ax, ds
    		mov es, ax
    		mov bx, offset NUOVO_COGNOME
    		mov si, offset NUOVO_COGNOME
    		mov ch, 00h
    		MOV CL, [BX+1]	 			;all'offset 1 dovrebbe essere contenuta la lunghezza della stringa
    		add cl,1					; incremento di 1 per copiare anche il numero di caratteri
    		add si, 1      				;all'offset 2 comincia la stringa ma copio anche l'offest 1 per sapere di qanti caratteri sarà la stringa dopo
    		rep movsb
    		
    		mov ax, ds
    		mov es, ax
    		mov bx, offset NUOVO_NUMERO
    		mov si, offset NUOVO_NUMERO
    		mov ch, 00h
    		MOV CL, [BX+1]	
    		add cl,1
    		add si, 1        
    		rep movsb
    		
    		
    		    LEA BX, NameArray				;memorizzazione dell'indirizzo della struttura in BX
    			MOV CH, 00h
    			
    			MOV CL, [BX] 	    ;lettura del numero di caratteri da visualizzare
    			MOV DI, 0000h						;inizializzazione dell'indice
    CICLO5:
    			MOV DL, [BX+DI+1]				;visualizzazione di un carattere,salto il numero
    			MOV AH, 02h
    			INT 21h
    			INC DI							;incremento dell'indice
    			LOOP CICLO5
    			
    			MOV	DX,OFFSET ACCAPO
    		       CALL STAMPA_STRINGA
    			
    			
    			CMP [di], '16'	;se c'è un numero minore di 16, ovvero c'è ancora qualcosa dopo
                            INC DI
    			JB  ALTRO
    			RET
    			
    	    ALTRO:	mov cl, [di]	                ;prendi il nuovo numero di caratteri
    			LOOP CICLO5		;e stampali
    			RET

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da treggs
    adesso però salva carattere per carattere dentro l'array.
    per stampare un solo elemento come posso fare??
    Che vuoi dire ? Fammi un esempio ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    chiedevo se si puo prendere l'elelemento j-esimo... un po come si fa in linguaggio piu alti con array[j]. per elemento non intendo un singolo carattere, ma tutta la parola inserita

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Puoi calcolare l'indice se le stringhe hanno lunghezza fissa.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    purtroppo non hanno lunghezza fissa, sono dei nomi che vengono inseriti dall'utente.
    così quello che faccio è salvare nell'array, oltre alla parola anche il suo numero di caratteri e usare quelli per spostarmi...

    | n° | parola | n° | parola | n° | parola

    è la soluzione fin'ora piu semplice che ho trovato, ma ne cercavo altre...

    sempre riferita al codice di prima
    c'è un modo per allocare dinamicamente la memoria dell'array (NameArray) ?

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.