Que podemos hacer con solo dos ordenes?: cambiar de modo de video. Cuando arranca la maquina , generalmente queda en modo de video 03 (texto blanco y negro).Como hay pocas Interrupciones, se dividen en FUNCIONES y a veces hasta en subfunciones. O sea, hay una interrupcion 10 que se encarga del video, y dentro de esta hay muchas funciones. Como le informo a la maquina que funcion voy a usar? Cargo el registro AH con el numero de funcion. Ahora vamos a cambiar el modo de video por el 00 Vamos a usar la interrupcion 10 funcion 00 MOV AH,00 ;pongo en AH el # de funcion MOV AL,00 ;pongo en AL el numero de modo de video INT 10 ;ejecuto la interrupcion INT 20 ;salgo al DOS Bien, hay muchos ejemplos triviales como estos, pero no hay mucha emocion si no hay bifurcaciones en el programa. Del mismo modo que en Basic existen ordenes como GOSUB y GOTO, en el assembler tenemos las ordenes CALL y JMP. Hacen lo mismo, solo que en vez de estar referidos los saltos a numeros de linea del programa, estan referidos a posiciones de memoria. Basic: Assembler: 10 GOTO 1000 JMP 1000 20 GOSUB 2000 CALL 2000 30 END INT 20 1000 2000 RETURN RET JMP es una abreviatura de jump (saltar), call es llamar la rutina a la que se llama con call siempre tiene que terminar con ret cuyo efecto es volver a donde se lo llamo. jmp salta a otro lugar del programa pero no vuelve. Claro que, con estos saltos absolutos mucho no se puede hacer: en assembler existen saltos relativos, es decir un jump que se produce solo cuando se cumple determinada condicion, condicion que esta relacionada con la ultima operacion aritmetica o logica realizada y que es almacenada en el registro de flags, que hemos visto previamente. Que carajo quiere decir esto? suponte que quiero hacer una rutina 10 veces: como hago? es facil: cargo un registro con el numero 10 decimal (ojo 10d=Ah), llamo a la rutina, veo si llegue a cero (en cuyo caso el flag zero se pone a 1), si llegue a cero salto al lugar donde sigue el programa, sino vuelvo a llamar a la rutina: esto en basic se llama (creo) lazo do-while, y es mas facil de entender si lo comparamos con basic: Basic Assembler 100 c=10 mov cl, A 110 c=c-1 dec cl 120 if c=0 goto 140 jz 140 ;es un decir, 130 goto 110 jmp 110 ;va una direccion 140 end int 20 aca aparece una instruccion nueva DEC que consiste en decrementar en 1 el valor del registro, lo contrario es INC, incrementar en uno. Tambien existen add registro, numero que suma un numero al registro, adc reg, # que suma con carry un numero al registro y los contrarios sub (restar) y sbc (restar con carry) en cuanto a los saltos relativos: jz salto si cero salta si el ultimo resultado fue 0 jnz salto sino cero salta si el ultimo resultado fue<>0 jb salto si menor (estos tienen que seguir a una compa ja salto si mayor -racion con determinado valor o re- je salto si igual gistro) jae si menor o igual (es igual a jb) etc.(luego les hago una lista mas completas de todas las ordenes en assembler.) a ver si se entiende mejor con un ejemplo: mov ah,0 ;funcion 0 mov al,04 ;modo grafico 4, 4 colores int 10 ;pongo en modo grafico 320x200 mov cx,0 ;columna 0 mov dx,20 ;fila 20 opix call pixel ;llamo a la rutina que escribe un . inc cx ;proxima columna cmp cx, 0270 ;llegue a la columna 270? jne opix ;si no llegue, otro pixel int 20 ;si llegue, salgo al dos pixel mov ah,0c ;funcion escribir el pixel mov al,2 ;valor del pixel (color 0-3) mov bh,0 ;pagina de video (hay varias) int 10 ;ejecuto la interrupcion ret ;vuelvo de la rutina Hace una linea horizontal desde la linea 20h, columna 0 hasta la linea 20h, columna 0270h. las etiquetas opix y pixel deberian ser (para compilar con debug) reemplazadas con las direcciones correspondientes a los lugares donde caen dichas rutinas (se entiende?) si prueban a cambiar los distintos valores y ver que pasa, van a aprender mas que si yo se los explico. (continuara?) "No tire su vieja computadora: donela al museo de computacion!"