|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 12
|
Assembler: stringhe
Ciao a tutti!
Volevo chiedere se c'è qualcuno che può darmi una mano con Assembler.... Devo fare un programma che riceva in input una stringa (caratteri alfanumerici) e li controlli uno per uno (controllare se sono caratteri alfanumerici, se le lettere sono in maiuscolo,che il totale sia 16,....) mi potetre dare qualche indicazione? |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
- Assembly 80x86? - In DOS o Windows? - Con un assembler tipo MASM/NASM, ecc... o assembly "in-line" in "C"? - Per "riceva in input" vuoi dire da tastiera?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 12
|
si scusami....avrei dovuto già specificare....
Assembly 80x86 in DOS Assembler tipo TASM si l'input deve essere da tastiera.... |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Cos'è che non ti è chiaro?
|
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 12
|
non mi è chiaro come gestire le stringhe e fare operazioni con esse
cioè io devo prendere da input di tastiera una serie di lettere e numeri e controllare se il numero totale dei caratteri è 16 verificare che le lettere siano tutte maiuscole o tutte consonanti operazioni di questo genere |
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Per iniziare la routine che interpreta la pressione di un tasto da tastiera ritornando "scan code" e "carattere":
Codice:
; Assemby x86/16 ; ; Input ; None ; Output ; AH = Scancode ; AL = Carattere Get_Key proc near pusha mov ah,10h int 16h push bp mov bp,sp mov word ptr [bp+10h],ax pop bp popa ret Get_Key endp Codice:
cmp al,48d jb carattere_non_valido cmp al,57d jb carattere_numerico cmp al,65d jb carattere_non_valido cmp al,90b jb carattere_alfabetico_maiuscolo |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Quote:
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
PUSHA / POPA servono per fare il push / pop sullo stack di tutti i registri "general purpose", cioè AX, CX, DX, BX, SP (originale), BP, SI e DI (nell'ordine indicato).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 12
|
grazie delle risposte mi sono molto utili!!!
Ma come faccio a contare i tasti premuti e verificare che siano 16? |
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Quote:
Codice:
MAX_KEY_LEN EQU 16d data segment byte 'DATA' key_buffer: DB MAX_KEY_LEN DUP (?) data ends .286 .ALPHA code segment para use16 'CODE' assume cs:code Init proc near cld push data pop ds push ds pop es mov di,OFFSET key_buffer loop_get_key: call Get_Key cmp al,48d jb no_valid_char cmp al,57d jbe valid_input_char cmp al,65d jb no_valid_char cmp al,90d jbe valid_input_char jmp no_valid_char valid_input_char: stosb no_valid_char: cmp di,OFFSET key_buffer+MAX_KEY_LEN jne loop_get_key int 20h Init endp Get_Key proc near pusha mov ah,10h int 16h mov bp,sp mov word ptr [bp+0Eh],ax popa ret Get_Key endp code ends end init Ultima modifica di repne scasb : 05-07-2006 alle 12:10. |
|
|
|
|
|
|
#12 | |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Quote:
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#14 | |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 12
|
però il mio problema è un altro....nel mio codice ho preso da input di tastiera un numero qualsiasi di caratteri....e la lunghezza l'ho salvata in un buffer....
ma io il controllo di questa lunghezza devo farla dopo l'input e stampare a video un messaggio sulla correttezza o meno dell'input.... il mio problema è cm leggere questo buffer..... mi dispiace di non essere stata chiara.... il mio codice è questo: Quote:
|
|
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Quote:
0FFEEh = DI 0FFF0h = SI 0FFF2h = BP 0FFF4h = SP 0FFF6h = BX 0FFF8h = DX 0FFFAh = CX 0FFFCh = AX Ultima modifica di repne scasb : 05-07-2006 alle 19:11. |
|
|
|
|
|
|
#16 | |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Quote:
1) Nella routine "LETTURA_DATI" non ti curi di salvaguardare il registro BX utilizzato nel loop "CICLO", la chiamata all'INT 21h puo' sovrascrivere il registro BX. 2) L'istruzione "MOV [SEQUENZA+BX],AL" genera una sovrascrittura di dati, in quanto per "SEQUENZA" viene allocato un unico byte, mentre nella successiva istruzioni incrementi BX. 3) BX viene contemplato per 65535 caratteri con possibilita' di sovrascrivere involontariamente varie aree ("JNZ CICLO") come DTA, stack, data segment... 4) Se si inseriscono 65.536 caratteri il valore della variabile "DIMENSIONE" assumenra' il valore 0 (zero). 5) La varibile "CODICE_TASTO" e' sovrabbondante (non necessaria). Ultima modifica di repne scasb : 05-07-2006 alle 19:13. |
|
|
|
|
|
|
#17 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 12
|
quindi dovrei...
1. salvare BX (come?) 2. mettere una dimensione max per sequenza in modo da non cadere in overflow 3.cancello codice tasto e per quanto riguarda il contare i 16 caratteri? |
|
|
|
|
|
#18 | |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Quote:
Codice:
DOS EQU 21h R_KEY_CHR EQU 01h INVIO EQU 13 ;CODICE_TASTO DB ? ; Non serve SEQUENZA DB 16d DUP (?) ; Allocazione di 16 bytes DIMENSIONE DW ? LETTURA PROC NEAR MOV BX,0 CICLO: CALL LETTURA_DATI CMP AL,INVIO JZ FINELETTURA ; Qui va il codice per ; testare numeri e maiuscole MOV [SEQUENZA+BX],AL INC BX CMP BX,16d ; Controlla che la stringa JB CICLO ; non sia maggiore di 16 byte FINELETTURA: MOV DIMENSIONE,BX RET LETTURA ENDP LETTURA_DATI PROC NEAR PUSH BX ; Salva BX MOV AH,R_KEY_CHR INT DOS ;MOV [CODICE_TASTO],AL ; Non serve POP BX ; Ripristina BX RET LETTURA_DATI ENDP |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
repne ma dove hai studiato?
![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#20 |
|
Junior Member
Iscritto dal: Jul 2006
Messaggi: 12
|
razie mlle repne scasb...
una domanda: la variabile sequenza che ho creato si può considerare un vettore e vi si può accedere ai suoi elementi quando + mi è comodo? grazie |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:45.




















