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