Assembler – conversione da Maiuscolo a minuscolo.
Altro Programma in Assembler, il linguaggio di basso livello per eccellenza, che legge un carattere Maiuscolo e lo converte in minuscolo. (La strategia usata è basilare, basta avere in mano una tabella ascii per capire come procedere nella stesura del codice).
; Nella codifica ASCII le lettere minuscole si trovano 32 posizioni dopo le equivalenti lettere maiuscole, ; per esempio la posizione decimale di A è 65, di a è 97, e così via. Scrivere un programma MASM ASSEMBLER ; che legga un carattere MAIUSCOLO e lo converta in minuscolo. .model small .stack 100h .data istr db 'Carattere M: ', '$' ; NB. ricordare sempre il carattere di escape finale $, che indica la fine della stringa (o di un array). ostr db 'Carattere m: ', '$' .code start: mov ax, @data ; mettiamo in ax tutto il segmento dati. mov ds, ax ; spostiamo nel data segment tutto ax (non possiamo farlo direttamente perchè ds riceve input solo da registri) mov dx, offset istr ; in dx mettiamo invece l'indirizzo del dato che vogliamo utilizzare. call puts ; chiamata della subroutine puts che stampa a video il contenuto di DS : DX (stampa a video la stringa) call getc ; chiamata della subroutine getc che riceve un input da tastiera con eco (8h input senza eco), l'input viene salvato in al. mov bl, al ; copiamo al in bl. add bl, 32d ; sommiamo al valore intero del carattere preso da tastiera (bl), il valore decimale 32. E lo salviamo in bl. call put1310 ; chiamiamo la subroutine put1310 che stampa a schermo LF e CR mov dx, offset ostr ; mettiamo in dx il valore dell'indirizzo della variabile ostr (avendo già in ds tutto il segmento di dati, per stampare un dato specifico di volta in volta è sufficiente cambiare l'indirizzo del dato contenuto in dx call puts ; richiamiamo la subroutine per la stampa del valore in ds : dx mov dl, bl ; copiamo bl in dl (bl sarà il codice ascii del carattere + 32) call putc ; stampa il carattere in dl (tramite 2h). mov ax, 4c00h ; stoppa l'interrupt (simile ad un return). int 21h ; subroutine getc - attende per l'inserimento di un carattere da tastiera con eco. getc: mov ah, 1h int 21h ret ; subroutine putc putc: mov ah, 2h ; inseriamo in ah il comando da passare all'interrupt, 2h stampa il carattere contenuto in dl int 21h ret ; subroutine puts che serve a stampare la stringa (9h pesca la stringa da ds : dx / data segment: indirizzo. puts: mov ah, 9h ; stampa la stringa tramite la funzione 9h che inseriamo in ah per poter inviare il comando all'interrupt. int 21h ret ; subroutine put1310 - serve and andare a capo, stampando i caratteri LF e CR (codice ascii: rispettivamente 13 e 10) put1310: mov dl, 13d mov ah, 2h int 21h mov dl, 10d mov ah, 2h int 21h ret end start |
Commenti