Un byte è un byte, e non l'ASCII da cui è rappresentato, quindi è giusto e normale che sia così.
Tuttavia, la convenzione ci viene incontro, e la tabella ASCCI è fatta per facilitare queste operazioni.
Infatti, i numeri 0-9 sono rappresentati dai valori 0x30-0x39
Vale a dire che:
Dal numero letto, sottraendo 0x30 otteniamo il numero vero che ti interessa, lo stesso per il secondo valore. A questo punto possono essere sommati. Aggiungendo di nuovo 0x30 si possono mandare in output i numeri ascii corretti.
Il problema è che questo funziona per tutte quelle operazioni che non superino le cifre 0-9, quindi molto limitato.
Nel caso le si superi, bisogna fare delle ulteriori trasformazioni per separare le cifre da cui è composto il numero (in base 10). Di solito i compilatori però (come masm) mettono già a disposizione delle funzioni per eseguire operazioni del genere.
Ricapitolando:
...
;input del carattere
mov ah,01h
int 21h ;in al viene salvato l'input inserito dall'utente.
sub al, 30h
mov n1,al
...
;input 2°numero
mov ah,01h
int 21h
sub al, 30h
mov n2,al ;al contiene il carattere digitato
...
mov al,n1
add al,n2
add al, 30h
mov risultato,al
mov ah,09h
mov dx,offset risultato
int 21h
Questo è quello che funziona nel caso si debba sommare 2 cifre che fanno al massimo 10, come 4+3.