Código
op resb 1
Declaras una variable de 1 byte pero:
Código
read op, 2 ... mov bx, [op]
Pero lees y usas 2 bytes despues; eso esta mal de base.
¿Como sabes si se leyo un caracter + salto de linea o dos caracteres?
Aca ya te explique el problema que estas teniendo:
https://foro.elhacker.net/asm/nasm_tablas_de_multiplicar-t512336.0.html
Si escribo 3 y enter op valdra 0xA33 y si escribo 10 y enter op valdra 0x3031. Le resto 0x30 y multiplico a 1 por ese valor, 0xA03 y 0x3001 son mayores a 0x90. En ambos casos el codigo salta a m90 y continua la ejecucion hasta salir del programa.
Usando un depurador linea por linea lo verias mucho mas claro todo.

