I searched the forum, and I found a thread that appeared to have the solution to the problem:
sub si, '0'
sub di, '0'
Now, instead of printing 'd', it prints 'qwn'. I think that it is because I am not using brackets around si, but I am not sure because it will not assemble correctly if I put brackets around it. Here is some more code, just in case you need it:
.calc:
.calcloop:
mov si, math_prompt
call print_string
mov di, buffer
call get_string
mov si, buffer
mov di, math_plus
call strcmp
jc .plus
jmp mainloop
.plus:
mov si, math_prompt_fnum
call print_string
mov di, add_res
call get_string
mov si, math_prompt_num2
call print_string
mov di, add_res2
call get_string
mov si, add_res
mov di, [add_res2]
sub si, '0'
sub di, '0'
add [si], di
call print_string
mov si, nl
call print_string
jmp mainloop