Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1.3.1 Hardware.
1.3.2 Software.
Una interrupcin es una operacin que suspende la ejecucin de un programa de modo que
el sistema pueda realizar una accin especial. La rutina de interrupcin ejecuta y por lo
regular regresa el control al procedimiento que fue interrumpido, el cual entonces reasume
su ejecucin.
1.3.1.- Hardware.
Las interrupciones hardware ocurren cuando un dispositivo necesita atencin del
procesador y genera una seal elctrica en la lnea IRQ que tiene asignada. Esta seal
es recogida y procesada por el controlador de excepciones PIC antes de ser enviada al
procesador, lo que puede realizarse de dos formas, segn el tipo de interrupcin sea
enmascarable o no enmascarable.
Cuando se habla de una significa que, bajo control del software, el procesador puede
aceptar o ignorar (enmascarar) la seal de interrupcin. Para ello se enva una seal
a la patilla INTR, y el procesador la atiende o la ignora en funcin del contenido de un
bit (IF) en un registro (FLAGS) que puede estar habilitado o deshabilitado. En el
primer caso, cuando se recibe la seal, el procesador concluye la instruccin que
estuviese en proceso y a continuacin responde con una combinacin de seales en
algunas de sus patillas componiendo una sucesin de dos seales INTA ("Interrupt
Acknowledge".
El valor recibido (0-255) es multiplicado por 4 para calcular la direccin del vector
correspondiente en la tabla de vectores de interrupcin, lo que se realiza mediante un
desplazamiento binario de dos posiciones a la izquierda.
Interrupcin no enmascarable significa que la interrupcin no puede ser
deshabilitada por software. Este tipo de interrupciones ocurren cuando se recibe una
seal en la patilla NMI ("Nonmaskable Interrupt") del procesador. Se reservan para
casos en que es crtica la respuesta, por ejemplo que se detecte un error de paridad en
la memoria. Adems son de prioridad ms alta que las enmascarables.
Arriba.
1.3.2.- Software.
Los procesadores Intel de la gama x86 y compatibles, disponen de una
instruccin INT que permite generar por software cualquiera de los 256 tipos de
interrupcin anteriormente descritos. El proceso seguido es exactamente el mismo que
si se recibe una interrupcin hardware en la patilla INTR, salvo que en este caso se
conoce el tipo de interrupcin, y no se requiere ningn ciclo INTA.
FUNCIONES DE LA BIOS
Las funciones de la BIOS se invocan, desde los programas de usuario, ejecutando una
interrupcin software con un cierto valor inicial en los registros. La BIOS emplea un cierto
rango de interrupciones, cada una encargada de una tarea especfica:
El DOS emplea varias interrupciones, al igual que la BIOS; sin embargo, cuando se
habla de funciones del DOS, todo el mundo sobreentiende que se trata de llamar a la INT
21h, la interrupcin ms importante con diferencia.
Los cuatro campos de una sentencia son opcionales, si no aparece ninguno de ellos (una
lnea en blanco) tendramos una sentencia vaca.
* Instrucciones:
* Directivas:
Todos los ficheros fuente tienen que adecuarse a una estructura fija dividida en secciones.
AND (y lgico).
Realiza una operacin de Y lgico entre el operando origen y destino quedando el resultado
en el destino. Son vlidos operandos byte o palabra, pero ambos del mismo tipo.
Ejemplos:
AND AX, BX
AND BL, BYTE PTR ES:[SI+10H]
Realiza el complemento a uno del operando destino, invirtiendo cada uno de sus bits. Los
indicadores no resultan afectados.
Ejemplo:
NOT AX
OR (O lgico).
Realiza una operacin O lgico a nivel de bits entre los dos operandos, almacenndose
despus el resultado en el operando destino.
Ejemplo:
OR AX, BX
XOR (O exclusivo).
Operacin OR exclusivo a nivel de bits entre los operandos origen y destino almacenndose
el resultado en este ltimo.
Ejemplo:
XOR DI, AX
2.5.- Desplazamiento.
eal.
cular.
2.5.1- Lineal.
SHL (Desplazamiento lgico a la izquierda).
Desplaza a la derecha los bits del operando destino el nmero de los bits especificados en el
segundo operando. Los bits de la izquierda se llena con cero. Si el nmero de bits a
desplazar es 1 se puede especificar directamente en el caso en que no ocurra se pone el
valor en CL:
Arriba.
2.5..2- Circular.
RCL (Rotacin a la izquierda con acarreo).
Rotar a la izquierda los bits del operando destino junto con el indicador de acarreo CF el
nmero de bits especificado en el segundo operando. Si el nmero de bits a desplazar es 1,
se puede especificar directamente, en caso contrario el valor debe cargarse en CL y
especificar CL como segundo operando. No es conveniente que CL sea mayor de 7, en
bytes; 15, en palabras.
Rotar a la derecha los bits del operando destino junto con el indicador de acarreo CF el
nmero de bits especificado en el segundo operando. Si el nmero de bits es 1 se puede
especificar directamente; en caso contrario su valor debe cargarse en CL y especificar CL
como segundo operando:
Rota a la izquierda los bits del operando destino el nmero de bits especificado en el
segundo operando, que puede ser 1 CL previamente cargado con el valor del nmero de
veces.
Rota a la derecha los bits del operando destino el nmero de bits especificado en el segundo
operando. Si el nmero de bits es 1 se puede poner directamente, en caso contrario debe
ponerse a travs de CL.
2.6.- Procesos de Control.
2.6.1 Banderas.
2.6.2- Cadenas.
El procesador se detiene hasta que se restaura el sistema o se recibe una interrupcin. Como
en los PC se producen normalmente 18,2 interrupciones de tipo 8 por segundo (del
temporizador) algunos programadores utilizan HLT para hacer pausas y bucles de retardo.
Sin embargo, el mtodo no es preciso y puede fallar con ciertos controladores de memoria.
Es una instruccin que se utiliza en aplicaciones de recursos compartidos para asegurar que
no accede simultneamente a la memoria ms de un procesador. Cuando una instruccin va
precedida por LOCK, el procesador bloquea inmediatamente el bus, introduciendo una
seal por la patilla LOCK.
WAIT (Espera).
Provoca la espera del procesador hasta que se detecta una seal en la patilla TEST. Ocurre,
por ejemplo, cuando el coprocesador ha terminado una operacin e indica su finalizacin.
Suele preceder a ESC para sincronizar las acciones del procesador y coprocesador.
2.6.1 Banderas.
Las banderas proveen una manera de obtener informacin acerca de del estado actual de la
mquina y el resultado de procesamiento de una instruccin. La plataforma IA-32 utiliza un
registro de 32 bits llamado EFLAGS que contiene las banderas. Las banderas ms
comunmente usadas son las siguientes:
La bandera de signo muestra el bit ms significativo del resultado de una operacin, el cual
denota el signo del nmero.
Arriba.
2.6.2.- Cadenas.
CMPS/CMPSB/CMPSW (Compara cadenas).
Compara dos cadenas restando al origen el destino. Ninguno de los operandos se alteran,
pero los indicadores resultan afectados. La cadena origen se direcciona con registro SI
sobre el segmento de datos DS y la cadena destino se direcciona con el registro DI sobre el
segmento extra ES. Los registros DI y SI se autoincrementan o autodecrementan segn el
valor del indicador DF en una o dos unidades, dependiendo de si se trabaja con bytes o con
palabras. Cadena origen y cadena destino son dos operandos redundantes que slo indican
el tipo del dato (byte o palabra) a comparar, es ms cmodo colocar CMPSB o CMPSW
para indicar bytes/palabras. Si se indica un registro de segmento, ste sustituir en la cadena
origen al DS ordinario.
Ejemplo:
Transfiere un byte o una palabra de la cadena origen direccionada por DS:SI a la cadena
destino direccionada por ES:DI, incrementando o decrementando a continuacin los
registros SI y DI segn el valor de DF en una o dos unidades, dependiendo de si se trabaja
con bytes o con palabras. Cadena origen y cadena destino son dos operandos redundantes
que slo indican el tipo del dato (byte o palabra) a comparar, es ms cmodo colocar
MOVSB o MOVSW para indicar bytes/palabras. Si se indica un registro de segmento, ste
sustituir en la cadena origen al DS ordinario.
Ejemplo:
LEA SI, ORIGEN
LEA DI, DESTINO
MOVSW
Ejemplo:
LEA DI, DESTINO
MOV AX, 1991
STOSW
REP/REPE/REPZ/REPNE/REPNZ (Repetir).
En este artculo les voy a dejar los programas ms importantes que he hecho en
Ensamblador. La mayora de los programas eran tareas que me dio mi profesor en la
universidad.
org 100h
comienzo:
mov si, x
mov al, msg2[si]
cmp msg[si], al ;comparar letra por letra las cadenas, si uno no coincide
manda directamente a fin y termina el programa
jne fin:
cmp msg[si], "$" ;si es el final y el programa llega aca, quiere decir
que son iguales
jz final:
inc x
loop comienzo
final:
mov dx, offset msg3
mov ah, 9
int 21h
fin:
ret
msg db "hello world $"
msg2 db "hello world $"
msg3 db "Son iguales $"
x dw 0
org 100h
mov si, 0 ;ponemos si en 0
comienzo:
mov al, msg2[0] ;copiar la primera letra de la palabra a al
cmp msg[si],"$" ;si es el fin de la cadena mandar a final
jz final
cmp msg[si], al ;comparar si encuentra la primera letra de la cadena
jne seguir
seguir:
inc si ;para seguir recorriendo la palabra
loop comienzo ;bucle principal para recorrer palabra
resultado:
mov dx, offset msg3 ;copiar msg3 a dx
mov ah, 9 ;preparar ah con 9 para la interrupcion 21h
int 21h ;mostrar contenido en dx
final:
ret
msg db "Hola Mundo$"
msg2 db "ola$"
msg3 db "Si es subcadena$"
Ejercicio 3: Escribir un cdigo que verifique que todas los caracteres de una cadena se
encuentran en otra.
Por ejemplo: todas las letras de la cadena casa se encuentran en escaso. Pero no todas
las letras de cerro se en cuentran en recanate
org 100h
mov si, 0 ;ponemos si en 0
comienzo:
cmp msg[si],"$" ;si es el fin de la cadena mandar a final
jz resultado
seguir:
inc si ;para seguir recorriendo la palabra
loop comienzo ;bucle principal para recorrer palabra
resultado:
mov dx, offset msg3 ;copiar msg3 a dx
mov ah, 9 ;preparar ah con 9 para la interrupcion 21h
int 21h ;mostrar contenido en dx
final:
ret
msg db "cerro$"
msg2 db "recanate$"
msg3 db "Si se encuentran todos los caracteres$"
Ejercicio 4: Escribir una programa que reciba una cadena ingresada por teclado, terminada
en ENTER. Luego que elimine todos los caracteres que no son dgitos, sin utilizar una
variable auxiliar.
ORG 100H
mov si, 0
lectura:
mov ah,1
int 21h
cmp al,13
jz resultado:
cmp al, 57 ;si tecla es mayor a 57 entonces ir a fin3 (tecla > 57)
ja fin3
cmp al,47 ;si tecla no es mayor a 47 ir a fin3 (tecla <= 47)
jng fin3
mov bx[si], al ;si es un digito entonces guardo en bx
inc si ;incrementa si
fin3:
jmp lectura
resultado:
mov ah,00h ;limpia la pantalla
mov al,03h
int 10h
mov bx[si], "$"
mov dx, offset bx
mov ah, 9 ;preparar ah con 9 para la interrupcion 21h
int 21h ;mostrar contenido en dx
ret
Ejercicio 5: Escribir un programa que tome una cadena que representa un nmero decimal
y escriba su equivalente octal
cadAnum:
cmp cad[si], "$"
jz seguir
mov bl, 10
mul bl
sub cad[si], '0'
add al, cad[si]
inc si
loop cadAnum
seguir:
mov cx, si
mov si, 0
mov bl, 8
pasar:
div bl ;dividir al con bl
mov oct[si], ah ;copiar a la cadena oct el resultado sobrante de la
division
inc si ;incrementar si
loop pasar
fina:
cmp ah, 0
jnz final
mov oct[si], al
final:
;mov dx, offset res
;mov ah, 9 ;preparar ah con 9 para la interrupcion 21h
;int 21h ;mostrar contenido en dx
ret
cad db "64$"
oct db 0
mov bl, 10
mul bl
sub cad1[si], '0'
add al, cad1[si]
inc si
loop cadAnum
seguir:
mov aux1, al
;Convertir segunda cadena a numero
mov si, 0
mov al, 0
cadAnum2:
cmp cad3[si], "$"
jz seguir2
mov bl, 10
mul bl
sub cad3[si], '0'
add al, cad3[si]
inc si
loop cadAnum2
seguir2:
mov bl, al
mov al, aux1
;realizar operaciones normalmente teniendo ya los dos numeros decimales
cmp cad2, "-"
jz resta
cmp cad2, "+"
jz suma
cmp cad2, "*"
jz multi
cmp cad2, "/"
jz divi
resta:
sub al, bl
jmp fin
suma:
add al, bl
jmp fin
multi:
mul bl
jmp fin
divi:
div bl
jmp fin
fin:
mov bx, ax
mov ah,09
lea dx,msg
int 21h
mov ax, bx
call PRINT_NUM
ret
cad1 db "10$"
cad2 db "-"
cad3 db "2$"
aux1 db ?
aux2 dw ?
msg dw "El resultado es: $"
Ejercicio 7: Escribir un programa que imprima X en la pantalla hasta que se presiones
ESC.
name "keybrd"
org 100h
; print a welcome message:
mov dx, offset msg
mov ah, 9
int 21h
;============================
; eternal loop to get
; and print keys:
wait_for_key:
; check for keystroke in
; keyboard buffer:
mov dh, pos
mov dl, pos
mov bh, 0
mov ah, 2
int 10h ;Movemos el cursor
mov al,'X'
mov bh,0
mov bl,1
mov cx,1
mov ah,09h
inc pos ;Imprimimos una x
int 10h
mov ah, 1
int 16h
jz wait_for_key
; get keystroke from keyboard:
; (remove from the buffer)
mov ah, 0
int 16h
; print the key:
mov ah, 0eh
int 10h
; press 'esc' to exit:
cmp al, 1bh
jz exit
jmp wait_for_key
;============================
exit:
ret
msg db "Type anything...", 0Dh,0Ah
db "[Enter] - carriage return.", 0Dh,0Ah
db "[Ctrl]+[Enter] - line feed.", 0Dh,0Ah
db "You may hear a beep", 0Dh,0Ah
db " when buffer is overflown.", 0Dh,0Ah
db "Press Esc to exit.", 0Dh,0Ah, "$"
pos db 1
end
name "arreglo-mayor"
org 100h
mov cx, 8
bucle1:
mov c, cx
mov bx, cx
mov cx, 9
bucle2:
mov si, cx
mov ah, v[si-1]
cmp ah,v[bx-1]
jnge seguir ;Si v[8] < v[7] no hacer nada, sino:
mov dh, v[bx-1] ;Copiar v[7] en dh
mov dl, v[si-1] ;Copiar v[8] en dl
mov v[bx-1], dl ;Copiar dl en v[7]
mov v[si-1], dh ;Copiar dh en v[8]
seguir:
loop bucle2
mov cx, c
loop bucle1
ret
v db 2,32,64,32,98,12,5,21,91
c dw 0
mov cx,1
mov al, 13h
mov ah, 0
int 10h ; set graphics video mode.
bucle1:
mov dx, cx
mov al, color ;AL = pixel color
mov ah, 0ch ;Change color for a single pixel
int 10h ;set pixel
Ejercicio 11: Escribir un programa que lea un archivo y cuente cuantas palabras terminan
con la letra a.
name "archivo3"
org 100h
mov al, 0 ;modo de acceso para abrir arhivo, modo lectura/escritura
mov dx, offset archivo ;offset lugar de memoria donde esta la variable
mov ah, 3dh ;se intenta abrir el archivo
int 21h ;llamada a la interrupcion DOS
jc error ; si se prendio la bandera c ir a error
error:
; ....
;leer archivo
leer:
mov bx, handle
mov cx, 1
mov dx, offset leido
mov ah, 3fh
int 21h
mostrar:
cmp aux, "a" ;compara si el anterior es a
jnz abajo
abajo:
mov aux, dl ;guardar en aux lo que hay en dl para comparar en la proxima
vuelta
jmp leer
FIN:
;cerramos archivo
mov bx, handle
mov ah, 3eh
int 21h
ret