Lenguaje
ensamblador
Formato de instrucciones para lenguaje ensamblador:
Directivas de segmento
Nombre_procedimiento
PROC
Instrucción operando destino, operando fuente
Nombre_procedimiento
ENDP
END
; comentarios
MOV
Transfiere datos entre celdas de memoria y registros.
Sintaxis: MOV
Destino,Fuente
Ejemplo:
MOV AX,0006h
MOV DX,AX
Mueve cadenas de bytes o palabras desde la fuente, direccionada por SI,
hasta el destino direccionado por DI.
Sintaxis: MOVS
Este comando no necesita parametros ya que toma como dirección fuente
el contenido del registro SI y como destino el contenido de DI.
Ejemplo:
MOV SI, OFFSET VARIABLE1
MOV DI, OFFSET VARIABLE2
MOVS
Primero se inicializan los valores de SI y DI con las direcciones de
las variables VARIABLE1 y VARIABLE2 respectivamente, despues al ejecutar MOVS
se copia el contenido de VARIABLE1 a VARIABLE2.
Los comandos MOVSB y MOVSW se utilizan de la misma forma que MOVS, el
primero mueve un byte y el segundo una palabra.
Carga cadenas de un byte o palabra al acumulador.
Sintaxis: LODS
Toma la cadena que se encuentre en la dirección especificada por SI, la
carga al registro AL (o AX) y suma o resta 1 (segun el estado de DF) a SI si la
transferencia es de bytes o 2 si la transferencia es de palabras.
Ejemplo:
MOV SI, OFFSET VARABLE1
LODS
La primer linea carga la dirección de VARIABLE1 en SI y la segunda
linea lleva el contenido de esa localidad al registro AL.
Los comandos LODSB y LODSW se utilizan de la misma forma, el primero
carga un byte y el segundo una palabra (utiliza el registro completo AX).
Transfiere al registro AH el contenido de las banderas
Sintaxis: LAHF
Se utiliza para verificar el estado de las banderas durante la
ejecución de un programa.
Las banderas quedan en el siguiente orden dentro del registro:
SF ZF __ AF __ PF __ CF
Carga la dirección del operando fuente.
Sintaxis: LEA
destino, fuente
El operando fuente debe estar ubicado en memoria, y se coloca su
desplazamiento en el registro índice o apuntador especificado en destino.
Ejemplo:
MOV SI, OFFSET VAR1
Que es equivalente a:
LEA SI, VAR1
Recupera un dato de la pila
Sintaxis: POP destino
Transfiere el último valor almacenado en la pila al operando destino y
despues incrementa en dos el registro SP.
Este incremento se debe a que la pila va creciendo desde la dirección
mas alta de memoria del segmento hacia la mas baja, y la pila solo trabaja con
palabras (2 bytes), entonces al incrementar en dos el registro SP realmente se
le esta restando dos al tamaño real de la pila.
Extrae las banderas almacenadas en la pila.
Sintaxis: POPF
Transfiere bits de la palabra almacenada en la parte superior de la
pila hacia el registro de banderas.
La forma de transferencia es la siguiente:
BIT BANDERA 0 CF ___ 2 PF ___ 4 AF
___ 6 ZF 7 SF 8
TF 9 IF 10 DF 11 OF
Estas localizaciones son las mismas para el comando PUSHF
Una vez hecha la transferencia se incrementa en 2 el registro SP
disminuyendo así el tamaño de la pila.
Coloca una palabra en la pila.
Sintaxis: PUSH fuente
La instrucción PUSH decrementa en dos el valor de SP y luego transfiere
el contenido del operando fuente a la nueva dirección resultante en el registro
recién modificado.
El decremento en la dirección se debe a que al agregar valores a la
pila ésta crece de la dirección mayor a la dirección menor del segmento, por lo
tanto al restarle 2 al valor del registro SP lo que hacemos es aumentar el
tamaño de la pila en dos bytes, que es la única cantidad de información que
puede manejar la pila en cada entrada y salida de datos.
Coloca el valor de las banderas en la pila
Sintaxis: PUSHF
Decrementa en 2 el valor del registro SP y luego se transfiere el
contenido del registro de banderas a la pila, en la dirección indicada por SP.
Las banderas quedan almacenadas en memoria en los mismos bits indicados
en el comando POPF
Instrucciones
lógicas
Realiza la conjunción de los operandos bit por bit.
Sintaxis: AND
destino, fuente
Con esta instrucción se lleva a cabo la operación "y" lógica
de los dos operandos:
Fuente |
Destino |
Resultado en operando
destino |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
Genera el complemento a 2
Sintaxis: NEG destino
Genera el complemento a 2 del operando destino y lo almacena en este
mismo operando.
Ejemplo, si AX guarda el valor de –2 (FFFE), entonces:
NEG AX
Dejaría como resultado en AX el valor 0002.
Lleva a cabo la negación bit por bit del operando destino.
Sintaxis: NOT destino
El resultado se guarda en el mismo operando destino.
OR inclusivo lógico
Sintaxis: OR destino, fuente
La instrucción OR lleva a cabo, bit por bit, la disyunción inclusiva
lógica de los dos operandos:
Fuente |
Destino |
Resultado en operando
destino |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
Compara logicamente los operandos
Sintaxis: TEST destino, fuente
Realiza una conjunción, bit por bit, de los operandos, pero a
diferencia de AND esta instrucción no coloca el resultado en el operando
destino, solo tiene efecto sobre el estado de las banderas.
OR exclusivo
Sintaxis: XOR
destino, fuente
Su función es efectuar bit por bit la disyunción exclusiva lógica de
los dos operandos.
Fuente |
Destino |
Resultado en operando
destino |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
Adición con acarreo.
Sintaxis: ADC
destino, fuente
Lleva a cabo la suma de dos operandos y suma uno al resultado en caso
de que la bandera CF esté activada, esto es, en caso de que exista acarreo.
El resultado se guarda en el operando destino.
Adición de los operandos.
Sintaxis: ADD
destino, fuente
Suma los dos operandos y guarda el resultado en el operando destino.
División sin signo
Sintaxis: DIV
fuente
El divisor puede ser un byte o palabra y es el operando que se le da a
la instrucción.
Si el divisor es de 8 bits se toma como dividendo el registro de 16
bits AX y si el divisor es de 16 bits se tomara como dividendo el registro par
DX:AX, tomando como palabra alta DX y como baja AX.
Si el divisor fué un byte el cociente se almacena en el registro AL y
el residuo en AH, si fué una palabra el cociente se guarda en AX y el residuo
en DX.
División con signo
Sintaxis: IDIV
fuente
Consiste basicamente en lo mismo que la instrucción DIV, solo que esta
última realiza la operación con signo.
Multiplicación sin signo
Sintaxis: MUL
fuente
El ensamblador asume que el multiplicando sera del mismo tamaño que el
del multiplicador, por lo tanto multiplica el valor almacenado en el registro
que se le da como operando por el que se encuentre contenido en AH si el
multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits.
Cuando se realiza una multiplicación con valores de 8 bits el resultado
se almacena en el registro AX y cuando la multiplicación es con valores de 16
bits el resultado se almacena en el registro par DX:AX.
Multiplicación de dos enteros con signo.
Sintaxis: IMUL
fuente
Este comando hace lo mismo que el anterior, solo que si toma en cuenta
los signos de las cantidades que se multiplican.
Los resultados se guardan en los mismos registros que en la instrucción
MUL.
Sbstracción con acarreo
Sintaxis: SBB
destino, fuente
Esta instrucción resta los operandos y resta uno al resultado si CF
está activada. El operando fuente siempre se resta del destino.
Este tipo de substracción se utiliza cuando se trabaja con cantidades
de 32 bits.
Substracción
Sintaxis: SUB
destino, fuente
Resta el operando fuente del destino.
Salto incondicional
Sintaxis: JMP
destino
Esta instrucción se utiliza para desviar el flujo de un programa sin
tomar en cuenta las condiciones actuales de las banderas ni de los datos.
Sintaxis: JA
Etiqueta
El salto se realiza solo si la bandera CF esta desactivada o si la
bandera ZF esta desactivada (que alguna de las dos sea igual a cero).
Sintaxis: JAE
etiqueta
El salto se efectua si CF esta desactivada.
Sintaxis: JB
etiqueta
Se efectúa el salto si CF esta activada.
Sintaxis: JBE
etiqueta
El salto se efectúa si CF está activado o si ZF está activado (que
cualquiera sea igual a 1).
Sintaxis: JE
etiqueta
El salto se realiza si ZF está activada.
Sintaxis: JNE
etiqueta
El salto se efectua si ZF está desactivada.
Sintaxis: JG
etiqueta
El salto ocurre si ZF = 0 u OF = SF.
Sintaxis: JGE
etiqueta
El salto se realiza si SF = OF
Sintaxis: JL
etiqueta
El salto se efectúa si SF es diferente a OF.
Sintaxis: JLE
etiqueta
El salto se realiza si ZF = 1 o si SF es diferente a OF
Sintaxis: JC
etiqueta
Salta si hay acarreo. El salto se realiza si CF = 1
Sintaxis: JNC
etiqueta
Salta si no hay acarreo. El salto se efectúa si CF = 0.
Sintaxis: JNO
etiqueta
Salta si no hay desbordamiento. El salto se efectua si OF = 0.
Sintaxis: JNP
etiqueta
Salta si no hay paridad o salta si la paridad es non. El salto ocurre
si PF = 0.
JNS
Sintaxis: JNP
etiqueta
El salto se efectúa si SF = 0.
Sintaxis: JO
etiqueta
Salta si hay desbordamiento (overflow). El salto se realiza si OF = 1.
Sintaxis: JP
etiqueta
Salta si hay paridad o salta si la paridad es par. El salto se efectúa
si PF = 1.
Sintaxis: JS
etiqueta
El salto se efectúa si SF = 1.
Sintaxis: LOOP etiqueta
La instrucción loop decrementa CX en 1, y transfiere el flujo del
programa a la etiqueta dada como operando si CX es diferente a 1.
Genera un ciclo en el programa considerando el estado de ZF
Sintaxis: LOOPE
etiqueta
Esta instrucción decrementa CX en 1. Si CX es diferente a cero y ZF es
igual a 1, entonces el flujo del programa se transfiere a la etiqueta indicada
como operando.
Genera un ciclo en el programa, considerando el estado de ZF
Sintaxis: LOOPNE
etiqueta
Esta instrucción decrementa en uno a CX y transfiere el flujo del
programa solo si ZF es diferente a 0.
Sintaxis: DEC
destino
Esta operación resta 1 al operando destino y almacena el nuevo valor en
el mismo oeprando.
Sintaxis: INC
destino
La instrucción suma 1 al operando destino y guarda el resultado en el
mismo operando destino.
Sintaxis: CMP
destino, fuente
Esta instrucción resta el operando fuente al operando destino pero sin
que éste almacene el resultado de la operación, solo se afecta el estado de las
banderas.
Compara cadenas de un byte o palabra.
Sintaxis: CMP
destino, fuente
Con esta instrucción la cadena de caracteres fuente se resta de la
cadena destino.
Se utilizan DI como indice para el segmento extra de la cadena fuente y
SI como indice de la cadena destino.
Solo se afecta el contenido de las banderas y tanto DI como SI se
incrementan.
Limpia la bandera de acarreo.
Sintaxis: CLC
Esta instrucción apaga el bit correspondiente a la bandera de acarreo,
o sea, lo pone en cero.
CLD
Limpia la bandera de dirección
Sintaxis: CLD
La instrucción CLD pone en cero el bit correspondiente a la bandera de
dirección.
Limpia la bandera de interrupción
Sintaxis: CLI
CLI pone en cero la bandera de interrupciones, desabilitando así
aquellas interrupciones enmascarables.
Una interrupción enmascarable es aquella cuyas funciones son
desactivadas cuando IF = 0.
Complementar la bandera de acarreo.
Sintaxis: CMC
Esta instrucción complementa el estado de la bandera CF, si CF = 0 la
instrucción la iguala a 1, y si es 1 la instrucción la iguala a 0, es decir,
unicamente "invierte" el valor de la bandera.
STC
Activa la bandera de acarreo.
Sintaxis: STC
Esta instrucción pone la bandera CF en 1.
Activa la bandera de dirección.
Sintaxis: STD
La instrucción STD pone la bandera DF en 1.
Activa la bandera de interrupción.
Sintaxis: STI
La instrucción activa la bandera IF, esto habilita las interrupciones
externas enmascarables (las que funcionan unicamente cuando IF = 1 ).
Interrupciones
de software
Las interrupciones de software pueden ser activadas directamente por el
ensamblador invocando al número de interrupción deseada con la instrucción INT.
Llama a diversas funciones del DOS.
Sintaxis: Int 21H
Para acceder a cada una de ellas es necesario que en el registro AH se
encuentre el número de función que se requiera al momento de llamar a la
interrupción.
02H Exhibe salida
09H Impresión de cadena (video)
40H Escritura en dispositivo/Archivo
01H Entrada desde teclado
0AH Entrada desde teclado usando buffer
3FH Lectura desde dispositivo/archivo
0FH Abrir archivo
14H Lectura secuencial
15H Escritura secuencial
16H Crear archivo
21H Lectura aleatoria
22H Escritura aleatoria
3CH Crear archivo
3DH Abrir archivo
3EH Cierra manejador de archivo
3FH Lectura desde archivo/dispositivo
40H Escritura en archivo/dispositivo
42H Mover apuntador de lectura/escritura en archivo
Registros de entrada: AH = 02H y DL = Valor del caracter a desplegar.
Registros de retorno: Ninguno
Registros de entrada: Ah = 09H y DS:DX = Dirección de inicio
de una cadena de caracteres
Registros de retorno: Ninguno.
Esta función despliega los caracteres, uno a uno,
desde la dirección indicada en el registro DS:DX hasta encontrar un caracter $,
que es interpretado como el final de la cadena.
Registros de entrada:
AH = 40H
BX = Vía de comunicación
CX = Cantidad de bytes a
escribir
DS:DX = Dirección del inicio
de los datos a escribir
Registros de retorno:
CF = 0 si no hubo error
AX = Número de bytes escritos
CF = 1 si hubo error
AX = Código de error
El uso de esta función para desplegar información en
pantalla se realiza dandole al registro BX el valor de 1 que es el valor
preasignado al video por el sistema operativo MS-DOS.
Registros de entrada: AH
= 01H
Registros de retorno: AL = Caracter leído
Con esta función es muy sencillo leer un caracter del
teclado, el código hexadecimal del caracter leído se guarda en el registro AL.
En caso de que sea un caracter extendido el registro AL contendra el valor de 0
y será necesario llamar de nuevo a la función para obtener el código de este
caracter.
Registros de entrada:
AH = 0AH
DS:DX = Dirección del área de
almacenamiento
BYTE 0 = Cantidad de bytes en
el área
BYTE 1 = Cantidad de bytes
leídos
desde BYTE 2 hasta BYTE 0 + 2
= caracteres leídos
Registros de retorno: Ninguno
Los caracteres son leídos y almacenados en un espacio
predefinido de memoria. La estructura de este espacio le indica que en el
primer byte del mismo se indican cuantos caracteres serán leídos. En el segundo
byte se almacena el número de caracteres que ya se leyeron, y del tercer byte
en adelante se escriben los caracteres leídos.
Cuando se han almacenado todos los caracteres
indicados menos uno la bocina suena y cualquier caracter adicional es ignorado.
Para terminar la captura de la cadena es necesario darle [ENTER].
Registros de entrada:
AH = 3FH
BX = Número asignado al
dispositivo
CX = Número de bytes a
procesar
DS:DX = Dirección del área de
almacenamiento
Registros de retorno:
CF = 0 si no hay error y AX =
número de bytes leidos.
CF = 1 si hay error y AX
contendra el código del error.
Abrir archivo FCB
Registros de entrada:
AH = 0FH
DS:DX = Apuntador a un FCB
Registros de retorno:
AL = 00H si no hubo problema,
de lo contrario regresa 0FFH
Registros de entrada:
AH = 14H
DS:DX = Apuntador a un FCB ya
abierto.
Registros de retorno:
AL = 0 si no hubo errores, de
lo contrario se regresara el código correspondiente de error: 1 error al final
del archivo, 2 error en la estructura del FCB y 3 error de lectura parcial.
Esta función lo que hace es que lee el siguiente
bloque de información a partir de la dirección dada por DS:DX, y actualiza este
registro.
Registros de entrada:
AH = 15H
DS:DX = Apuntador a un FCB ya
abierto
Registros de retorno:
AL = 00H si no hubo errores,
de lo contrario contendra el código del error: 1 disco lleno o archivo de solo
lectura, 2 error en la formación o especificación del FCB.
La función 15H después de escribir el registro al
bloque actual actualiza el FCB.
Registros de entrada:
AH = 16H
DS:DX = Apuntador a un FCB ya
abierto.
Registros de retorno:
AL = 00H si no hubo errores,
de lo contrario contendra el valor 0FFH
Se basa en la información proveida en un FCB para
crear un archivo en el disco.
Registros de entrada:
AH = 21H
DS:DX = Apuntador a un FCB ya
abierto.
Registros de retorno:
A = 00H si no hubo error, de
lo contrario AH contendra el código del error: 1 si es fin de archivo, 2 si
existe error de especificación de FCB y 3 si se leyó un registro parcial o el
apuntador del archivo se encuentra al final del mismo.
Esta función lee el registro especificado por los
campos del bloque actual y registro actual de un FCB abierto y coloca la
información en el DTA (área de transferencia de disco o Disk Transfer Area).
Registros de entrada:
AH = 22H
DS:DX = Apuntador a un FCB
abierto.
Registros de retorno:
AL = 00H si no hubo error, de
lo contrario contendrá el código del error: 1 si el disco está lleno o es
archivo de solo lectura y 2 si hay error en la especificación de FCB.
Escribe el registro especificado por los campos del
bloque actual y registro actual de un FCB abierto. Escribe dicha información a
partir del contenido del DTA (área de transferencia de disco).
Registros de entrada:
AH = 3CH
CH = Atributo de archivo
DS:DX = Apuntador a una
especificaión ASCIIZ
Registros de retorno:
CF = 0 y AX el número
asignado al handle si no hay error, en caso de haberlo CF será 1 y AX contendra
el código de error: 3 ruta no encontrada, 4 no hay handles disponibles para
asignar y 5 acceso negado.
Esta función sustituye a la 16H. El nombre del
archivo es especificado en una cadena ASCIIZ, la cual tiene como característica
la de ser una cadena de bytes convencional terminada con un caracter 0.
El archivo creado contendra los atributos definidos
en el registro CX en la siguiente forma:
Valor Atributos
00H Normal
02H Escondido
04H Sistema
06H Escondido y
de sistema
El archivo se crea con los permisos de lectura y
escritura. No es posible crear directorios utilizando esta función.
Registros de entrada:
AH = 3DH
AL = modo de acceso
DS:DX = Apuntador a una
especificación ASCIIZ
Registros de retorno:
CF = 0 y AX = número de
handle si no hay errores, de lo contrario CF = 1 y AX = código de error: 01H si
no es válida la función, 02H si no se encontró el archivo, 03H si no se
encontr´o la ruta, 04H si no hay handles disponibles, 05H en caso de acceso
negado, y 0CH si el código de acceso no es válido.
El handle regresado es de 16 bits.
El código de acceso se especifica en la siguiente
forma:
BITS
7 6 5 4 3 2 1
. . . . 0 0 0 Solo lectura
. . . . 0 0 1 Solo escritura
. . . . 0 1 0
Lectura/Escritura
. . . X . . . RESERVADO
Registros de entrada:
AH = 3EH
BX = Handle asignado
Registros de retorno:
CF = 0 si no hubo errores, en
caso contrario CF será 1 y AX contendrá el código de error: 06H si el handle es
inválido.
Esta función actualiza el archivo y libera o deja
disponible el handle que estaba utilizando.
Registros de entrada:
AH = 3FH
BX = Handle asignado
CX = Cantidad de bytes a leer
DS:DX = Apuntador a un área
de trabajo.
Registros de retorno:
CF = 0 y AX = número de bytes
leidos si no hubo error, en caso contrario CF = 1 y AX = código de error: 05H
si acceso negado y 06H si no es válido el handle.
Registros de entrada:
AH = 40H
BX = Handle asignado
CX = Cantidad de bytes a
escribir.
DS:DX = Apuntador al buffer
de datos.
Registros de retorno:
CF = 0 y AX = número de bytes
escritos si no hay errores, en caso de existir CF = 1 y AX = código del error:
05H si el acceso es negado y 06H si el handle es inválido.
Registros de entrada:
AH = 42H
AL = método utilizado
BX = Handle asignado
CX = La parte más
significativa del offset
DX = La parte menos
significativa del offset
Registros de retorno:
CF = 0 y DX:AX = la nueva
posición del apuntador. En caso de error CF será 1 y AX = código de error: 01H
si la función no es válida y 06H si el handle no es válido.
El método utilizado se configura como sigue:
Valor de AL Método
00H A partir del
principio del archivo
01H A partir de
la posición actual
02H A partir del
final del archivo
Su función es llamar a diversas funciones de video de
la BIOS.
Sintaxis: Int 10H
Esta interrupción tiene diversas funciones, todas
ellas nos sirven para controlar la entrada y salida de video, la forma de
acceso a cada una de las opciones es por medio del registro AH.
Funciones
comunes de la interrupción 10H.
02H
Selección de posición del cursor
09H
Escribe atributo y caracter en el cursor
0AH
Escribe caracter en la posición del cursor
0EH
Escritura de caracteres en modo alfanumérico
Registros de entrada:
AH = 02H
BH = Página de video en la
que se posicionará el cursor.
DH = Fila
DL = Columna
Registros de retorno:
Ninguno.
Las posiciones de localización del cursor son
definidas por coordenadas iniciando en 0,0, que corresponde a la esquina
superior izquierda hasta 79,24 correspondientes a la esquina inferior derecha.
Tenemos entonces que los valores que pueden tomar los registros DH y DL en modo
de texto de 80 x 25 son de 0 hasta 24 y de 0 hasta 79 respectivamente.
Registros de entrada:
AH = 09H
AL = Caracter a desplegar
BH = Página de video en donde
se desplegará
BL = Atributo a usar
Número de repeticiones.
Registros de retorno:
Ninguno
Esta función despliega un caracter el número de veces
especificado en CX pero sin cambiar la posición del cursor en la pantalla.
Registros de entrada:
AH = 0AH
AL = Caracter a desplegar
BH = Página en donde
desplegar
BL = Color a usar (sólo en
gráficos).
CX = Número de repeticiones
Registros de retorno: Ninguno.
La única diferencia entre esta función y la anterior
es que ésta no permite modificar los atributos, simplemente usa los atributos
actuales.
Tampoco se altera la posición del cursor con esta
función.
Registros de entrada:
AH = 0EH
AL = Caracter a desplegar
BH = Página donde se
desplegara el caracter
BL = Color a usar (solo en
gráficos)
Registros de retorno:
Ninguno
Maneja la entrada/salida del teclado.
Sintaxis: Int 16H
Existen dos opciones de la interrupción 16H y son
llamadas utilizando el registro AH.
Funciones de la
interrupción 16H
00H Lee un caracter de teclado
01H Lee estado del teclado
Registros de entrada:
AH = 00H
Registros de retorno:
AH = código de barrido (scan
code) del teclado
AL = Valor ASCII del
caracter.
Cuando se utiliza esta interrupción se detiene la
ejecución del programa hasta que se introduzca un caracter desde el teclado, si
la tecla presionada es un caracter ASCII su valor será guardado en el registro
AH, de lo contrario el código de barrido será guardado en AL y AH contendrá el
valor 00H.
El código de barrido fué creado para manejar las
teclas que no tienen una representación ASCII como [ALT], [CONTROL], las teclas
de función, etc.
Registros de entrada:
AH = 01H
Registros de retorno:
Si la bandera de cero, ZF,
está apagada significa que hay información en el buffer, si se encuentra
prendida es que no hay teclas pendientes.
En caso de existir información el registro AH
contendrá el código de la tecla guardada en el buffer.
Maneja la entrada/salida de la impresora.
Sintaxis: Int 17H
Esta interrupción es utilizada para escribir
caracteres a la impresora, inicializarla y leer su estado.
Funciones de la interrupción 16H
00H
Imprime un caracter ASCII
01H
Inicializa la impresora
02H
Proporciona el estado de la impresora
Registros de entrada:
AH = 00H
AL = Caracter a imprimir
DX = Puerto a utilizar
Registros de retorno:
AH = Estado de la impresora.
El puerto a utilizar, definido en DX, se especifica
así: LPT1 = 0, LPT2 = 1, LPT3 = 2 ...
El estado de la impresora se codifica bit por bit
como sigue:
BIT 1/0 SIGNIFICADO
----------------------------------------
0 1 Se agotó el tiempo de
espera
1 -
2 -
3 1 Error de entrada/salida
4 1 Impresora seleccionada
5 1 Papel agotado
6 1 Reconocimiento de
comunicación
7 1 La impresora se encuentra
libre
Los bits 1 y 2 no son relevantes.
Registros de entrada:
AH = 01H
DX = Puerto a utilizar
Registros de retorno:
AH = Status de la impresora
El puerto a utilizar, definido en DX, se especifica
así: LPT1 = 0, LPT2 = 1, etc.
El estado de la impresora se codifica bit por bit
como sigue:
BIT 1/0 SIGNIFICADO
----------------------------------------
0 1 Se agotó el tiempo de
espera
1 -
2 -
3 1 Error de entrada/salida
4 1 Impresora seleccionada
5 1 Papel agotado
6 1 Reconocimiento de
comunicación
7 1 La impresora se encuentra
libre
Los bits 1 y 2 no son relevantes.
La mayoria de los BIOS unicamente soportan 3 puertos
paralelos aunque existen algunos que soportan 4.
Registros de entrada:
AH = 01H
DX = Puerto a utilizar
Registros de retorno:
AH = Status de la impresora.
El puerto a utilizar, definido en DX, se especifica
así: LPT1 = 0, LPT2 = 1, etc.
El estado de la impresora se codifica bit por bit
como sigue:
BIT 1/0 SIGNIFICADO
----------------------------------------
0 1 Se agotó el tiempo de
espera
1 -
2 -
3 1 Error de entrada/salida
4 1 Impresora seleccionada
5 1 Papel agotado
6 1 Reconocimiento de
comunicación
7 1 La impresora se encuentra
libre
CALL NombreProc
NombreProc PROC
-----
RET
NombreProc ENDP
Una macro es un grupo de instrucciones repetitivas en un programa que se
codifican solo una vez y pueden utilizarse cuantas veces sea necesario.
La principal diferencia entre una macro y un procedimiento es que en la
macro se hace posible el paso de parámetros y en el procedimiento no Al momento de ejecutarse la macro cada
parámetro es sustituido por el nombre o valor especificado al momento de
llamarla.
Podemos decir entonces que un procedimiento es una extensión de un
determinado programa, mientras que la macro es un módulo con funciones
específicas que puede ser utilizado por diferentes programas.
Otra diferencia entre una macro y un procedimiento es la forma de llamar
a cada uno, para llamar a un procedimiento se requiere el uso de una directiva,
en cambio la llamada a las macros se realiza como si se tratara de una
instrucción del ensamblador.
Sintaxis: NombreMac
MACRO1 [parametro1, parametro2...]
Aunque se tiene la funcionalidad de los parametros es posible crear una
macro que no los necesite.
La directiva de terminación de la macro es: ENDM
Ejemplo:
Posicion MACRO Fila, Columna
PUSH AX
PUSH BX
PUSH DX
MOV AH, 02H
MOV DH, Fila
MOV DL, Columna
MOV BH, 0
INT 10H
POP DX
POP BX
POP AX
ENDM
Ejemplo de llamada a la macro:
Posicion 8, 10