Espero poder encontrar algo de ayuda aquí en el foro. Se que normalmente no se habla de cosas de este estilo.. a ver que tal. Mi problema es el siguiente: se trata de hacer un programa que interactue con un .com (se me ha olvidado comentar que se trabaja desde ms-dos).
Este fichero ".com", supongamos que se llama driver, ofrece una interrupción que me permite trabajar con el altavoz del PC de una forma "más amigable". Podemos verle como una caja negra, de la que sabemos que dicha interrupción es la 61h, para asuntos del vector de interrupciones, que como medida de prevención guarda en memoria la palabra 0FECAh y además si llamamos a esta interrupción con AH = 0 nos devuelve un código de estado.
El problema que tengo, no es a la hora de ejecutar las interrupciones y demás, viene a la hora de comprobar que realmente está cargado
![llorando [snif]](/images/smilies/nuevos/triste_ani1.gif)
Copio el código:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Se comprueba la instalacion previa del driver
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
xor ax,ax ;1.-Que existe dicha interrupcion
mov es,ax
mov dx, es:186h ;es = 0
mov ax, es:184h
or ax, dx ;Que el or de ambos sea 0 implica que ambos son cero.
cmp ax, 0
je fin
; mov ax, 186h ;2.- Que esta almacenado el valor en la dir de memoria correspondiente
; mov es,ax
; mov ax, es:[184h+3h]
; cmp ax, 0CAFEh
; jne fin
xor ah,ah ;3.-Que responde con el estado correcto
int 61h
cmp ax,0ee01h
jne fin
Explico por si algo no queda claro:
1.- Cuando cargo el driver en el vector de interrupciones, se modifica el contenido de las celdas 184h y 186h. Recuerdo que es la interrupción 61h, es decir 61h*4=184h. No lo comenté pero cuando me refiero a h quiero decir hexadecimal. Volviendo al vector, si el or del contenido de ambas celdas es 0, significa que 184 y 186 están a 0, por tanto no existe dicha interrupción y salimos del programa.
3.-Compruebo el retorno de dicha interrupción cuando se pregunta por su estado.
2.- ¿¿¿??? Aquí mi problema. La interrupción se referirá a una dir de memoria apuntada por un offset y un segmento. Dado que trabajamos con una arquitectura big endian, 184h será la dirección del offset y 186h la dir del segmento. A su vez en el enunciado nos indican que 3 posiciones de memoria después de la dirección apuntada por ese segmento y offset está la palabra 0FECAh. (A la hora de comparar... de nuevo, como es big endian comparamos con CAFE, aunque de esto último no estoy del todo seguro).
Algo me falla en el punto 2, pero creo que estoy accediendo a la dirección correcta, utilizó el segmento extra para referirme a la posición de memoria donde habita el contenido driver... me estoy volviendo loco!
![a lágrima viva [buuuaaaa]](/images/smilies/nuevos/triste_ani3.gif)
Cualquier sugerencia será bien recibida.