Hice el ejercicio de 1 del examen de Arquitectura 2 de 2011 - Marzo [https://drive.google.com/file/d/0B61gGKV34MR5SDFOODNKRGJIb2c/view?usp=sharing].
Y aunque parto de compilar el MISMO codigo en C, tengo una solucion un poco diferente a la de las soluciones.
Mi pregunta es si mi código está correcto.
En las soluciones, veo varias diferencias:
1) Usan el registro BX para guardar la variable global, yo estoy usando una variable definida en memoria, se puede hacer de esta manera tambien?
2) El registro de segmento DS lo setean a 0 en el main, yo lo hago en la interrupcion cada vez que se invoca, supongo que esto puede hacerse indistintamente en ambos (aunque claro, es mas óptimo hacerlo en main).
3) DATAIN y DATAOUT las pasan a un registro y luego llamar a IN y OUT con ese registro, yo pongo los valores (supuse que inmediatos) en el registro, esto es igual de correcto o deberia de haberlo hecho como en la solucion?
4) No entiendo la instruccion SHL SI, 1 de la solucion (penultiuma linea de código).
5) La solucion no preserva el contexto ni en el main ni en la interrupcion, yo si lo hice "por costumbre". Si la letra no lo pide y es un sistema dedicado (y no hacerlo no perjudica el funcionamiento correcto del codigo) no nos preocupamos de preservar contexto?
El código en C de la soluciones es:
estado *s;
main {
s = ESTADO_INICIAL;
// instalar interrupciones
while (true);
}
Input {
unsigned char x = IN(DATAIN);
OUT (DATAOUT, x & s->mask);
s = (s->transiciones)[x];
}
Y mi código en 8086 es el siguiente:
estado db ESTADO_INICIAL
...
main:
MOV estado, ESTADO_INICIAL
;Instalo interrupciones
while:
JMP while
...
Input PROC FAR
PUSH AX
PUSH ES
PUSH SI
PUSH BX
XOR AX, AX
MOV ES, AX
IN(AL, DATAIN)
MOV SI, estado
XOR BH, BH
MOV BL, AL
AND AL, ES:[SI]
OUT(DATAOUT, AL)
MOV estado, ES:[SI + BX + 1]
POP BX
POP SI
POP ES
POP AX
IRET
Input ENDP