Van algunos comentarios:
Tu programa en algo nivel y tu programa en bajo nivel no son el mismo programa. Uno itera hasta encontrar un byte con valor 0 y el otro intenta recorrer desde cierto indice hasta otro.
El alto nivel no cumple lo pedido en la letra dado que la entrada no es un string de tipo ASCIIZ (terminado en \0) sino que es una tabla con rango conocido.
La idea es el bajo nivel sea código assembler correspondiente al alto nivel.
Luego sobre la implementación de bajo nivel, comento algunos errores:
- No se puede mover AL a BP. AL es de 8 bits y BP de 16 bits
- ADD BX, SI actualiza BX (BX = BX + SI), por lo que al ir a su vez cambiando SI el resultado no apunta a la secuencia de bytes de la tabla
- CMP BX, DI realiza la resta BX-DI y actualiza las flags y no guarda el resultado de la resta. Así que al usar JG saltaría si BX > DI, mirando los operandos como si tuvieran signo. Seguramente quieras usar ja
- el CMP con ambos operandos a memoria no es válido. Tendrias que comparar contra un registro (de 8 bits pues es una tabla de bytes)
Saludos,
Gustavo