Pract 12-Ej2 duda de la letra y de implementación

Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
Número de respuestas: 29
Hola la letra de este ejercicio dice lo siguiente:
Se desea implementar un Screen Saver que funciona de la siguiente forma:
• Si transcurren 30 segundos sin oprimirse ninguna tecla, se blanquea la
pantalla. 
• Al oprimir cualquier tecla, la misma se restaura. 
Se dispone de un timer que genera una interrupción cada 0.1 ms invocando la rutina
TIMER. Cada vez que se oprime una tecla se genera una interrupción que invoca la
rutina TECLADO. 
La pantalla esta mapeada en memoria a partir de la dirección de memoria
PANTALLA. El tamaño de la pantalla es de 80 columnas x 25 filas. Cada carácter en
pantalla esta representado en 16 bits de la siguiente forma:
8 bits 8 bits
A      |B
A = Codificación en ASCII del carácter.
B = Atributo. 
El atributo normal es 07h. El carácter espacio es 20h.

Mi primer duda es sobre que es el atributo?
Mi segunda duda es para colocar en bx la dirección 0B000:0800,
es correcto hacer esto:
mov es,B000
mov bx, es:[0800].

Comparto el código en alto nivel para ver si es correcta mi idea de como se blanquea la pantalla y como se restaura luego:
short int aux[2000];
int tics=0;
bool tecla = true;
bool restaurar = false;
bool blanquiar = false;

void main(){

//instalo rutinas de interrupción
enable();

while (true){

    if (blanquiar){
        disable(); int h=0;
        for (int i=0; i<25; i++)
              for (int j=0 ; j<80;j++){
                        //guardo el contexto
                        aux[h] = mem[PANTALLA +80*i +j];
                        //pongo espacio en blanco 8199=2007h
                        mem[PANTALLA +80*i +j] = 8199;
                        h++;
                }
         enable(); 
     }

     if (restaurar){
         disable(); int h=0;
        for (int i=0; i<25; i++)
              for (int j=0 ; j<80;j++){
 
                        mem[PANTALLA +80*i +j] =aux[h];
                        h++;
                }
         enable(); 
     } 
}
}
void TECLADO(){
tecla = true;
}
void TIMER(){
tics++;
if ((blanquiar)&&(tecla)){
    tecla = false;
    blanquiar = false;
    tics=0;
    restaurar = true;}
else if ((!tecla)&&(tics>=300000)
       blanquiar =true;
}

Agradezco si me pueden contestar las preguntas que hice anteriormente y si es correcto como implemente las rutinas en alto nivel.

Saludos
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola, los atributos permiten cambiar aspectos de visualización del caracter, pe colores blinking, etc.

No, no es la forma correcta de hacerlo, de hecho es imposible mover 0B000:0800 a BX u otro registro pues esa es notación de direcciones segmentadas formadas por segmento (B000 en este caso) y desplazamiento (0800 en este caso). Cada elemento de una dirección segmentada ocupa 16 bits siendo los registro de 16 bits.

La máquina no es dedicada, pues si fuera así no sería necesario tener un salva pantallas.

Saludos, Gonzalo 
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
int main(){

//instalo rutinas de interrupción
enable();


    if (blanquiar){
        disable(); int h=0;
        for (int i=0; i<25; i++)
              for (int j=0 ; j<80;j++){
                        //guardo el contexto
                        aux[h] = mem[PANTALLA +80*i +j];
                        //pongo espacio en blanco 8199=2007h
                        mem[PANTALLA +80*i +j] = 8199;
                        h++;
                }
         enable(); 
     }

     if (restaurar){
         disable(); int h=0;
        for (int i=0; i<25; i++)
              for (int j=0 ; j<80;j++){
 
                        mem[PANTALLA +80*i +j] =aux[h];
                        h++;
                }
         enable(); 
     } 
 return 0;
}
Esta bien ahora que le saque el while true el main? Esta bien la forma que utilizo para blanquiar la pantalla y restaurarla luego? Me refiero a la forma que accedo a memoria desde la dirección pantalla y como guardo el contexto.
La parte b de este ejercicio pedia compilar en assembler 8086, sabiendo que PANTALLA es la dirección B000:0800.
Cómo hago aux[h] = mem[PANTALLA +80*i +j]; en bajo nivel entonces?
Porque esta mal hacer esto
mov es,B000
mov bx, es:[0800]. 
No tendria en este caso bx la dirección  de memoria donde esta mapiada la pantalla?
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. No era solo sacar el while pues al sacarlo tu solución ahora no funciona pues el main se ejecuta solo una sola vez y no creo que eso sea lo que quieras hacer.

Tenés un disable y dos enables eso está raro.

"//pongo espacio en blanco 8199=2007h" la mayoría de los lenguajes soportan constantes en hexadecimal pe 0x2007 o directamente 2007h.

El acceso a la pantalla en alto nivel está bien. 

Cuando pones
mov es,B000
mov bx, es:[0800]

estas dejando en BX el primer caracter de la pantalla (fila cero y columna cero) tanto el ascii como el atrubuto.

Para tener en BX la dirección (en realidad el desplazamiento respecto a ES) tenes que hacer mov bx, 0800. Luego [ES:BX] apunta sí a la base del mapeo de la panalla en memoria.

Saludos, Gonzalo

En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
No, tengo dos disables y dos enables ,abajo de los if de restaurar y blanquiar.
Entiendo que la solución no quedo bien ahora.

"//pongo espacio en blanco 8199=2007h" la mayoría de los lenguajes soportan constantes en hexadecimal pe 0x2007 o directamente 2007h."
Con esto me estas queriendo decir que no era necesario pasarlo a decimal, que simplemente podia haber hecho:   mem[PANTALLA +80*i +j] = 2007h.?

mov es,B000
Pensaba que era lo mismo hacer es:[0800]  que hacer [es:0800] en general, no capto bien cual es la diferencia entre estas dos instrucciones.

mov bp,[es:0800].
Ahora para moverme sobre la pantalla tengo que hacer: [bp +80*i +j]   donde  0<=i<25, 0<=j<80 no?


Gracias por responder.
Saludos


En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
1. Eso, podés ponerlo directo en distintas bases indicandola al final de los dígitos. Eso lo podes ver en la parte de directivas de 8086 en la presentación de teórico.
2. Sí es lo mismo pero en general queda más cómodo apuntar un regustro (BX) a la base de la estructura y luego moverse con algún desplazamiento.
3. Ojo que cada elemento de la estructura ocupa dos bytes.

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
 3) Ojo que cada elemento de la estructura ocupa dos bytes.

Es como si tuviera el doble de columnas: 


Ahora para moverme sobre la pantalla tengo que hacer: [bp +80*i +j*2]   donde  0<=i<25, 0<=j<80 no? 
si supongo que en AX esta guardado el caracter, y quiero poner el caracter en la fila 1 columna tres de la pantalla hago:

mov [bp + 80 + 6], ax.

es correcto?

Saludos y gracias por responder.

En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. No, es como si tuvieras el doble de columnas pero la expresión para acceder a los caracteres no es correcta. 

Saludos
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
Hola quise decir si tuviera en AX todo junto el carácter y el atributo A | B
A = Codificación en ASCII del carácter.
B = Atributo. 

B en AL y A en AH.
Ahora para moverme sobre la pantalla tengo que hacer: [bp +80*i +j*2]   donde  0<=i<25, 0<=j<80 no? 
si supongo que en AX esta guardado el caracter, y quiero poner el caracter en la fila 1 columna tres de la pantalla hago:

mov [bp + 80 + 6], ax.

Ahora si es correcto?

Saludos. Y gracias por responder.
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. La formula está mal. Para i=1 a qué dirección accedes? Qué hay ahí?

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
Si bp tiene la base de la pantalla le sumo 80 y paso de la fila cero a la fila 1 columna cero(parte baja).Si ahora a esto le sumo 6, paso a la fila 1 columna 3 (parte baja).

Que me decis que esta mal hacer esto:
mov [bp + 80 + 6], ax.?

Que lo correcto es hacer mov [bp + 80 + 6], al, mov [bp + 80 + 6], ah.?



En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. No, al sumarle 80 no pasas a la fila uno.

Si haces "mov [bp + 80 + 6], al, mov [bp + 80 + 6], ah" Escribis el contenido de AL en la dirección de memoria SS:bp + 80 + 6 y escribís en la misma dirección el contenido de AH (sobrescribe).

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
Hola lo que yo quiero saber como hacer en bajo nivel, lo que hice en alto nivel cuando hice lo siguiente con los fors:
aux[h] = mem[PANTALLA +80*i +j];
mem[PANTALLA +80*i +j] = 8199;
mem[PANTALLA +80*i +j] =aux[h];

Cuando lo hice en alto nivel, y tu me dijiste que estaba bien,asumi que si a pantalla le sumo 80 paso de la fila 0 a la 1, y con j me voy moviendo por las columnas.
No me doy cuenta como hacerlo de forma correcta esto en bajo nivel, te agradezco si pudieras explicarme como.Desde ya muchas gracias saludos.




En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. Para vos en las dirección PANTALLA que es lo que hay almacenado? y en la dirección PANTALLA+1?

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
La pantalla esta mapeada en memoria a partir de la dirección de memoria
PANTALLA.
Pantalla es como una matriz 80 columnas x 25 filas, pero en cada casillero de la matriz por decirlo asi se almacenan dos bytes, entonces en PANTALLA solo va estar B (el atributo) y en PANTALLA+1 (el caracter).
PANTALLA Y PANTALLA+1, representarian la fila cero y columna cero.
Osea para mi en memoria la matriz que vendria a ser la pantalla se almacena por filas


En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Entonces para:
- i=0 y j=40, accedes a la dirección 80.
- i=1 y j=0, accedes a la dirección 80.

Eso está bien?

Saludos, Gonzalo

En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
No entiendo bien lo que me decis, yo solo quiero saber bien como hago en asembler:
aux[h] = mem[PANTALLA +80*i +j];
mem[PANTALLA +80*i +j] = 8199;
mem[PANTALLA +80*i +j] =aux[h];

En alto nivel lo pense asi.
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. Trata de entenderlo entonces es fundamental para que puedas seguir adelante en la resolución del problema.

En el correo anterior te muestro los desplazamientos que genera tu formula en bajo nivel para dos posiciones distintas de memoria.

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
1) Cuando hago:

mov es,B000
mov bx, es:[0800] 

me dijiste que estaba dejando en bx el primer caracter de la pantalla (fila cero columna cero) tanto el ascii como el atributo.

a)Al hacer mov bx, es:[0800] estoy moviendo memoria a un registro que es de dos bytes por lo tanto no es necesario hacer mov bx, word ptr es:[0800]?

b)Ahora si yo quiero mover a bx, lo que esta en la fila cero columna uno tanto ascii como el atributo, tengo que hacer :
mov bp, 0800
mov di,2
mov bx, es:[bp +di]
?
c) Si quiero cambiar de fila por ejemplo quiero depositar en bx lo que esta en la fila 1 columna 1 (tanto caracter ascii como atributo), hago lo siguiente:
mov bp, 0800
mov di,2
mov bx, es:[bp +di +160]?

d)En este mismo hilo me dijiste "Hola. No, al sumarle 80 no pasas a la fila uno." porque cada elemento de la matriz ocupa dos bytes. En alto nivel no importa eso por eso esta bien lo que hacia yo de sumarle 80, pero en bajo nivel debo sumar 160 para lograr dicho cometido no?
 
Si esta bien estas cosas que te pregunte ya tengo una idea de como seguir el ejercicio, pero te agradeceria que me contestaras para saber si esta bien lo que estoy pensando.

Saludos y gracias desde ya.
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
Hola te muestro como lo hice en alto nivel y despues como lo compile que tengo algunas dudas.
1) Alto nivel

short int aux[2000];
int tics=0;
bool tecla= false;
bool blanquiar = false;

int main(){
//Instalo rutinas de interrupción
enable();
return 0;
}
void TIMER(){
tics++;
if ((tics >=300000) &&(!tecla)&&(!blanquiar)){
        int h = 0;
        for (int i=0; i<25 ; i++)
              for (int j=0 ; j<80 ;j++){
                    aux[h]=mem[PANTALLA + 80*i +j]
                    mem[PANTALLA +80*i +j] = 2007h;
                    h++;
               }
}
if (tics>=300000){
tics=0; tecla=false
}
}
void TECLADO(){
tecla = true;
if (blanquiar){
    blanquiar = false;
    int h=0;
      for (int i=0; i<25 ; i++)
              for (int j=0 ; j<80 ;j++){
                    mem[PANTALLA + 80*i +j]=aux[h]
                    h++;
               }
}
}
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
2) en bajo nivel

aux dw 2000 dup(0)
tics dd 0 ;{ la defino de 4 bytes porque 300000 no entra en 2 bytes}
tecla db 0
blanquiar db 0;

main proc

cli
xor ax,ax
mov es,ax

mov word ptr es:[8*4], offset TIMER
mov word ptr es:[8*4 +2], cs; { asumo este segmento, las variables globales que van a ser manipuladas por el manejador deben declararse en este mismo segmento?}
mov word ptr es:[8*4], offset TECLADO
mov word ptr es:[8*4 +2], cs; 
 sti;
main endp

TIMER proc far

inc cs:[tics] ;{ asumi este segmento }

;{ conservo el contexto}
push es
push bx
push di
push ax
push cx
push bp

cmp double word ptr cs:[tics],300000 ;{ nose si existe este tipo de directiva double word ptr}
jb IF
cmp byte ptr cs:[tecla],1
je IF
cmp byte ptr cs:[blanquiar],1
je IF
mov es,B000
mov bx,0800
xor di,di
xor si,si
mov bp,cs:[aux]
FOR:
mov ax, es:[bx+di]
mov cl,2
shl si,cl
move word ptr cs:[bp +si], ax ;{aca supongo que no es necesario el word, uso cs nose si esta bien. Asumi que el arreglo aux se almacenaba en ese segmento asi que supongo que si}
add di,2
inc si
cmp di,160
jne FOR

IF:
cmp double word ptr cs:[tics],300000
jb FIN

mov double word ptr cs:[tics],0
mov byte ptr cs:[tecla],0

FIN:
pop bp
pop cx
pop ax
pop di
pop bx
pop es
ret
TIMER proc

TECLADO proc far
move byte ptr cs:[tecla],1
cmp byte ptr cs:[blanquiar],0
je FIN
;{ preservo el contexto}
push es
push bx
push di
push ax
push cx
push bp

mov es,B000
mov bx,0800
xor di,di
xor si,si
mov bp,cs:[aux]
mov bp,cs:[aux]
FOR:
mov cl,2
shl si,cl
mov ax, cs:[bp +si]
mov es:[bx+di],ax
add di,2
inc si
cmp di,160
jne FOR
pop bp
pop cx
pop ax
pop di
pop bx
pop es
FIN:
ret
TECLADO endp

Hola te agradezco si me podes decir si hay algo mal, y responderme las dudas que deje comentadas.
Desde ya muchas gracias,Saludos.
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. 

Muy pocos comentarios en el assembler.

Falta el retorno en el main, si no sigue ejecutando el código del TIMER.

Pisas un manejador con otro en el vector de interrupciones.

Hola en el caso de maquinas no dedicadas las variable del manejador se suelen colocar en CS pues es un lugar que garantiza contener siempre el mismo valor cuando se llama al manejador, pues CS es donde está corriendo él.

No podés comparar contra un inmediato de 32 bits, el tamaño máximo para inmediatos es 16bits.

El prt cuando el otro operando es un registro está mal.

Qué hace el "mov bp,cs:[aux]" al principio del for? 

No entiendo por qué multiplicas por 4 el SI y luego además le sumas 1.

El RET no se usa en interrupciones, destruye el stack!

En el TECLADO tenés errores similares.

Saludos, Gonzalo

Cuando compilas a assemble en ambos manejadores perdés el for de 25.

No estás colocando el caracter para blanquear la pantalla.

En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. 

Falta un disable al principio del main.

No estás actualizando la variable blanquiar, no debería llamarse blanquear?

Me parece que la variable tecla sobra.

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
1) Alto nivel

short int aux[2000];
int tics=0;
bool blanquiar = false;

int main(){
disable(); // puse el disable
//Instalo rutinas de interrupción
enable();
return 0;{ lo habia puesto este retorno}
}
void TIMER(){
tics++;
if ((tics >=300000) &&(!blanquiar)){ ; Saque tecla
        int h = 0;
        for (int i=0; i<25 ; i++)
              for (int j=0 ; j<80 ;j++){
                    aux[h]=mem[PANTALLA + 80*i +j]
                    mem[PANTALLA +80*i +j] = 2007h;
                    h++;
               }
       blanquiar=true; 
}

if (tics>=300000){
tics=0;
}
}
void TECLADO(){

if (blanquiar){
    blanquiar = false;
    int h=0;
      for (int i=0; i<25 ; i++)
              for (int j=0 ; j<80 ;j++){
                    mem[PANTALLA + 80*i +j]=aux[h]
                    h++;
               }
}
}
2) en bajo nivel

aux dw 2000 dup(0)
tics dd 0 ;{ la defino de 4 bytes porque 300000 no entra en 2 bytes}
blanquiar db 0;

main proc

cli
xor ax,ax
mov es,ax

mov word ptr es:[8*4], offset TIMER
mov word ptr es:[8*4 +2], cs
mov word ptr es:[9*4], offset TECLADO
mov word ptr es:[9*4 +2], cs 
 sti;
ret { aca inclui el ret, es que me guie por las diapositivas y en el ejemplo de ellas no tenian}
main endp

TIMER proc far

inc cs:[tics] ;{ asumi este segmento }

;{ conservo el contexto}
push es
push bx
push di
push ax
push cx
push bp

;No podés comparar contra un inmediato de 32 bits, el tamaño máximo para inmediatos es 16bits.
; Cómo hago para comparar el inmediato 300000? existe la directiva doube word ptr?
cmp doube word ptr cs:[tics],300000
jb IF
cmp byte ptr cs:[tecla],1
je IF
cmp byte ptr cs:[blanquiar],1
je IF
mov es,B000
mov bx,0800
xor di,di
xor si,si ; si representa el indice por el cual me voy moviendo en el arreglo aux
mov bp,cs:[aux] ; bp tiene la base del arreglo aux
FOR:
mov ax, es:[bx+di]
mov cl,2
shl si,cl
move cs:[bp +si], ax ; le saque el ptr; es como hacer aux[h]=mem[PANTALLA +80*i + j]
mov word ptr es:[bx+di], 2007h ; le pongo el caracter con el atributo
add di,2
inc si ; le incremento uno para que pase al proximo indice del arreglo

cmp di,160
jne FOR

IF:
cmp double word ptr cs:[tics],300000
jb FIN

mov double word ptr cs:[tics],0

FIN:
pop bp
pop cx
pop ax
pop di
pop bx
pop es
iret ; {iret en vez de ret}
TIMER proc
TECLADO proc far

cmp byte ptr cs:[blanquiar],0
je FIN
;{ preservo el contexto}
push es
push bx
push di
push ax
push cx
push bp

mov es,B000
mov bx,0800
xor di,di
xor si,si
mov bp,cs:[aux]
FOR:
mov cl,2
shl si,cl
mov ax, cs:[bp +si]
mov es:[bx+di],ax
add di,2
inc si
cmp di,160
jne FOR
pop bp
pop cx
pop ax
pop di
pop bx
pop es
FIN:
iret
TECLADO endp

Gracias por responder y disculpa que no puse comentarios.
Hola cometi errores al escribirlo aca cuando lo pase.
1)Cuando hicimos ejercicios en teorico con Sergio (el profesor del teorico) solo hacia esto:
//Instalo rutinas de interrupción
enable();
Vi en examenes que lo hacian asi, o de esta forma disable();//Instalo rutinas de interrupción; enable()
Cual es correcta?


2)"Hola en el caso de maquinas no dedicadas las variable del manejador se suelen colocar en CS pues es un lugar que garantiza contener siempre el mismo valor cuando se llama al manejador, pues CS es donde está corriendo él."
Con variables del manejador te referis a las variables globales que manipulo dentro de los manejadores?
tics, el arreglo aux y blanquiar.
Me estas queriendo decir que cuando la maquina no es dedicada hay que colocar las variables que van a ser modificadas por el manejador en el mismo segmento en el que esta? Esta bien hacerlo asi si la maquina no es dedicada?
3) "Cuando compilas a assembler en ambos manejadores perdés el for de 25."
No entendi esto.
4);Cómo hago para comparar el inmediato 300000? existe la directiva doube word ptr?
cmp doube word ptr cs:[tics],300000.
Saludos y gracias por responder. Espero que ahora haya podido arreglar los errores salvo el de cmp doube word ptr cs:[tics],300000. que nose somo solucionar.
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. No podés comparar un operando de más de 16 bits. Las operaciones que podes usar con DW son pocas y deben tener una W o una A dentro de los posibles operandos. Eso se detalla en la página 6 de las notas de teórico cuando describe los Tipos de Argumentos.

Qué cáulculo estás haciendo para acceder a la memoria de video? Por qué seguis multiplicando por 4 y sumando 1 a SI, no me queda claro porque haces eso. 

Sobre el disable, cuando arranca el procesador las interrupciones están desabilitadas por lo que en el caso de estar instalando luego del momento del arranque no es necesario hacer disable, esto ocurre comúnmente en máquinas dedicadas, donde el main está entre las primeras cosas que se ejecutan. En el caso de maquinas no dedicadas es obligatorio hacerlo para proteger la instalación de los manejadores.

2) Sobre el contenido de las varibles en CS, cualquiera puede acceder a ellas con buenas o malas intenciones y cambiarlas. Ponerlas en CS te asegura que para el manejador ese lugar que reservó está en un lugar conocido y fijo respecto a su CS. Sí, a ese tipo de variables me refiero y se colocan en el mismo segmento. Cuando la máquina es dedicada al sistema tenés más control pues todo lo que va a correr en ella es programado por vos.

3) Sigue sin aparecer el for de 25, en alto nivel tenes dos for, uno hasta 80 y otro hasta 25.

4) No se puede.

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Pract 12-Ej2 duda de la letra y de implementación

de Maria Valentina Da Silva De Souza -
1) Que operación equivalente tengo para hacer en vez de :
cmp double word ptr cs:[tics],300000.
Porque 300000 no lo puedo cargar en dos bytes.

2)"Qué cáulculo estás haciendo para acceder a la memoria de video? Por qué seguis multiplicando por 4 y sumando 1 a SI, no me queda claro porque haces eso. "

aux[3] = aux +3*sizenodo   que en este caso size nodo es 2.

Me equivoque al hacer mov cl,2, lo correcto es hacer mov cl,1.
Cuando arranca todo di=0 y si=0
1)mov ax, es:[bx+di]  dejo en ax el contenido de la pantalla columna cero fila cero.
2)mov cl,1
   shl si,cl
   mov cs:[bp +si], ax 
Dejo en el arreglo aux en el indice cero el caracter con el atributo de la pantalla.
(preservo el contexto)
mov word ptr es:[bx+di], 2007h  pongo en la fila cero columna cero de la pantalla el caracter con el atributo.
3) add di,2  sumo dos a di para que en la próxima iteración del for deje en ax el contenido de la fila cero columna uno de la pantalla.
4)inc si   incremento el indice del arreglo aux para que la próxima iteración del FOR pueda guardar lo que esta en la fila cero columna uno de la pantalla en aux[1].

"Sigue sin aparecer el for de 25, en alto nivel tenes dos for, uno hasta 80 y otro hasta 25."
Me di cuenta que en no lo precisaba por eso no lo hice asi en bajo nivel.
Esta mal?

Saludos y gracias por responder.
En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Gonzalo Tejera -
Hola. 
1. Tenés que hacer dos comparaciones, o una teniendo alguna consideración. Para mantener el contador en una variable de dos palabras tenes que implementar vos la aritmética para 32 bits.

2. Pero sin el segundo for estás recorriendo sólo la primera fila con DI de 0 a 159. Me da la impresión que seguís accediendo mal a la memoria de video. Te recomiendo que hagas un dibujo en un papel, dibujes la matriz de (caracteres, atributo) organiza por filas, y mires como se mapean las direcciones con las filas y columnas.

Saludos, Gonzalo

En respuesta a Maria Valentina Da Silva De Souza

Re: Pract 12-Ej2 duda de la letra y de implementación

de Usuario eliminado -
Comparto mi solucion a ver si esta correcto:

word aux[2000];
bool pantalleado;
int tics;

int main() {
tics = 0;
deshabilitar
pantalleado = false; 
// pantalleado indica si esta el salvapantallas actualmente o no
instalar
habilitar
}

void TECLADO() {
tics=0;
if (pantalleado) {
 for (int i=0;i<2000;i++) {
 mem[PANTALLA + i]=aux[i];
 }
 pantalleado= FALSE;
}
}

void TIMER() {
tics++
if (tics==300000) {
 pantalleado = TRUE;
 for (int i=;i<1000;i++) {
 aux[i]=mem[PANTALLA + i];
 aux[i+1]=mem[PANTALLA +i+1];
 mem[2i]=07h;
 }
}
}

y el assembler:

aux DW 2000 dup(1123)
pantalleado DB 0
tics DD 0

main proc   
    mov dword ptr CS:[tics], 0   
    mov byte ptr CS:[pantalleado], 0
    cli 
    xor es, es
 
    mov word ptr ES:[10*4], offset TIMER     ;numeros de vector 10 y 11, arbitrarios
    mov word ptr ES:[10*4+2], cs
    mov word ptr ES:[11*4], offset TECLADO
    mov word ptr ES:[11*4+2], cs    
 
    sti
    ret
endp

TECLADO proc far   
    push es   
    push bx 
    push di
    push ax 
    push dx     
 
    mov dword ptr CS:[tics], 0   
 
    cmp byte ptr CS:[pantalleado], 0  
    ja noif   
 
    mov es, B000 
    mov bx  0800
    mov di, 0   
    mov ax, offset aux
 
    loop:     
    cmp di, 4000
    je finloop
    mov dl, cs:[ax+di]
    mov es:[bx+di], dl 
    inc di
    jmp loop
    finloop:
    mov byte ptr CS:[pantalleado], 1
 
    noif: 
    pop dx
    pop ax
    pop di
    pop bx
    pop es
    iret
endp

TIMER proc far    
    push es   
    push bx 
    push di
    push ax 
    push dx 
 
    inc cs:[tics]
    cmp dword ptr cs:[tics], 300000
    ja fin
    mov byte ptr cs:[pantalleado], 1   
 
    mov es, B000 
    mov bx  0800
    mov di, 0   
    mov ax, offset aux
 
    loop:
    cmp di, 4000
    je fin
    mov dx, es:[bx+di]  
    mov cs:[ax+di], dx
    mov es:[bx+di], 20h
    add di, 2      ; sumando de a dos, procesa cada word que corresponde a un caracter en pantalla
    jmp loop
    fin:
    pop dx
    pop ax
    pop di
    pop bx
    pop es
    iret
endp