Arquitectura de Computadoras 2
Foro para conocer el avance del curso y compartir comentarios, dudas y aportaciones para todos los participantes del mismo.
Acerca de mí
- Nombre: Dr. Sergio Castillo
- Ubicación: Xalapa, Veracruz, Mexico
Profesor universitario en el área de las ciencias de la computación. Doctor en Ciencias de la Computación, Maestro en Ciencias Computacionales e Ingeniero en Electrónica y Comunicaciones.
viernes, septiembre 30, 2005
En la sesión de hoy realizaron la Práctica 3: Interrupciones del BIOS, donde aplican e investigan los datos de algunas interrupciones del BIOS.
jueves, septiembre 29, 2005
Sesión del Jueves 29 de Septiembre
En la sesión de hoy seguimos estudiando algunas interrupciones del BIOS. Les escribí en el pizarrón la infomación de varias interrupciones del BIOS e ilustre su uso con un programa que limpia la pantalla usando varias opciones de Int 10:
; Archivo: limppant.asm
; Usa Int 10h,0f para obtener estado actual de video
; Int 10,6 para limpiar la pantala, Int 10h,2 para colocar
; cursor en (0,0)
pp segment stack 'stack'
db 512 dup (?)
pp ends
cc segment 'code'
assume ss:pp, cs:cc
Inicio:
mov ah,06 ; Limpia la pantalla
mov al,0
mov bh,07 ; Atributo 0
mov ch,0 ; Esq Sup Izq = (0,0)
mov cl,0
mov dh,24 ; Esq Inf Der= (24,79)
mov dl,79
int 10h
mov ah,0fh ; Obtiene estado de video
int 10h
mov ah,2 ; Coloca cursor
mov dh,0 ; en (0,0)
mov dl,0
int 10h
mov ax,4c00h ; Termina
int 21h
cc ends
end Inicio
martes, septiembre 27, 2005
Sesión del Martes 27 de Septiembre
En la sesión de hoy empezamos a estudiar las interrupciones de software, y más específicamente las interrupciones del BIOS. Desde el punto de vista de programación, las interrupciones de software son llamadas a rutinas prefabricadas. Por tanto es necesario contar con la información del fabricante para poder utilizarlas. Les recomiendo la refererencia Help PC para obtener información sobre las interrupciones de software de la PC.
Ejemplo de uso de Interrupciones de BIOS
Para dibujar un punto se puede seguir la siguiente secuencia:
Expliqué el siguiente programa que dibuja un punto en el centro de la pantalla siguiendo los pasos arriba mencionados a manera de ejemplo para ilustrar el manejo de las interrupciones:
Ejemplo de uso de Interrupciones de BIOS
Para dibujar un punto se puede seguir la siguiente secuencia:
- Cambiar a modo gráfico
- Dibujar punto
- Esperar por cualquier tecla
- Regresar a modo texto
- Terminar
Expliqué el siguiente programa que dibuja un punto en el centro de la pantalla siguiendo los pasos arriba mencionados a manera de ejemplo para ilustrar el manejo de las interrupciones:
; Archivo: punto.asmA manera de ejercicio les pedí 2 modificaciones al mismo:
; Dibuja un punto en el centro de la pantalla
; --------------------------------------------
pila segment stack 'stack'
db 512 dup(?)
pila ends
prog segment 'code'
assume ss:pila,cs:prog
inicia:
mov ah,0 ; Prepara Int 10h/0
mov al,13h ; Cambia a Modo 320x200, 256 colores
int 10h
mov ah,0ch ; Prepara Int 10h/0ch
mov dx,100 ; RC(100,160)
mov cx,160
mov al,0fh ; Color = 0fh
int 10h ; Dibuja pixel
mov ah,0 ; Prepara Int 16h/0
int 16h ; Espera por cualquier tecla
mov ah,0 ; Regresa a modo texto 80x25 color
mov al,3
int 10h
mov ax,4c00h ; Regresa a DOS.
int 21h
prog ends
end inicia
- Modificar para que espere por la tecla 'q' o 'Q' y entonces continúe su ejecución.
- Modificarlo para que despliegue una cruz que cruce en el centro de la pantalla.
viernes, septiembre 23, 2005
Sesión del Viernes 23 de Septiembre
En la sesión de hoy realizaron la Práctica 2 Captura, ensamble y ligado de programas en MASM. Como comentamos en clases anteriores, los pasos para la programación en ensamblador son:
- Captura de programa en un editor de textos.
- Ensamblar el programa con MASM.
- Ligar el programa con LINK.
- Probar la ejecución del programa.
jueves, septiembre 22, 2005
Sesión del Jueves 22 de Septiembre
En la breve sesión de esta tarde les expliqué la instrucción
RCL: Rotación a la izquierda con la Bandera de Acarreo (Carry Flag, CF)
Comenté que el manejo de las Entradas y Salidas de la aquitectura de la PC está basado en el código ASCII.
Mostré una parte de la tabla del código ASCII para los dígitos numéricos (0 = 30h, 1 = 31h,..., 9= 39H).
Describí brevemente el funcionamiento de las interrupciones de DOS Int 21h/2 e Int 21h/4ch.
Finalmente expliqué el funcionamiento del siguiente programa que despliga un número en binario, esto es despliega una secuencia de 1's y 0's.
RCL: Rotación a la izquierda con la Bandera de Acarreo (Carry Flag, CF)
Comenté que el manejo de las Entradas y Salidas de la aquitectura de la PC está basado en el código ASCII.
Mostré una parte de la tabla del código ASCII para los dígitos numéricos (0 = 30h, 1 = 31h,..., 9= 39H).
Describí brevemente el funcionamiento de las interrupciones de DOS Int 21h/2 e Int 21h/4ch.
Finalmente expliqué el funcionamiento del siguiente programa que despliga un número en binario, esto es despliega una secuencia de 1's y 0's.
; Archivo: binario.asm
; Despliega un byte en binario
; Utiliza Int 21h/2
pila segment stack 'stack'
DB 512 dup (?)
pila ends
prog segment 'code'
assume cs:prog,ss:pila
Inicio:
mov bl,125 ; numero a desplegar
mov cx,0 ; Limpia el contador
m1: cmp cx,8 ; Mientras (CX < 8)
jge finm1
mov ah,2 ; Prepara despliege de caracter
mov dl,30h ; Caracter = '0'
rcl bl,1 ; CF = bit mas significativo de BL
adc dl,0 ; Caracter = Caracter + CF
int 21h ; Despliega caracter
inc cx ; Actualiza Contador
jmp m1 ; Fin_mientras
finm1:
mov ax,4c00h ; Llama a DOS para terminar el programa
int 21h
prog ends
end Inicio
martes, septiembre 20, 2005
Sesión del Martes 20 de Septiembre
En la sesión de hoy vimos una introducción al MacroAssembler de Microsoft.
Vimos que todo programa en ensamblador tiene 3 bloques:
También vimos que todo programa está compuesto de:
Posteriormente presenté y expliqué el siguiente programa ejemplo:
Finalmente hablé del procedimiento de programación en ensamblador:
Para reforzar estos temas les recomiendo esta referencia y también esta otra referencia.
Vimos que todo programa en ensamblador tiene 3 bloques:
- Segmento o sección de pila.
- Segmento o sección de datos, y
- Segmento o sección de código.
También vimos que todo programa está compuesto de:
- instrucciones,
- directivas o pseudoinstrucciones, y
- objetos (que pueden ser constantes, variables y etiquetas)
Posteriormente presenté y expliqué el siguiente programa ejemplo:
; hola.asm
; Despliega una cadena en pantalla
Pila segment stack 'stack'
db 512 dup(?) ; Reserva 512 bytes para la pila
Pila ends
Datos segment 'data'
msje db "Hola Mundo desde MacroAssembler!!!",10,13,"$"
Datos ends
Prog segment 'code'
assume cs:Prog, ds:Datos, ss:Pila
Inicio:
mov ax,Datos ; Inicializa DS
mov ds,ax
mov ah,9 ; Utilizamos DOS
mov dx, offset msje ; Para desplegar una cadena
int 21h
mov ax,4c00h ; Utilizamos DOS para
int 21h ; terminar el programa
Prog ends
end Inicio
Finalmente hablé del procedimiento de programación en ensamblador:
- Capturar programa en un editor de texto
- Ensambladr el código fuente (traducir a lenguaje máquina)
- Ligar para generar el ejecutable
Para reforzar estos temas les recomiendo esta referencia y también esta otra referencia.
viernes, septiembre 09, 2005
Sesión del Viernes 9 de Septiembre
En la sesión de hoy realizaron la práctica 1
que trata sobre la conversión de ensamblador a lenguaje máquina, tanto de instrucciones sueltas como de un par de programas con instrucciones de control de flujo (loop y saltos condicionales e incondicionales).
que trata sobre la conversión de ensamblador a lenguaje máquina, tanto de instrucciones sueltas como de un par de programas con instrucciones de control de flujo (loop y saltos condicionales e incondicionales).
jueves, septiembre 08, 2005
Sesión del Jueves 8 de Septiembre
En la sesión de hoy les presenté la conversión de un programa en lenguaje ensamblador a lenguaje máquina.
Pueden consultar estos apuntes de la sesión
Pueden consultar estos apuntes de la sesión
martes, septiembre 06, 2005
Sesión del Martes 6 de septiembre
En la sesión de hoy empezamos a estudiar la conversión de ensamblador a lenguaje máquina. Para esto usamos esta guía, que también está direccionada en la página del curso.
Realizaron por equipos el Ejercicio 3:
Realizaron por equipos el Ejercicio 3:
Ejercicio 3.
Convierte a lenguaje máquina las siguientes instrucciones en ensamblador:
1. or ax,cx
2. add cx,cx
3. mul bl
4. mul cx
5. div bx
6. mov ch,[bx+5]
viernes, septiembre 02, 2005
Sesión del Viernes 2 de septiembre
En la sesión de hoy conocimos el programa debug. Este programa nos permite:
Para esta clase me apoyé en esta presentación. Para conocer mejor el debug les recomiento este tutorial.
- Introducir instrucciones en lenguaje máquina
- Introducir programas en un ensamblador básico
- Trazar programas
- Desplegar el contenido de la memoria, entre otras funciones.
Para esta clase me apoyé en esta presentación. Para conocer mejor el debug les recomiento este tutorial.
jueves, septiembre 01, 2005
Sesión del Jueves 1 de Septiembre
En la sesión de hoy les presenté las soluciones para los ejercicios de aplicación del conjunto de instrucciones de los procesadores Intel x86. Estas propuestas de solución son las siguentes:
Solución Problema 1Posteriormente comentamos algunos ejemplos del manejo en bajo nivel de operaciones aritméticas como las siguientes:
mov ax,1000
mov bx,40h
mov es,bx
rep1: ; Repite
dec ax
mov cx,[es:17h]
bt cx,3 ; Hasta (Bit 3 de CX = 1)
jc Fin
cmp ax,0 ; OR (AX = 0)
jne rep1
Fin:
Solución Problema 2
mov ax,1000
mov bx,40h
mov es,bx
rep1: ; Repite
dec ax
mov cx,[es:17h]
bt cx,3 ; Hasta (Bit 3 de CX = 1)
jnc rep1
cmp ax,0 ; AND (AX = 0)
je rep1
Fin:
Solución Problema 3
mov bx,40h
mov es,bx
mov bx,[es:08]
cmp bx,0 ; Si (BX = 0)
je Fin ; jmp Fin
inc bx ; Sino inc bx
m1: ; Mientras (Bit 1 de [es:bx]=1
bt [es:bx],1
jnc Fin
jmp m1 ; Fin Mientras
mov ax,1 ; AX = 1
Solución Problema 4
mov bx,0b800h
mov es,bx
mov di,0
mov al,"a"
rep1: ; repite
mov [es:di],al
add di,2
inc al
cmp al,"z" ; Hasta (AL > "z")
jle rep1
i) ax = 10Las dificultades que nos presentan estas operaciones se deben al hecho de que las operaciones que nos proponen (cx = ax * bx y ax = bx + cx + dx) son instrucciones muy adecuadas para máquinas con instrucciones de 3 direcciones, pero los procesadores Intel tienen mayormente instrucciones con 2 direcciones, por lo que uno de los operandos es a la vez operando y destino, y en los pseudocódigos anteriores tanto en la multiplicación como en la suma, el destino es distinto a los operandos. Además, se debe cumplir que los operandos a la derecha del signo "=" no deben alterarse.
bx = 15
cx = ax * bx
ii) bx = 100
cx = 452
dx = 109
ax = bx + cx + dx