Estimada,
Voy por partes: con respecto al direccionamiento memoria-memoria, no está soportado por x86 en ninguna de las operaciones de ALU (incluída CMP). La única excepción relevante es un PUSH con operando en memoria, ej: PUSH DS:[BX], ahí se busca el ooerando en DS:BX y se lo guarda al tope del stack, lo cual realiza dos accesos a memoria.
El código que indicás es equivalente, sí. Cuidado que no va byte ptr porque al usar DL ya se aclara que el modo es de 8 bits. Resta aclarar que los fragmentos son equivalentes porque x86 es little endian. Y por tanto en al hacer MOV DX, ES:[BX] se guarda en DL el byte bajo, que está en ES:BX, y en DH el alto, que está en ES:BX + 1. Si fuera big endian no sería equivalente.
Los errores más comunes es una pregunta complicada de responder. Te diría que acomodar mal el stack a la salida de una función es bastante común.
Saludos,
Federico