Unidad 4 - 4.2 ACCESO A DISCOS EN LENGUAJE ENSAMBLADOR
El acceso a discos desde ensamblador es complejo y requiere que se entiendan varios conceptos para poder utilizarlo.
El primero es que para poder escribir o leer desde un disco, se tiene que realizar en bloques de bytes y no byte por byte ya que el acceso implica movimientos mecánicos del disco y que la información en él se almacena por sectores. El proceso de acceso a disco no es llevado a cabo por la UCP, ésta solo envía comandos a la interfaz que maneja la unidad de disco, la cual se encarga de leer o escribir información del área de acceso directo a memoria o DMA (Direct Memory Access), la cual es un espacio de memoria especial para estos procesos.
El segundo concepto importante es cómo está constituido un disco de almacenamiento. Los discos están conformados físicamente por discos a los que se les denomina caras, los cuales estan divididos en anillos concéntricos a los cuales se les denomina pistas (track) y está dividido en un numero determinado de sectores, los cuales son divisiones de las pistas, ver Figura 4.2.1.
Figura 4.2.1.
En las siguientes páginas se presentan tres formas de utilizar el acceso a discos, siendo la primera lectura, la segunda escritura y la tercera calcular espacio libre en un disco.
AbsoluteRead:
Transfiere el contenido de uno o mas sectores del disco al buffer especificado, accesando directamente a los sectores lógicos. En caso de error, se enciende el bit de acarreo y AX contiene el código de error.
_AbsoluteRead PROC NEAR
ARG Buffer:DWORD,
Start:WORD,NumSect:WORD,
Drive:BYTE= ArgLen → Inicializar búfer.
Start:WORD,NumSect:WORD,
Drive:BYTE= ArgLen → Inicializar búfer.
push bp → Almacenar en pila.
mov bp,sp → Almacenar valor bp.
push bx → Permitir acceso a los argumentos.
push cx → Salvar registros.
push dx → Salvar registros.
push ds → Salvar registros.
mov al,Drive → Mover valor de Drive a al.
mov cx,NumSect → Mover valor de NumSect a cx.
mov dx,Start → Mover valor de Start a dx.
lds bx,Buffer → Preparar para lectura.
int 25h → Ejecutar Interrupción 25h para lectura absoluta.
pop bx → Quitar de la pila valor de bx.
pop ds → Quitar de la pila valor de ds.
pop dx → Recuperar registros.
pop cx → Recuperar registros.
pop bx → Recuperar registros
pop bp → Recuperar registros.
ret ArgLen → Directiva de retorno.
_AbsoluteRead ENDP → Fin del procedimiento _AbsoluteRead
_AbsoluteWrite:
Transfiere el contenido del búfer especificado a uno o más sectores de disco, accesando directamente a los sectores lógicos. En caso de error, se enciende el bit de acarreo y AX contiene el código de error.
_AbsoluteWrite PROC NEAR
ARG Buffer:DWORD,Start:WORD,NumSect:WORD,Drive:BYTE= ArgLen à Inicializar búfer.
push bp → Almacenar en pila.
mov bp,sp → Almacenar valor bp.
push bx → Permitir acceso a los argumentos.
push cx → Salvar registros.
push dx → Salvar registros.
push ds → Salvar registros.
mov al,Drive → Mover valor de Drive a al.
mov cx,NumSect → Mover valor de NumSect a cx.
mov dx,Start → Mover valor de Start a dx.
lds bx,Buffer → Preparar para escritura
int 26h → Ejecutar Interrupción 26h para escritura absoluta.
pop bx → Quitar de la pila valor de bx.
pop ds → Quitar de la pila valor de ds.
pop dx → Recuperar registros.
pop cx → Recuperar registros.
pop bx → Recuperar registros
pop bp → Recuperar registros.
ret ArgLen → Directiva de retorno.
_AbsoluteWrite ENDP → Fin del procedimiento _AbsoluteWrite
_FreeDiskSpace:
Devuelve en DX:AX el espacio libre en disco, expresado en Kilobytes. En caso de error, se enciende el bit de acarreo.
_FreeDiskSpace PROC NEAR
ARG Drive:BYTE= ArgLen → Inicializar.
push bp → Mover bp a pila.
mov bp,sp → Salvar bp.
push bx → Permitir acceso a los argumentos.
push cx → Salvar registros.
mov ah,36h → Cargar servicio 36h al registro ah.
mov dl,Drive → Preparar para ejecución.
int 21h → Ejecutar servicio 36h de la interrupción 21h.
mul cx → Multiplicar por el valor en cx.
mov cx,1024 → Asignar 1024 a cx.
div cx → Dividir entre cx para obtener el resultado en Kb.
mul bx → Obtener espacio libre.
pop cx → Quitar cx de la pila.
pop bx → Recuperar registros.
pop bp → Recuperar registros.
ret ArgLen → Directiva de retorno.
_FreeDiskSpace → Fin del procedimiento.
Comentarios
Publicar un comentario