Почему не обнуляется регистр cx?
Сдаётся мне, ты совсем другой вопрос хочешь задать. Например, "почему подпрограмма A1 перевода строки в её числовое значение работает неправильно". Ответ на этот вопрос: потому что в следующем коде есть две ошибки:
A1:
push ax
push cx
push dx
push di
xor cx, cx
mov di, 10
mov cx, [bx+2]
- во-превых длина строки записана по смещению 1 в буфере, который заполняет
функция 0ah прерывания 21h,
- во-вторых, длина строки представлена одним байтом, а не словом, как ты читаешь.
С учётом этого, код должен выглядеть вот так:
A1:
push ax
push cx
push dx
push di
xor cx, cx
mov di, 10
mov cl, [bx+1]
А буфер для ввода строки должен быть определён так:
firstNum db 6,0,6 dup(?)
Дальше, вот тут ты опять путаешь байты со словами и загружаешь в dx больше чем надо:
.A2:
xor dx, dx
mov dx, [bx+si]
sub dx, '0'
add ax, dx
должно быть
.A2:
xor dx, dx
mov dl, [bx+si]
sub dl, '0'
add ax, dx
Дальше у тебя какая-то ерунда с балансом стека:
A1:
push ax
push cx
push dx
push di
...
pop si
pop di
ты кладёшь в него одно, а снимаешь другое и в другом количестве. Но это не важно, потому что из функции A1 ты всё равно нигде не возвращаешься. Show_AX выглядит нормально.