Tu solución tiene varios errores:
En BX tenés el desplazamiento al nodo. DS:[BX] apunta al puntero al string, no al contenido del string.
Por lo tanto tenes que dereferenciar el puntero:
mov BX, [BX] ; cargo en BX la dirección del primer byte de string
Luego donde pusiste
cmp ds:[bx+si],0 ; poner el ds esta bien?
está bien poner DS: pero no es necesario porque por defecto para ese acceso a memoria igualmente se utiliza el segmento DS
Lo que está mal es que no indicas que la comparación es de a byte. Deberias poner
cmp byte ptr ds:[bx+si],0
o más sencillo
cmp byte ptr [bx+si],0
Luego previo a donde pusiste
push [bx + 2] ; nodo_siguiente
deberías volver a cargar el puntero al nodo (puesto que más arriba lo sobreescribi con la direccion del inicio de BX):
mov BX, [BP-2] ; cargo en BX la direccion de actual
Sobre tu otra pregunta, podrías hacer pop AX directamente.
Saludos,
Gustavo