Академический Документы
Профессиональный Документы
Культура Документы
Marcador
no
definido.FUNCIO
N
DESCRIPCION
PAR. ENTRADA
LECTURA
PAR. SALIDA
DE
NOMBRE MACRO
CARACTER
01H
AH = 1
AL = carcter
READ_KBD_AND_ECHO
03H
AH = 3
AL = carcter
AUX_INPUT
07H
AH = 7
AL = carcter
DIR_CONSOLE_INPUT
08H
AH = 8
AL = carcter
READ_KBD
ESCRITURA
DE
CARACTER
02H
AH = 2 // DL = carcter
Ninguno
DISPLAY_CHAR CARACTER
04H
AH = 4 // DL = carcter
Ninguno
AUX_OUTPUT CARACTER
05H
AH = 5 // DL = carcter
Ninguno
PRINT_CHAR CARACTER
OTRAS
DE
PANTALLA/TECLADO
06H
AH = 6Error! Marcador no
definido.
DL -> (ver descripcin)
DIR_CONSOLE_IO SWITCH
09H
AH = 9
DS:DX = puntero a string
Ninguno
DISP_STRING STRING
0AH
AH = 0AH
DS:DX = puntero a buffer
Ninguno
GET_STRING LIMIT,STRING
0BH
AH = 0BH
CHECK_KBD_STATUS
0CH
AH = 0CH
AL = 1,6,7,8 = 0AH
si AL <> 1,6,7,8,0AH solo borra
buffer
FLUSH_AND_READ_KBD SWITCH
Instituto ABACO
NOTAS
(1)
Error! Marcador
no
definido.FUNCION
DESCRIPCION
PAR. ENTRADA
MANEJO
PAR. SALIDA
DE
NOMBRE MACRO
NOTAS
DISCOS
0EH
AH = 0EH
DL = cdigo unidad (0=A, 1=B,
etc.)
Al = n de unidades lgicas
SELECT_DISK DISK
19H
AH = 19H
CURRENT_DISK
1AH
AH = 1AH
DS:DX = direccin del DTA
Ninguno
SET_DTA BUFFER
2FH
AH = 2FH
GET_DTA
36H
AH = 36H
DL = unidad de disco
( 0=defecto,1=A,2=B...)
GET_DISK_SPACE DRIVE
MANEJO DE DIRECTORIOS
39H
Crea un directorio
AH = 39H
DS:DX = puntero a pathname
MAKE_DIR PATH
(2)
3AH
Borra un directorio
AH = 3AH
DS:DX = puntero a pathname
REM_DIR PATH
(2)
3BH
Cambia de directorio
AH = 3BH
DS:DX = puntero a pathname
CHANGE_DIR PATH
(2)
47H
Instituto ABACO
AH = 47H
DS:SI -> puntero a buffer de 64
Bytes
DL = unidad de disco
(0=defecto,1=A,2=B,...)
Fc = 0 no hubo error
Fc = 1 hubo error; Si AX = 15 cdiggo de
unidad de disco incorrecto
GET_DIR DRIVE,BUFFER
Error! Marcador
no
definido.FUNCION
DESCRIPCION
PAR. ENTRADA
MANEJO
PAR. SALIDA
DE
NOMBRE MACRO
NOTAS
(2)
FICHEROS
AH = 3CH
DS:DX = puntero a string donde
reside el pathname.
CX = atributo
CREATE_HANDLE PATH,ATTRIB
AH = 41H
DS:DX = puntero a string con
pathname
DELETE_ENTRY PATH
AH = 43H // AL = 0 leer
atributos // AL = 1 poner
atributos.
CX <- atributos (si AL = 1)
DS:DX = puntero a string
CHANGE_ATTR PATH,ACTION,ATTRIB
(2)
4EH
AH = 4EH
DS:DX = puntero a string
ASCIIZ con pathname (se
admiten metacaracteres)
CX = atributos
FIND_FIRST_FILE PATH,ATTRIB
(3)
4FH
AH = 4FH
FIND_NEXT_FILE
(3)
56H
Renombra un fichero
AH = 56H
DS:DX = puntero a pathname
original
ES:DI = puntero a pathname
nuevo
RENAME_FILE OLD_PATH,NEW_PATH
3CH
41H
Borra un fichero
43H
Instituto ABACO
Error! Marcador no
definido.FUNCION
DESCRIPCION
PAR. ENTRADA
MANEJO
DE
PAR. SALIDA
CONTENIDO DE
NOMBRE MACRO
NOTAS
OPEN_HANDLE PATH,ACCESS
(4)
FICHEROS
3DH
AH = 3DH
DS:DX = puntero a pathname.
AL = byte de acceso
3EH
AH = 3EH
BX = handle
CLOSE_HANDLE HANDLE
3FH
AH = 3FH
BX = handle
CX = n de bytes
DS:DX = puntero a buffer
READ_HANDLE
HANDLE,BUFFER,BYTES
(5)
40H
AH = 40H
BX = handle
CX = n de bytes
DS:DX = puntero a buffer
WRITE_HANDLE
HANDLE,DATA,BYTES
(5)
42H
AH = 42H
AL = indicador de posicin:
0 -> BOF
1 -> POSICION ACTUAL
2 -> EOF
BX = handle
CX:DX = offset (ver nota 6)
Si Fc = 0:
DX:AX = Ubicacin del puntero (contando
desde el inicio)
Si Fc = 1 -> error:
AX = 1 -> funcin invlida
AX = 6 -> handle invlido
MOVE_PTR
HANDLE,HIGH,LOW,METHOD
(6)
AH = 2AH
2BH
AH = 2BH
CX = Ao
DH = Mes
DL = Da
Instituto ABACO
GET_DATE
SET_DATE YEAR,MONTH,DAY
Error! Marcador no
definido.FUNCION
DESCRIPCION
PAR. ENTRADA
PAR. SALIDA
2CH
AH = 2CH
CH = Hora
CL = Minutos (0-59)
DH = Segundos (0-59)
DL = Centsimas (0-99)
2DH
AH = 2DH
CH = Hora (0-23)
CL = Minutos (0-59)
DH = Segundos (0-59)
DL = Centsimas (0-99)
NOMBRE MACRO
NOTAS
GET_TIME
SET_TIME
HOUR,MINUTES,SECON
DS,HUNDRETHS
AH = 48H
BX = n de prrafos a pedir
Si Fc = 0: AX contiene la
direccin del segmento del
bloque asignado.
Si Fc = 1 -> Error:
AX = 7 bloque de control de
memoria mal. // AX = 8
memoria
insuficiente
(BX
indica el n mximo de
prrafos disponibles.
ALLOCATE_MEMORY
BYTES
49H
AH = 49H
ES = Direccin inicial del segmento
FREE_MEMORY
SEG_ADDR
4AH
AH = 4AH
ES = direccin del segmento del bloque a
cambiar
BX = Nuevo tamao del bloque en prrafos
LIB_MEM_COM
LAST_BYTE,STACK_SIZE
Y
LIB_MEM_EXE LAST_SEGM
Instituto ABACO
(7)
Error! Marcador no
definido.FUNCION
DESCRIPCION
PAR. ENTRADA
PAR. SALIDA
NOMBRE MACRO
NOTAS
AH = 35H
AL = n de interrupcin
25H
AH = 25H
AL = n interrupcin
DS:DX = Direccin
Ninguno
GET_VECTOR INTERRUPT
CAPTURE_INT
INTERRUPT,HANDLER_OFF,
HANDLER_SEG
Y
RESTORE_INT
SALIDA DE PROGRAMA
4CH
AH = 4CH
AL = cdigo de retorno
Ninguno
END_PROCESS RETURN_CODE
31H
AH = 31H
AL = cdigo de retorno
DX = N de prrafos de
memoria que deben quedar sin
liberar
Ninguno
KEEP_PROCESS _COM
RETURN_CODE,LAST_BYTE
Instituto ABACO
Y
KEEP_PROCESS_EXE
RETURN_CODE,
LAST_BYTE,FIRST_SEGM
(8)
NOTAS:
1.-
La composicin del buffer para la funcin 0AH debe tener la siguiente estructura:
BYTE 1: N mximo de caracteres en el buffer incluyendo el retorno de carro
BYTE 2: N real de caracteres tecleados sin contar el retorno de carro, este valor lo pone la funcin pero hay que
dejar reservado el byte.
BYTE 3 a N:
Es el buffer donde se depositarn los caracteres tecleados, debe tener al menos la longitud
especificada en el byte 1.
2.-
El pathname debe ser un string de caracteres terminado por un NULL y debe especificar el camino absoluto o relativo.
Atributos de fichero:
00
01
02
04
3.-
Normal
Solo Lectura
Oculto
Fichero Sistema
Estas funciones (4EH y 4FH) devuelven las caracteristicas del fichero encontrado en los 43 primeros bytes del DTA,
que se supone est en un buffer declarado con anterioridad con la funcin 1AH.
La estructura del DTA es la siguiente:
Bytes 0 a 14h:
Reservados
Byte 15h:
Atributo
Bytes 16h a 19h:
Hora y fecha ltima escritura (*)
Bytes 1Ah a 1Dh: Tamao en bytes
Bytes 1Eh a 2Ah:
Nombre y extensin del fichero ajustado a la izda. y terminado en NULL. Si tiene
extensin hay un punto entre el nombre y la extensin. No hay caracteres blancos
intermedios.
(*)
Offsets 16H y 17H (Hora), forman una Word (offset 17H parte alta de la Word):
bits 0 a 4 Segundos
bits 5 a 10 Minutos
bits 11 a 15 Horas
Offsets 18H y 19H (Fecha), forman una Word (offset 19H parte alta de la Word):
bits 0 a 4 Da
bits 5 a 8 Mes
bits 9 a 15 Ao
4.-
Byte de acceso:
0 = Lectura
1 = Escritura
2 = Lectura / escritura
5.-
Si Fc = 0 a la salida de la funcin, AX indica el nmero de bytes ledos o escritos. Si AX es menor que el nmero de
bytes pedidos, es porque se ha producido una lectura o escritura parcial causada probablemente porque se alcanz el
EOF en lectura o porque el disco est lleno en escritura.
Instituto ABACO
6.-
A la funcin se le pasa un parmetro de 32 bits (entero con signo) que se interpreta como un desplazamiento relativo a
una posicin inicial que se especifica en AL (BOF,EOF o posicin actual). Si el desplazamiento es negativo, el
puntero se mueve hacia el comienzo del fichero. Si es positivo se mueve hacia el final del fichero.
Si se intenta mover el puntero por debajo del BOF o por encima del EOF no da error. El puntero se queda en BOF o
EOF (Se puede comprobar por el valor en DX:AX).
7.-
Para reducir la cantidad de memoria inicialmente asignada a un programa COM utilizar la macro LIB_MEM_COM, y
para un programa EXE utilizar la macro LIB_MEM_EXE.
8.-
El valor en DX debe ser el tamao total a permanecer en memoria (no solo el tamao del segmento de cdigo). Por
ejemplo, no se debe olvidar incluir el tamao del PSP.
KEEP_PROCESS_COM se sale dejando residente un programa COM.
KEEP_PROCESS_EXE se sale dejando residente un programa EXE.
Instituto ABACO
LECTURA DE CARACTER
READ_KBD_AND_ECHO
AUX_INPUT
MACRO
MOV
INT
ENDM
AH,01
21H
MACRO
MOV
INT
ENDM
AH,03
21H
DIR_CONSOLE_INPUT MACRO
MOV
INT
ENDM
READ_KBD
MACRO
MOV
INT
ENDM
AH,7
21H
AH,8
21H
ESCRITURA DE CARACTER
DISPLAY_CHAR
MACRO
MOV
MOV
INT
ENDM
CARACTER
DL,CARACTER
AH,02
21H
AUX_OUTPUT
MACRO
MOV
MOV
INT
ENDM
CARACTER
DL,CARACTER
AH,04
21H
PRINT_CHAR
MACRO
MOV
MOV
INT
ENDM
CARACTER
DL,CARACTER
AH,05
21H
OTRAS DE PANTALLA/TECLADO
DIR_CONSOLE_IO
MACRO
MOV
MOV
INT
ENDM
SWITCH
DL,SWITCH
AH,06
21H
DISP_STRING
MACRO
LEA
MOV
INT
ENDM
STRING
DX,STRING
AH,9
21H
; Macro DISP_STRINGZ, visualiza un string ASCIIZ. Puede contener el carcter "$". Modifica AX,BX,DL y Fc
DISP_STRINGZ
LOCAL
BUCLE:
MACRO
STRINGZ
BUCLE,FIN
LEA
BX,STRINGZ
MOV
DL,[BX]
TEST
DL,DL
JZ
FIN
MOV
AH,2
INT
21H
INC
BX
JMP
SHORT BUCLE
FIN:
ENDM
GET_STRING
MACRO
LEA
MOV
MOV
INT
ENDM
CHECK_KBD_STATUS
MACRO
MOV
INT
ENDM
FLUSH_AND_READ_KBD
MACRO
MOV
MOV
INT
ENDM
LIMIT,STRING
DX,STRING
STRING, LIMIT
AH,0AH
21H
AH,0BH
21H
SWITCH
AL,SWITCH
AH,0CH
21H
MANEJO DE DISCOS
SELECT_DISK
MACRO
MOV
MOV
INT
ENDM
CURRENT_DISK
MACRO
MOV
INT
ENDM
SET_DTA
MACRO
LEA
MOV
INT
ENDM
GET_DTA
MACRO
MOV
INT
ENDM
GET_DISK_SPACE
MACRO
MOV
MOV
INT
ENDM
DISK
DL,DISK - 'A'
AH,0EH
21H
AH,19H
21H
BUFFER
DX,BUFFER
AH,1AH
21H
AH,2FH
21H
DRIVE
DL,DRIVE
AH,36H
21H
MANEJO DE DIRECTORIOS
MAKE_DIR
MACRO
LEA
MOV
INT
ENDM
PATH
DX, PATH
AH,39H
21H
REM_DIR
MACRO
LEA
MOV
INT
ENDM
PATH
DX,PATH
AH,3AH
21H
CHANGE_DIR
MACRO
LEA
MOV
INT
ENDM
PATH
DX,PATH
AH,3BH
21H
GET_DIR
MACRO
MOV
LEA
MOV
INT
ENDM
DRIVE,BUFFER
DL,DRIVE
SI,BUFFER
AH,47H
21H
MANEJO DE FICHEROS
CREATE_HANDLE
MACRO
PATH,ATTRIB
LEA
DX,PATH
MOV
CX,ATTRIB
MOV
AH,3CH
INT
21H
ENDM
DELETE_ENTRY
MACRO
LEA
MOV
INT
ENDM
PATH
DX,PATH
AH,41H
21H
CHANGE_ATTR
MACRO
LEA
MOV
MOV
MOV
INT
ENDM
PATH,ACTION,ATTRIB
DX,PATH
AL,ACTION
CX,ATTRIB
AH,43H
21H
FIND_FIRST_FILE
MACRO
LEA
MOV
MOV
INT
ENDM
PATH, ATRIB
DX,PATH
CX,ATRIB
AH,4EH
21H
FIND_NEXT_FILE
MACRO
MOV
INT
ENDM
RENAME_FILE
AH,4FH
21H
MACRO
OLD_PATH,NEW_PATH
LEA
DX,OLD_PATH
PUSH
DS
POP
ES
LEA
DI,NEW_PATH
MOV
AH,56H
INT
21H
ENDM
MACRO
LEA
MOV
MOV
INT
ENDM
PATH,ACCESS
DX, PATH
AL, ACCESS
AH,3DH
21H
CLOSE_HANDLE
MACRO
MOV
MOV
INT
ENDM
HANDLE
BX,HANDLE
AH,3EH
21H
READ_HANDLE
MACRO
MOV
LEA
MOV
MOV
INT
ENDM
HANDLE,BUFFER,BYTES
BX,HANDLE
DX, BUFFER
CX,BYTES
AH,3FH
21H
WRITE_HANDLE
MACRO
MOV
LEA
MOV
MOV
INT
ENDM
HANDLE,DATA,BYTES
BX,HANDLE
DX, DATA
CX,BYTES
AH,40H
21H
MOVE_PTR
MACRO
MOV
MOV
MOV
MOV
MOV
INT
ENDM
HANDLE,HIGH,LOW,METHOD
BX,HANDLE
CX,HIGH
DX,LOW
AL,METHOD
AH,42H
21H
MACRO
MOV
INT
ENDM
SET_DATE
MACRO
MOV
MOV
MOV
MOV
INT
ENDM
GET_TIME
MACRO
MOV
INT
ENDM
SET_TIME
MACRO
MOV
MOV
MOV
MOV
MOV
INT
ENDM
AH,2AH
21H
YEAR,MONTH,DAY
CX,YEAR
DH,MONTH
DL,DAY
AH,2BH
21H
AH,2CH
21H
HOUR,MINUTES,SECONDS,HUNDRETHS
CH,HOUR
CL,MINUTES
DH,SECONDS
DL,HUNDRETHS
AH,2DH
21H
MACRO BYTES
MOV
MOV
SHR
INC
MOV
INT
ENDM
BX,BYTES
CL,4
BX,CL
BX
AH,48H
21H
FREE_MEMORY
MACRO
MOV
MOV
MOV
INT
ENDM
SEG_ADDR
AX,SEG_ADDR
ES,AX
AH,49H
21H
LIB_MEM_COM
MACRO
LOCAL
MOV
LEA
ADD
JC
ADD
JC
MOV
CL,4
SHR
INC
MOV
INT
JC
SHL
MOV
XOR
PUSH
LAST_BYTE,STACK_SIZE
FIN
AX,8
;Cdigo de retorno mem. insuficiente
BX,LAST_BYTE-1
;Offset ltimo byte del prog.
BX,STACK_SIZE
FIN
;SI Carry sale por error FC=1,AX=8
BX,2
;Espacio para meter word a ceros
FIN
;Si carry, sale por error
BX,CL
BX
AH,4AH
21H
FIN
BX,CL
SP,BX
AX,AX
AX
FIN:
ENDM
LIB_MEM_EXE
MACRO LAST_SEGM
LOCAL
SIGUE
MOV
BX,SP
DEC
BX
MOV
CL,4
SHR
BX,CL
INC
BX
MOV
AX,SS
ADD
AX,BX
MOV
BX,LAST_SEGM
CMP
AX,BX
JBE
SIGUE
MOV
BX,AX
SIGUE: MOV
AX,ES
SUB
BX,AX
MOV
AH,4AH
INT
21H
ENDM
MACRO
MOV
MOV
INT
ENDM
INTERRUPT
AL,INTERRUPT
AH,35H
21H
CAPTURE_INT
MACRO
PUSH
MOV
MOV
MOV
LEA
MOV
INT
POP
ENDM
INTERRUPT,HANDLER_OFF,HANDLER_SEG
DS
AX,HANDLER_SEG
DS,AX
AL,INTERRUPT
DX,HANDLER_OFF
AH,25H
21H
DS
RESTORE_INT
MACRO
PUSH
LDS
MOV
MOV
INT
POP
ENDM
INTERRUPT,FAR_OLD_ADDRESS
DS
DX,FAR_OLD_ADDRESS
AL,INTERRUPT
AH,25H
21H
DS
FINALIZACION DE PROGRAMA
END_PROCESS
MACRO
MOV
MOV
INT
ENDM
RETURN_CODE
AL,RETURN_CODE
AH,4CH
21H
KEEP_PROCESS_COM
MACRO
MOV
LEA
MOV
SHR
INC
MOV
INT
ENDM
RETURN_CODE,LAST_BYTE
AL,RETURN_CODE
DX, LAST_BYTE - 1
CL,4
DX,CL
DX
AH,31H
21H
KEEP_PROCESS_EXE
MACRO
LOCAL
LEA
MOV
SHR
ADD
ADD
JC
MOV
SUB
JC
MOV
MOV
INT
RETURN_CODE,LAST_BYTE,FIRST_SEGM
FIN
DX,LAST_BYTE - 1
CL,4
DX,CL
DX,11H
DX,SEG LAST_BYTE
FIN
AX,FIRST_SEGM
DX,AX
FIN
AL,RETURN_CODE
AH,31H
21H
FIN:
ENDM
COPROCESADOR
; Esta macro transfiere el byte ms significativo de la palabra de estado del coprocesador, al byte menos significativo de PSW.
; Requiere como parmetro un nombre de variable tipo word que se usa como almacenamiento intermedio. Solo modifica AX y PSWL.
MOVE_STSWH_TO_PSWL
MACRO
FSTSW
MOV
SAHF
ENDM
VAR_W
VAR_W
AX,VAR_W
RUTINAS DE LIBRERA
;UNSIGN_DOUB_TO_ASCII
; Rutina de utilidad general para convertir una doble word sin signo en un string de caracteres que
; representa el valor de la doble word en la base de numeracin BASE.
;
; Parmetros de entrada:
;
; ALTO: Parte alta de la doble word
; BAJO: Parte baja de la doble word
; BASE: Base de numeracin (de 2 a 16)
; MIN:
Mnimo n de caracteres en el string resultante
; OFF_TABLA:
Offset de una tabla en el segmento de datos que debe contener los
;
caracteres ASCII de las cifras vlidas en la base de numeracin
;
elegida.
; OFF_STRING:
Es el offset de un string en el segmento de datos donde se deposita
;
el resultado. (Debe tener el tamao suficiente)
;
; Parmetros de salida:
;
; Devuelve en AX la longitud del string resultante.
;
; Registros afectados:
;
Solamente AX
ALTO
BAJO
BASE
MIN
OFF_TABLA
OFF_STRING
CODE
EQU
EQU
EQU
EQU
EQU
EQU
[BP+14]
[BP+12]
[BP+10]
[BP+8]
[BP+6]
[BP+4]
SEGMENT
PUBLIC
ASSUME CS:CODE
UNSIGN_DOUB_TO_ASCII PROC NEAR
PUBLIC UNSIGN_DOUB_TO_ASCII
PUSH BP
MOV BP,SP
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
MOV SI,ALTO
MOV DI,BAJO
MOV BX,BASE
XOR CX,CX
BUCLE1:
PUSH SI
OR SI,DI
POP SI
JZ BUCLE2
MOV AX,SI
XOR DX,DX
DIV BX
MOV SI,AX
MOV AX,DI
DIV BX
PUSH DX
INC CX
MOV DI,AX
JMP SHORT BUCLE1
BUCLE2:
CMP CX,MIN
JAE SIGUE
PUSH SI
INC CX
JMP
SHORT BUCLE2
SIGUE:
BUCLE3:
MOV SI,CX
MOV BX,OFF_TABLA
MOV DI,OFF_STRING
JCXZ FIN
POP AX
XLATB
MOV [DI],AL
INC DI
LOOP BUCLE3
FIN:
UNSIGN_DOUB_TO_ASCII
CODE
ENDS
MOV
MOV
POPF
POP
POP
POP
POP
POP
POP
RET
ENDP
END
ASCII_TO_UNSIGN_DOUB
OFF_STRING
BASE
EQU
EQU
[BP+6]
[BP+4]
CODE
SEGMENT
PUBLIC
ASSUME CS:CODE
ASCII_TO_UNSIGN_DOUB PROC NEAR
PUBLIC
ASCII_TO_UNSIGN_DOUB
PUSH BP
MOV BP,SP
PUSH BX
PUSH CX
PUSH DX
PUSHF
XOR SI,SI
XOR DI,DI
XOR CX,CX
MOV BX,STRING
BUCLE1:
CMP BYTE PTR [BX],20H
JNE BUCLE2
INC BX
JMP SHORT BUCLE1
BUCLE2:
MOV CL,[BX]
INC BX
TEST CL,CL
JZ FIN1
SUB CL,'0'
CMP CL,9
JBE SIGUE
SUB CL,7
AND CL,0DFH
CMP CL,0AH
JB NO_NUM
CMP CL,0FH
JA NO_NUM
SIGUE:
CMP
JAE
PUSH
MOV
MOV
MUL
MOV
MOV
MOV
CL,BASE
NO_NUM
BX
BX,BASE
AX,DI
BX
DI,AX
AX,SI
SI,DX
MUL
BX
JC
ADD
JC
ADD
ADC
JC
POP
JMP
OVERF
SI,AX
OVERF
DI,CX
SI,0
OVERF
BX
SHORT BUCLE2
NO_NUM:
MOV AX,-2
JMP SHORT FIN2
OVERF:
POP BX
MOV AX,-1
JMP SHORT FIN2
FIN1:
MOV AX,4
TEST SI,SI
JNZ FIN2
SHR AX,1
CMP DI,0FFH
JA FIN2
SHR AX,1
TEST DI,DI
JNZ FIN2
XOR AX,AX
FIN2:
POPF
POP
POP
POP
POP
RET
ASCII_TO_UNSIGN_DOUB
CODE
ENDS
END
DX
CX
BX
BP
4
ENDP
;ASCII_TO_SIGN_DOUB
; Rutina de utilidad general que convierte el string ASCIIZ que est en la
; variable OFF_STRING en su valor binario.
; El valor del string es con signo, por lo que se admite el signo '-' o '+'
; delante. Si no se pone signo, se entiende que es positivo.
; El resultado se devuelve en Ca2
;
; Parmetros de entrada (por pila)
;
; OFF_STRING:
Direccin de un string ASCIIZ con el nmero a convertir
; BASE: Base de numeracin (2 a 16)
; Parmetros de salida:
;
; SI&DI: valor del n convertido
; AX:
Cdigo de retorno
;
0 = el valor es cero
;
1 = se puede expresar con un byte
;
2 = requiere una word
;
4 = requiere doble word
;
-1 = el valor es mayor de doble word
;
-2 = se detect un carcter errneo en la base elegida
OFF_STRING
BASE
EQU
EQU
[BP+6]
[BP+4]
CODE
SEGMENT
PUBLIC
ASSUME CS:CODE
ASCII_TO_SIGN_DOUB
PROC NEAR
PUBLIC
ASCII_TO_SIGN_DOUB
PUSH BP
MOV BP,SP
PUSH BX
PUSH CX
PUSH DX
PUSHF
XOR SI,SI
XOR DI,DI
XOR CX,CX
MOV BX,OFF_STRING
BUCLE1:
CMP BYTE PTR[BX],20H
JNE SIGUE1
INC BX
JMP SHORT BUCLE1
SIGUE1:
PUSH SI
MOV CL,[BX]
CMP CL,'+'
JE BUCLE2
CMP CL,'-'
JNE SIGUE2
POP AX
INC AX
PUSH AX
BUCLE2:
INC BX
MOV CL,[BX]
SIGUE2:
TEST CL,CL
JZ FIN1
SUB CL,'0'
CMP CL,9
JBE SIGUE3
SUB CL,7
AND CL,0DFH
CMP
CL,0AH
JB NO_NUM
CMP CL,0FH
JA NO_NUM
SIGUE3:
CMP CL,BASE
JAE NO_NUM
PUSH BX
MOV BX,BASE
MOV AX,DI
MUL BX
MOV DI,AX
MOV AX,SI
MOV SI,DX
MUL BX
JC OVERF
ADD SI,AX
JC OVERF
ADD DI,CX
ADC SI,0
JC OVERF
TEST SI,8000H
JNZ OVERF
POP BX
JMP SHORT BUCLE2
NO_NUM:
MOV AX,-2
JMP SHORT FIN2
OVERF:
MOV AX,-1
POP BX
FIN2:
POP
JMP
BX
SHORT FIN3
MOV
TEST
JNZ
TEST
JNZ
SHR
TEST
JNZ
SHR
TEST
JNZ
XOR
AX,4
SI,SI
SIGUE4
DI,8000H
SIGUE4
AX,1
DI,0FF80H
SIGUE4
AX,1
DI,DI
SIGUE4
AX,AX
FIN1:
SIGUE4:
POP BX
TEST BX,BX
JZ FIN3
NOT SI
NOT DI
ADD DI,1
ADC SI,0
FIN3:
POPF
ASCII_TO_SIGN_DOUB
CODE
ENDS
POP
POP
POP
POP
RET
ENDP
END
DX
CX
BX
BP
4