You are on page 1of 36

; PROGRAMA EN LENGUAJE ENSAMBLADOR. (Bajo D.O.S.

)
; Poner extensin ASM en lugar de TXT a este archivo - es la extensin original.
; Poner un nombre de mximo 8 caracteres si se utiliza un compilador bajo D.O.S.
; La ejecucin de este programa puede requerir un emulador del D.O.S.
; Este programa demuestra como se puede realizar operaciones aritmeticas en leng
uaje
; ensamblador, donde los operandos pueden tener una cantidad muy grande de digit
os.
; La cantidad de digitos a manejar se controla fijando las constantes que aparec
en
; al inicio del codigo fuente.
; Se demuestran las operaciones SUMA, RESTA, MULTIPLICACION, DIVISION y lo mejor
:
; CALCULO DE LOGARITMO EN BASE 10 de numeros que varian entre 0 y 99999999.
; Para poder realizar este calculo, se utiliza la serie de potencias para logari
tmo
; natural, y el resultado se multiplica por una constante para transformarlo a
; logaritmo en base 10.
;DEFINICION DE CONSTANTES Y MACROS:
DIGDIVIS
NUMELEMENT
DIGSUMA
DIGMULT1
DIGMULT2

EQU
EQU
EQU
EQU
EQU

BLACK
BLUE
GREEN
CYAN
RED
MAGENTA
BROWN
GRAY
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

16
200
NUMELEMENT
NUMELEMENT-16
16
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

UP EQU 200
LEFT EQU 203
RIGHT EQU 205
DOWN EQU 208
; ESTA MACRO SIRVE PARA DIBUJAR UN RECTANGULO CON DETERMINADO CARACTER.
LLENAR MACRO X1,Y1,X2,Y2,CAR1
LOCAL LLEN1,LLEN2,LLEN3

MOV CX,0
MOV CL,X2
SUB CL,X1
INC CX
MOV BH,00
MOV BL,ATRIBUTO
MOV AL,CAR1
CMP AL,219
JNE LLEN2
SHR BL,4
JMP LLEN3

;Coloco en CX el nmero de repeticin


;Cargo en BL el atributo de caracter

LLEN2:
OR BL,80H
LLEN3:
MOV
MOV

DL,X1
DH,Y1

MOV
INT
MOV
MOV
INT
INC
CMP
JBE

AH,02H
10H
AL,CAR1
AH,09H
10H
DH
DH,Y2
LLEN1

;cargo en DL columna inicial


;cargo en DH fila inicial

LLEN1:
;ubico el cursor
;Cargo en AL caracter a mostrar
;muestro
;incremento fila
;si no es fila tope
;regresar al lazo

ENDM

GOTOXY

MACRO COLUMNA,FILA
;UBICA EL CURSOR.
MOV AH,02H
MOV BH,00H
;PAGINA ACTIVA.
MOV DX,COLUMNA
MOV CX,FILA
MOV DH,CL
;FILA EN DH, COLUMNA EN DL.
INT 10H

ENDM
ENCENDERCURSOR MACRO
;HACER VISIBLE EL CURSOR EN MODO TEXTO
MOV AH,01H
MOV CH,06H
MOV CL,07H
;Coloco el tamao del cursor
INT 10H
;muestro el cursor
ENDM
APAGARCURSOR MACRO
MOV AH,01H
MOV CH,20H
INT 10H
ENDM

;APAGAR EL CURSOR EN MODO TEXTO


;Coloco el tamao del cursor
;muestro el cursor

PUTCH MACRO C ;IMPRIME UN CARACTER SIN AVANZAR CURSOR


PUSH BX
MOV AH,9
MOV AL,C

MOV
MOV
OR
MOV
INT
POP

BH,0
BL,ATRIBUTO
BL,80H
CX,1
10H
BX

ENDM
PUTCH1 MACRO C ;IMPRIME UN CARACTER Y UBICA CURSOR EN POSICION SIGUIENTE
LOCAL PUT1,PUT2,PUT3,PUT4
PUSH CX
MOV AL,C
CMP AL,13
JNE PUT3
MOV AH,2
MOV DL,13
INT 21H
JMP PUT2
PUT3:
CMP AL,10
JNE PUT4
MOV AH,2
MOV DL,10
INT 21H
JMP PUT2
PUT4:
MOV AH,9
MOV AL,C
MOV BH,0
MOV BL,ATRIBUTO
OR BL,80H
MOV CX,1
INT 10H
MOV AH,3
MOV BH,0
INT 10H
CMP DL,79
JE PUT1
INC DL
MOV AH,2
MOV BH,0
INT 10H
JMP PUT2
PUT1:
MOV AH,2
MOV DL,13
INT 21H
MOV DL,10
INT 21H
PUT2:
POP CX
ENDM
PUTMSG MACRO COLUMNA,FILA,MENSAJE
GOTOXY COLUMNA,FILA
PUTMSG2 MENSAJE
ENDM

;IMPRIME CADENA DE CARACTERES

PUTMSG2 MACRO MENSAJE


;IMPRIME EN POSICION ACTUAL DEL CURSOR.
LOCAL PONER1
MOV SI,0
PONER1:
PUTCH1 MENSAJE[SI]
INC SI
CMP MENSAJE[SI],'$'
JNE PONER1
ENDM
PUTMSG3 MACRO IND1 , SELECTED
LOCAL PONER1,PON3,PON2
MOV AX,SELECTED
CMP AX,1
JNE PON2
SETATRIBUTO 1,15
JMP PON3
PON2:
SETATRIBUTO 7,0
PON3:
MOV CX,IND1
ADD CX,9
MOV FILA1,CL
LLENAR 21,FILA1,56,FILA1,219
MOV CX,IND1
;FILA
ADD CX,9
GOTOXY 21,CX
MOV SI,IND1
ADD SI,SI
MOV DX,MENSAJES[SI]
MOV SI,DX
PONER1:
PUTCH1 [SI]
INC SI
MOV DL,[SI]
CMP DL,'$'
JNE PONER1
ENDM
PUTMSG4 MACRO IND1
LOCAL PONER1
SETATRIBUTO GRAY,RED
LLENAR 5,28,76,28,219
GOTOXY 5,28
MOV SI,IND1
ADD SI,SI
MOV DX,MENSAJES2[SI]
MOV SI,DX
PONER1:
PUTCH1 [SI]
INC SI
MOV DL,[SI]
CMP DL,'$'
JNE PONER1
ENDM
GETCH

MACRO
;PIDE UN CARACTER DESDE TECLADO
LOCAL G1
MOV AH,7
INT 21H

CMP
JNZ
MOV
INT
ADD

AL,0
G1
AH,7
21H
AL,128

G1:
ENDM
MARCO
LOCAL
HORIZ:

VERTI:

LIMIT1:

LIMIT2:
ENDM

MACRO X1,Y1,X2,Y2,T1,T2,T3,T4,T5,T6,T7,T8
HORIZ,VERTI,LIMIT1,LIMIT2
MOV AX,X1
;LINEAS HORIZONTALES
MOV SI,AX
NOP
GOTOXY SI,Y1
PUTCH T5
GOTOXY SI,Y2
PUTCH T6
MOV AX,X2
INC SI
CMP SI,AX
JLE HORIZ
MOV AX,Y1
;LINEAS VERTICALES
MOV SI,AX
NOP
GOTOXY X1,SI
PUTCH T7
GOTOXY X2,SI
PUTCH T8
MOV AX,Y2
INC SI
CMP SI,AX
JLE VERTI
GOTOXY X1,Y1
;ESQUINAS DEL MARCO
PUTCH T3
GOTOXY X1,Y2
PUTCH T2
GOTOXY X2,Y1
PUTCH T4
GOTOXY X2,Y2
PUTCH T1
MOV AX,X1
CMP AX,X2
JNE LIMIT1
GOTOXY X1,Y1
PUTCH T7
GOTOXY X1,Y2
PUTCH T7
JMP LIMIT2
NOP
MOV AX,Y1
CMP AX,Y2
JNE LIMIT2
GOTOXY X1,Y1
PUTCH T5
GOTOXY X2,Y1
PUTCH T5
NOP

MARCO1 MACRO A,B,C,D


MARCO A,B,C,D, '' , '' , '' , '' , '' , '' , '' , ''
ENDM
MARCO2 MACRO A,B,C,D
MARCO A,B,C,D, '' , '' , '' , '' , '' , '' , '' , ''
ENDM
MARCO3 MACRO A,B,C,D
MARCO A,B,C,D, 219,219,219,219,223,220,219,219
ENDM

SETATRIBUTO
MOV
AND
MOV
SHL
MOV
AND
XOR
ADD
MOV
ENDM

MACRO BACK,FORE
AX,BACK
AX,15
CL,4
AX,CL
BX,FORE
BX,0FH
BX,BACK
AX,BX
ATRIBUTO,AL

;SETEA ATRIBUTO GRAFICO DE LOS CARACTERES.

INGRESARENTERO MACRO VAR , NUM


LEA DX,VAR
MOV DIRECCION,DX
MOV CX,NUM
MOV NUMDIGITOS,CX
CALL INGRESARENTEROPROC
ENDM
INGRESARENTERO1 MACRO VAR , NUM
LEA DX,VAR
MOV DIRECCION,DX
MOV CX,NUM
MOV NUMDIGITOS,CX
CALL INGRESARENTEROPROC1
ENDM
HEXTOASCII MACRO NUMERO
LOCAL SALTO1,SALTO2
MOV AX,NUMERO
CMP AX,9
JG SALTO1
ADD AX,30H
JMP SALTO2
SALTO1: ADD AX,37H
SALTO2: NOP
MOV DX,AX
ENDM
VALIDAASCII MACRO NUMERO
LOCAL VAL1,VAL2,VAL3
CMP NUMERO, 30H
JL VAL1

CMP NUMERO, 39H


JLE VAL2
JMP VAL1

VAL1:

VAL2:
VAL3:
ENDM

CMP
JL
CMP
JLE
CMP
JL
CMP
JLE
NOP
MOV
JMP
NOP
MOV
NOP

NUMERO,
VAL1
NUMERO,
VAL2
NUMERO,
VAL1
NUMERO,
VAL2

;QUITAR ESTA LINEA SI ACEPTA HEXADECIMALES.


41H
46H
61H
66H

DX,0
VAL3
DX,1

ASCIITOHEX MACRO NUMERO


LOCAL SALTO3,SALTO4,SALTO5
MOV AX,NUMERO
CMP AX,39H
JG SALTO3
SUB AX,30H
JMP SALTO5
SALTO3: NOP
CMP AX,46H
JG SALTO4
SUB AX,37H
JMP SALTO5
SALTO4: NOP
SUB AX,57H
SALTO5: NOP
MOV DX,AX
ENDM

IMPRIMEENTERO MACRO VAR , NUMDIG


LEA DX,VAR
MOV DIRECCION , DX
MOV AX,NUMDIG
MOV NUMDIGITOS,AX
CALL IMPRIMEENTEROPROC
ENDM
COMPLEMENTAA10 MACRO VAR
LEA DX,VAR
MOV DIRECCION ,DX
CALL COMPLEMENTAA10PROC
ENDM
DIVIDE MACRO DIV1,DIV2,DIV3
LOCAL DIV31,DIV32,DIV33
MOV SI,NUMELEMENT-1

DIV32:
MOV
MOV
DEC
CMP
JNE

AL,DIV1[SI]
AA[SI],AL
SI
SI,-1
DIV32

MOV SI,NUMELEMENT-1
DIV33:
MOV
MOV
DEC
CMP
JNE

AL,DIV2[SI]
XX[SI],AL
SI
SI,-1
DIV33

PUSH BP
CALL PDIVIDE
POP BP
MOV SI,DIGDIVIS+DIGDIVIS+DIGDIVIS+DIGDIVIS-1
DIV31:
MOV
MOV
DEC
CMP
JNE

AL,CC[SI]
DIV3[SI],AL
SI
SI,-1
DIV31

ENDM
MULTIPLICA MACRO DIV1,DIV2,DIV3
LOCAL DIV31,DIV32,DIV33
MOV SI,NUMELEMENT-1
DIV32:
MOV
MOV
DEC
CMP
JNE

AL,DIV1[SI]
MUL1[SI],AL
SI
SI,-1
DIV32

MOV SI,NUMELEMENT-1
DIV33:
MOV
MOV
DEC
CMP
JNE

AL,DIV2[SI]
MUL2[SI],AL
SI
SI,-1
DIV33

PUSH BP
CALL PMULTIPLICA
POP BP
MOV SI,NUMELEMENT-1
DIV31:
MOV
MOV
DEC
CMP
JNE
ENDM

AL,PROD[SI]
DIV3[SI],AL
SI
SI,-1
DIV31

;31

SUMAR MACRO DIV1,DIV2,DIV3


LOCAL DIV31,DIV32,DIV33
MOV SI,DIGSUMA-1
DIV32:
MOV
MOV
DEC
CMP
JNE

AL,DIV1[SI]
A[SI],AL
SI
SI,-1
DIV32

MOV SI,DIGSUMA-1
DIV33:
MOV
MOV
DEC
CMP
JNE

AL,DIV2[SI]
B[SI],AL
SI
SI,-1
DIV33

PUSH BP
CALL PSUMAR
POP BP
MOV SI,DIGSUMA-1
DIV31:
MOV
MOV
DEC
CMP
JNE

AL,C[SI]
DIV3[SI],AL
SI
SI,-1
DIV31

ENDM
RESTAR MACRO DIV1,DIV2,DIV3
LOCAL DIV31,DIV32,DIV33
MOV SI,DIGSUMA-1
DIV32:
MOV
MOV
DEC
CMP
JNE

AL,DIV1[SI]
A[SI],AL
SI
SI,-1
DIV32

MOV SI,DIGSUMA-1
DIV33:
MOV
MOV
DEC
CMP
JNE

AL,DIV2[SI]
B[SI],AL
SI
SI,-1
DIV33

PUSH BP
CALL RESTARPROC
POP BP
MOV SI,DIGSUMA-1
DIV31:

MOV
MOV
DEC
CMP
JNE

AL,C[SI]
DIV3[SI],AL
SI
SI,-1
DIV31

ENDM
IMPRIMEPARCIAL MACRO OPR1
LOCAL DIV31
MOV SI,DIGDIVIS+DIGDIVIS+DIGDIVIS+DIGDIVIS-1
DIV31:
MOV AL,OPR1[SI]
MOV COCIENTE[SI],AL
DEC SI
CMP SI,-1
JNE DIV31
CALL IMPRIMECOCIENTE2
ENDM

;31

STACKSG SEGMENT PARA STACK 'STACK'


DW 8192 DUP(?)
STACKSG ENDS

DATASG SEGMENT PARA 'DATA'

LOGTABL1 DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
4,2,3,4,0,8,9,7,1,0,1,3,5,9,0,0
4,5,9,3,9,7,6,5,5,1,2,3,2,8,1,0
1,9,4,7,6,4,4,6,2,4,6,3,2,6,2,0
2,1,2,1,2,6,6,3,2,2,7,4,6,3,3,0
4,6,1,8,0,1,8,0,1,5,6,4,5,0,4,0
5,3,7,5,4,2,9,2,6,3,0,0,0,7,4,0
0,7,1,2,6,0,1,5,2,8,2,6,0,3,5,0
9,1,1,2,0,9,4,6,6,6,8,7,7,8,5,0
5,9,3,2,7,1,6,8,8,3,5,8,1,4,6,0
5,4,9,9,5,5,0,8,1,7,4,1,3,9,6,0
7,7,3,9,2,7,4,4,3,7,3,9,1,4,7,0
0,7,2,4,6,3,0,6,3,7,5,4,8,8,7,0
4,0,1,5,3,9,2,2,1,9,0,9,2,3,8,0
0,0,9,3,5,3,7,3,7,8,6,4,5,7,8,0
5,5,1,4,7,8,1,3,7,0,9,2,6,1,9,0

;LN(0.0)
;LN(0.1)
;LN(0.2)
;LN(0.3)
;LN(0.4)
;LN(0.5)
;LN(0.6)
;LN(0.7)
;LN(0.8)
;LN(0.9)
;LN(1.0)
;LN(1.1)
;LN(1.2)
;LN(1.3)
;LN(1.4)
;LN(1.5)
;LN(1.6)
;LN(1.7)
;LN(1.8)
;LN(1.9)
;LN(2.0)
;LN(2.1)
;LN(2.2)
;LN(2.3)
;LN(2.4)
;LN(2.5)

valor
valor
valor
valor
valor
valor
valor
valor
valor
valor

no
no
no
no
no
no
no
no
no
no

utilizado.
utilizado.
utilizado.
utilizado.
utilizado.
utilizado.
utilizado.
utilizado.
utilizado.
utilizado.

DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB

6,3,4,7,2,0,5,4,4,1,1,5,5,5,9,0
3,8,2,0,1,0,3,7,7,1,5,2,3,9,9,0
8,5,1,1,8,1,7,1,4,9,1,6,9,2,0,1
8,2,4,2,9,9,6,3,7,0,1,7,4,6,0,1
0,1,1,8,6,6,8,8,2,2,1,6,8,9,0,1
1,0,1,1,9,4,1,1,1,2,0,4,1,3,1,1
1,8,6,5,0,8,9,0,8,0,5,1,3,6,1,1
4,3,4,2,7,4,8,6,4,2,2,9,3,9,1,1
6,1,1,2,2,6,1,3,4,5,7,7,3,2,2,1
8,6,3,5,9,4,8,6,9,2,6,7,2,5,2,1
4,6,0,2,6,4,5,4,8,3,3,9,0,8,2,1
9,7,1,0,5,6,9,1,8,2,3,3,8,0,3,1
0,4,3,2,3,7,6,6,0,1,0,0,5,3,3,1
1,0,6,5,3,1,3,5,5,6,7,9,0,6,3,1
1,9,8,9,1,1,1,6,3,4,9,2,6,8,3,1
2,6,2,0,1,7,3,7,9,6,8,9,0,1,4,1
2,2,3,9,8,2,5,2,5,4,8,0,5,3,4,1
6,1,5,9,9,6,2,2,0,5,1,6,8,5,4,1
5,1,2,4,2,9,0,4,5,4,0,6,1,8,4,1
4,7,2,6,7,7,6,9,3,7,7,0,4,0,5,1
9,4,0,5,9,4,3,0,3,6,5,0,6,2,5,1
2,1,0,6,1,7,8,0,5,2,6,5,7,4,5,1
4,4,8,3,1,9,7,1,9,5,1,6,8,6,5,1
0,8,5,6,1,1,5,0,2,5,3,2,9,8,5,1
0,0,1,4,3,4,2,1,9,7,3,4,9,0,6,1
9,7,2,0,3,7,9,3,5,0,4,2,9,2,6,1
1,8,3,7,8,5,5,2,6,8,5,6,8,4,6,1
5,7,0,8,5,5,0,2,8,6,0,7,7,6,6,1
8,2,2,0,7,5,3,5,9,8,9,3,6,8,6,1
4,2,4,8,3,2,2,9,0,8,4,7,4,0,7,1
2,0,1,1,4,7,7,9,5,6,6,7,2,2,7,1
3,0,5,0,4,8,4,7,1,6,6,4,0,4,7,1
2,7,3,2,5,5,7,1,9,7,5,8,7,5,7,1
2,7,6,1,1,9,0,5,3,2,5,9,4,7,7,1
4,5,0,8,2,2,9,6,4,9,5,7,1,9,7,1
4,6,2,9,7,1,1,7,7,8,8,2,8,0,8,1
4,4,0,1,5,0,2,9,2,9,4,5,4,2,8,1
5,8,4,7,9,3,3,3,6,9,4,5,0,4,8,1
5,2,6,5,6,3,0,9,9,7,9,2,6,5,8,1
0,9,5,1,0,9,6,7,1,2,0,8,1,7,8,1
8,7,3,2,3,0,9,4,6,9,6,0,7,8,8,1
9,1,9,6,9,3,6,2,5,7,0,1,2,0,9,1
9,5,0,2,8,1,2,1,6,2,2,9,6,1,9,1
2,1,2,3,0,6,1,1,4,1,2,5,1,3,9,1
2,1,3,5,5,0,9,4,1,0,1,9,5,4,9,1
8,6,2,7,4,0,4,8,7,4,9,0,0,6,9,1
8,0,0,2,2,0,6,2,0,1,8,0,4,7,9,1
4,4,3,4,5,1,8,4,3,4,7,8,7,8,9,1
2,2,1,0,1,2,0,0,0,0,8,4,1,0,0,2
3,6,2,2,4,5,0,2,0,3,0,9,4,1,0,2
3,8,2,2,9,2,7,4,2,8,4,1,8,2,0,2
6,3,6,9,5,8,8,2,3,0,2,2,1,4,0,2
4,4,5,5,9,6,3,3,7,3,2,1,4,5,0,2
4,7,9,2,7,4,9,5,7,2,6,8,6,6,0,2
4,3,8,9,7,6,1,4,5,1,4,4,9,7,0,2
1,9,3,8,7,6,1,6,0,4,6,8,1,9,0,2
5,0,2,0,7,2,4,5,1,4,3,1,4,0,1,2
0,5,5,2,0,8,4,1,5,5,5,2,6,1,1,2
6,6,2,9,4,8,5,0,7,1,3,2,8,2,1,2
8,6,2,6,9,4,3,6,1,6,6,0,0,4,1,2

;LN(2.6)
;LN(2.7)
;LN(2.8)
;LN(2.9)
;LN(3.0)
;LN(3.1)
;LN(3.2)
;LN(3.3)
;LN(3.4)
;LN(3.5)
;LN(3.6)
;LN(3.7)
;LN(3.8)
;LN(3.9)
;LN(4.0)
;LN(4.1)
;LN(4.2)
;LN(4.3)
;LN(4.4)
;LN(4.5)
;LN(4.6)
;LN(4.7)
;LN(4.8)
;LN(4.9)
;LN(5.0)
;LN(5.1)
;LN(5.2)
;LN(5.3)
;LN(5.4)
;LN(5.5)
;LN(5.6)
;LN(5.7)
;LN(5.8)
;LN(5.9)
;LN(6.0)
;LN(6.1)
;LN(6.2)
;LN(6.3)
;LN(6.4)
;LN(6.5)
;LN(6.6)
;LN(6.7)
;LN(6.8)
;LN(6.9)
;LN(7.0)
;LN(7.1)
;LN(7.2)
;LN(7.3)
;LN(7.4)
;LN(7.5)
;LN(7.6)
;LN(7.7)
;LN(7.8)
;LN(7.9)
;LN(8.0)
;LN(8.1)
;LN(8.2)
;LN(8.3)
;LN(8.4)
;LN(8.5)

DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
ARGUM
ARGUM1
ARGUM2

0,6,4,9,5,2,3,0,2,2,6,7,1,5,1,2
6,3,5,0,6,6,5,2,0,3,2,3,3,6,1,2
9,5,1,4,8,4,1,2,7,1,5,7,4,7,1,2
2,9,0,8,3,7,6,7,2,1,5,0,6,8,1,2
7,1,2,6,3,3,7,7,5,4,2,2,7,9,1,2
2,0,8,2,2,5,3,1,4,4,7,2,8,0,2,2
2,9,9,4,5,0,4,8,4,3,0,2,9,1,2,2
8,0,2,9,5,1,0,0,4,4,1,0,0,3,2,2
6,5,9,5,7,2,9,8,6,9,0,7,0,4,2,2
3,9,4,6,0,6,8,9,7,1,9,2,1,5,2,2
8,8,7,3,7,4,8,9,0,3,6,7,1,6,2,2
5,3,3,9,0,5,5,8,8,5,2,1,2,7,2,2
4,2,5,6,7,6,5,8,3,2,8,3,2,8,2,2
2,4,5,0,4,1,7,5,7,4,3,5,2,9,2,2

;LN(8.6)
;LN(8.7)
;LN(8.8)
;LN(8.9)
;LN(9.0)
;LN(9.1)
;LN(9.2)
;LN(9.3)
;LN(9.4)
;LN(9.5)
;LN(9.6)
;LN(9.7)
;LN(9.8)
;LN(9.9)

DB 19 DUP(NUMELEMENT DUP(0))
DB 19 DUP(NUMELEMENT DUP(0))
DB 19 DUP(NUMELEMENT DUP(0))

NUMDECIMALES EQU
DENOMINADORES DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
PARCIALES
FINAL
FACTORMULTIP
NUMEROMAXIMO
MINUENDO1
MINUENDO2
; TENEMOS QUE

9
NUMDECIMALES
(2*NUMDECIMALES)
(3*NUMDECIMALES)
(4*NUMDECIMALES)
(5*NUMDECIMALES)
(6*NUMDECIMALES)
(7*NUMDECIMALES)
(8*NUMDECIMALES)
(9*NUMDECIMALES)
(10*NUMDECIMALES)
(11*NUMDECIMALES)
(12*NUMDECIMALES)
(13*NUMDECIMALES)
(14*NUMDECIMALES)
(15*NUMDECIMALES)
(16*NUMDECIMALES)
(17*NUMDECIMALES)
(18*NUMDECIMALES)
(19*NUMDECIMALES)
DB
DB
DB
DB
DB
DB

DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)

,1,0,
,2,0,
,3,0,
,4,0,
,5,0,
,6,0,
,7,0,
,8,0,
,9,0,
,0,1,
,1,1,
,2,1,
,3,1,
,4,1,
,5,1,
,6,1,
,7,1,
,8,1,
,9,1,

21*NUMDECIMALES
20*NUMDECIMALES
19*NUMDECIMALES
18*NUMDECIMALES
17*NUMDECIMALES
16*NUMDECIMALES
15*NUMDECIMALES
14*NUMDECIMALES
13*NUMDECIMALES
12*NUMDECIMALES
11*NUMDECIMALES
10*NUMDECIMALES
09*NUMDECIMALES
08*NUMDECIMALES
07*NUMDECIMALES
06*NUMDECIMALES
05*NUMDECIMALES
04*NUMDECIMALES
03*NUMDECIMALES

DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP
DUP

(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)
(0)

19 DUP (NUMELEMENT DUP(0))


2*NUMELEMENT DUP(0)
2*NUMELEMENT DUP(0)
9,9,9,9,9,9,9,9 , NUMELEMENT-8 DUP(0)
0,0,0,0,0,0,0,0,0,1, NUMELEMENT-10 DUP(0)
NUMELEMENT DUP(0)

LOG10(X) = 0.4342944819032518 * LN(X) ENTONCES:

FACTORCONVERSION
DB 8,1,5,2,3,0,9,1,8,4,4,9,2,4,3,4, NUMELEMENT-16 DUP(0)
DIVISOR_10_A_LA_48 DB 48 DUP(0) ,1, NUMELEMENT-49 DUP(0)
APUNTADOR1 DW 0
APUNTADOR2 DW 0
ITERAC1 DW 0

M0
M1
M2
M3
M4
M5
M6
M7
M8
M8b
M81
M82
M9
M10
M11

DB'INGRESAR EL PRIMER SUMANDO (MAXIMO 16 DIGITOS):


$'
DB'INGRESAR EL SEGUNDO SUMANDO (MAXIMO 16 DIGITOS):
$'
DB'INGRESAR EL MINUENDO (MAXIMO 16 DIGITOS):
$'
DB'INGRESAR EL SUBTRAENDO (MAXIMO 16 DIGITOS):
$'
DB'INGRESAR EL MULTIPLICANDO (MAXIMO 40 DIGITOS):
$'
DB'INGRESAR EL MULTIPLICADOR (MAXIMO 16 DIGITOS):
$'
DB'INGRESAR EL DIVIDENDO (MAXIMO 32 DIGITOS):
$'
DB'INGRESAR EL DIVISOR (MAXIMO 16 DIGITOS):
$'
DB'RESULTADO:
$'
DB'RESULTADO: (SE LO HA CALCULADO CON 16 CIFRAS SIGNIFICATIVAS)$'
DB'LOGARITMO DEL NUMERO:
$'
DB'LOGARITMO DEL NUMERO: MENOS INFINITO
$'
DB'PULSE [ENTER] PARA REALIZAR OTRA OPERACION DEL MISMO TIPO$'
DB'PULSE [ESC] PARA REGRESAR AL MENU. $'
DB'ERROR: DIVISION POR CERO. $'

M12 DB'INGRESAR NUMERO(0-99999999):


N8
N8a
N8b
N8c
N8d

$'

DB'CALCULO DEL LOGARITMO DECIMAL DE UN NUMERO DE 0 A 99999999$'


DB'=========== DEMOSTRACION DE LA OPERACION SUMA ============$'
DB'=========== DEMOSTRACION DE LA OPERACION RESTA ===========$'
DB'====== DEMOSTRACION DE LA OPERACION MULTIPLICACION =======$'
DB'========= DEMOSTRACION DE LA OPERACION DIVISION ==========$'

NUMDIGITOS DW 0
CANTDIGITOS DW 0
DIRECCION DW 0
DIGITO DW 0
CARRY
DB 0
A
AA
XX
B
X
C
CC
E
F
MUL1
MUL2
PROD
MUL11
MUL22
PRODUCTO
OPR1
OPR2
OPR3
COCIENTE

DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB

NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT
NUMELEMENT

CANTIDAD1 DW 0
CANTIDAD2 DW 0
DIFERENCIA DW 0
TOTALCIFRAS DW 0
CONT1 DW 0
CONT2 DB 0
CEROIZQUIERDA DW 0
FLAG DW 0

DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)
DUP(0)

FLAGERROR DW 0
ATRIBUTO DB 0
P1 DB'C A L C U L O S
P2 DB' OPCIONES $'
P3
P4
P5
P6
P7
P71
P33
P44
P55
P66
P77
P88

C O N

E N S A M B L A D O R $'

DB'1.- SUMA...........................$'
DB'2.- RESTA..........................$'
DB'3.- MULTIPLICACION.................$'
DB'4.- DIVISION.......................$'
DB'5.- LOGARITMO BASE 10..............$'
DB'SALIR DEL PROGRAMA............[ESC]$'
DB'REALIZAR LA SUMA ENTRE DOS NUMEROS POSITIVOS.
DB'REALIZAR LA RESTA ENTRE DOS NUMEROS POSITIVOS.
DB'REALIZAR LA MULTIPLICACION ENTRE DOS NUMEROS ENTEROS POSITIVOS.
DB'REALIZAR LA DIVISION ENTRE DOS NUMEROS ENTEROS POSITIVOS.
DB'CALCULAR EL LOGARITMO DECIMAL DE UN NUMERO ENTRE 0 Y 99999999
DB'SALIDA DEL PROGRAMA.

$'
$'
$'
$'
$'
$'

P8 DB'
Escoja una opcion con [ENTER]
$'
P9 DB'[SPACE].....INGRESAR INFORMACION.
$'
P10 DB'[M].........REGRESAR AL MENU PRINCIPAL. $'
P12 DB'
P13 DB'
P21
P22
P23
P24
P25
P26
P27
P30

$'

DB'PROGRAMA REALIZADO EN LENGUAJE ENSAMBLADOR$'


DB'==========================================$'
DB' PARA PROCESADORES INTEL 80x86 $'
DB'
SEPTIEMBRE-2006
$'
DB'
REALIZADO POR:
$'
DB'
OTTO FRANCO S.
$'
DB'
=====================
$'
DB' ACERCA DE $'

P60 DB'BYTES TRASMITIDOS: $'


P61 DB'TOTAL DE BYTES:
$'
MENSAJES DW P3,P4,P5,P6,P7,P71
MENSAJES2 DW P33,P44,P55,P66,P77,P88
INDICE DW 0
FILA1 DB 0

DATASG ENDS
;*******************************************************************
CODESG SEGMENT PARA 'CODE'
PRINCIPAL PROC FAR
ASSUME CS:CODESG, DS:DATASG, SS:STACKSG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS, AX
;************************************************************************

$'

MOV AH,0
MOV AL,12H
INT 10H

;INICIALIZA MODO GRAFICO.

LABEL0:
MOV INDICE,0
SETATRIBUTO 3,15
LLENAR 0,0,79,29,219
SETATRIBUTO RED,WHITE
LLENAR 4,1,74,3,219
MARCO2 4,1,74,3
PUTMSG 10,2,P1
SETATRIBUTO 0,0
LLENAR 19,8,60,23,219
SETATRIBUTO 7,15
LLENAR 18,7,59,22,219
MARCO2 18,7,59,22
SETATRIBUTO 7,14
LLENAR 34,7,43,7,219
PUTMSG 34,7,P2
SETATRIBUTO 7,15
LLENAR 1,27,77,29,219
MARCO2 1,27,77,29
SETATRIBUTO 1,15
LLENAR 19,21,58,21,219
PUTMSG 19,21,P8
PUTMSG3 0,1
PUTMSG3 1,0
PUTMSG3 2,0
PUTMSG3 3,0
PUTMSG3 4,0
PUTMSG3 5,0
PUTMSG4 0
LABEL1:
GETCH
CMP AL, 27
JE LABEL21
CMP AL, 27
JNE LABEL2
LABEL21:
SETATRIBUTO BLACK,WHITE
CALL CLRSCR_12H
; LIMPIA LA PANTALLA en el modo de video 12h.
MOV AH,0
MOV AL,3
INT 10H
;REGRESAR AL MODO TEXTO.
CALL CLRSCR_03H
; LIMPIA LA PANTALLA en el modo de video 03h.
ENCENDERCURSOR
MOV AH,4CH
INT 21H
;SALE AL SISTEMA OPERATIVO.
LABEL2:
CMP AL,DOWN
JE LABEL3
JMP LABEL5
LABEL3:
PUTMSG3 INDICE,0
CMP INDICE,5
JB LABEL4
MOV INDICE,-1
LABEL4:

INC INDICE
PUTMSG3 INDICE,1
PUTMSG4 INDICE
JMP LABEL1

;PINTA EL MENSAJE COMO SELECCIONADO

LABEL5:
CMP AL,UP
JE LABEL6
JMP LABEL7
LABEL6:
PUTMSG3 INDICE,0
CMP INDICE,0
JA LABEL8
MOV INDICE,6

;PINTA EL MENSAJE COMO NO SELECCIONADO

LABEL8:
DEC INDICE
PUTMSG3 INDICE,1
PUTMSG4 INDICE
JMP LABEL1
LABEL7:
CMP AL,'1'
JNE LABEL16
CALL SUMA
JMP LABEL0
LABEL16:
CMP AL,'2'
JNE LABEL17
CALL RESTA
JMP LABEL0
LABEL17:
CMP AL,'3'
JNE LABEL18
CALL MULTIPLICACION
JMP LABEL0
LABEL18:
CMP AL,'4'
JNE LABEL19
CALL DIVISION
JMP LABEL0
LABEL19:
CMP AL,'5'
JNE LABEL20
CALL LOGARITMO
JMP LABEL0
LABEL20:
CMP AL,13
JE LABEL9
JMP LABEL1

;ENTER.

LABEL9:
CMP INDICE,0
JNE LABEL10
CALL SUMA
LABEL10:
CMP INDICE,1
JNE LABEL11
CALL RESTA
LABEL11:
CMP INDICE,2
JNE LABEL12
CALL MULTIPLICACION

LABEL12:
CMP INDICE,3
JNE LABEL13
CALL DIVISION
LABEL13:
CMP INDICE,4
JNE LABEL22
CALL LOGARITMO
LABEL22:
CMP INDICE,5
JNE LABEL14
SETATRIBUTO BLACK,WHITE
CALL CLRSCR_12H
; LIMPIA LA PANTALLA en el modo de video 12h.
MOV AH,0
MOV AL,3
INT 10H
;REGRESAR AL MODO TEXTO.
CALL CLRSCR_03H
; LIMPIA LA PANTALLA en el modo de video 03h.
ENCENDERCURSOR
MOV AH,4CH
INT 21H
;SALE AL SISTEMA OPERATIVO.
LABEL14:
JMP LABEL0
PRINCIPAL ENDP

LOGARITMO PROC NEAR


LOGA1:
SETATRIBUTO GREEN,GREEN
LLENAR 0,0,79,29,219
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 2,1,77,27,219
MARCO2 2,1,77,27
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 7,3,72,3,219
PUTMSG 7,3,N8
SETATRIBUTO RED,WHITE
LLENAR 15,7,63,11,219
MARCO2 15,7,63,11
PUTMSG 23,9,M12
GOTOXY 54,9
INGRESARENTERO1 ARGUM1,8 ;INGRESAMOS UN NUMERO DEL 0 AL 99999999

;PRIMERO ATENDEMOS EL CASO ESPECIAL:


CMP CANTDIGITOS,0
JE LOGA2

;SE PUDO HABER INGRESADO UN CERO.


;SIENDO SU LOGARITMO MENOS INFINITO.

JMP LOGA9
LOGA2:
SETATRIBUTO CYAN,WHITE
LLENAR 7,15,71,19,219
MARCO2 7,15,71,19
PUTMSG 12,17,M82 ;MENOS INFINITO
SETATRIBUTO LIGHTCYAN,RED
PUTMSG 11,23,M9
PUTMSG 11,24,M10
JMP LOGA7
LOGA9:
;CUANDO EL NUMERO INGRESADO ES ENTRE 1 Y 99999999:
DIVIDE NUMEROMAXIMO, ARGUM1 , FACTORMULTIP
MOV BP,DIGDIVIS+DIGDIVIS-1
MULTIPLICA ARGUM1, FACTORMULTIP[BP],ARGUM2
RESTAR MINUENDO1 , ARGUM2 , ARGUM

MOV APUNTADOR1,0
MOV ITERAC1, 0
LOGA3:
MOV BP,APUNTADOR1
MULTIPLICA ARGUM[BP], ARGUM[0] , ARGUM[BP+NUMELEMENT]
MOV BP,APUNTADOR1
;IMPRIMEENTERO ARGUM[BP+NUMELEMENT] , NUMELEMENT
;PUTCH 13
;PUTCH 10
ADD APUNTADOR1, NUMELEMENT
INC ITERAC1
CMP ITERAC1,18
JNE LOGA3
;GETCH
MOV APUNTADOR1,0
MOV ITERAC1, 0
LOGA6:
MOV BP,APUNTADOR1
DIVIDE ARGUM[BP], DENOMINADORES[BP] , PARCIALES[BP]
MOV BP,APUNTADOR1
;IMPRIMEPARCIAL PARCIALES[BP]
;PUTCH 13
;PUTCH 10
ADD APUNTADOR1, NUMELEMENT
INC ITERAC1
CMP ITERAC1,19
JNE LOGA6
;GETCH
RESTAR FINAL, FINAL, FINAL
MOV AL,FACTORMULTIP[DIGDIVIS+DIGDIVIS]
MOV AH,0

MOV
MUL
ADD
MOV

CX,10
CX
AL,FACTORMULTIP[DIGDIVIS+DIGDIVIS-1]
AH,0

;EN "AX" SE ENCUENTRA UN NUMERO ENTRE 10 Y 99 QUE SE UTILIZARA


;PARA DIRECCIONAR LA TABLA "LOGTABL1" QUE CONTIENE LOS SUMANDOS
;CORRECTORES QUE VAN A COMPENSAR LA MULTIPLICACION QUE SE LE HIZO
;AL ARGUMENTO DE LA SERIE PARA QUE DICHO ARGUMENTO SEA UN NUMERO
;INFERIOR A 0.1 PARA UNA RAPIDA CONVERGENCIA DE LA SERIE.
MOV CX,4
SHL AX,CL ;MULTIPLICAMOS AX POR 16 PORQUE CADA LINEA DE LA TABLA
;"LOGTABL1" OCUPA 16 BYTES.
MOV SI,AX
MOV DI,17
LOGA5:
MOV AL,LOGTABL1[SI]
MOV FINAL[DI],AL
INC DI
INC SI
CMP DI,33
JB LOGA5
MOV APUNTADOR1,0
MOV ITERAC1, 0
LOGA4:
MOV BP,APUNTADOR1
SUMAR FINAL, PARCIALES[BP] , FINAL
MOV BP,APUNTADOR1
;IMPRIMEPARCIAL PARCIALES[BP]
;PUTCH 13
;PUTCH 10
ADD APUNTADOR1, NUMELEMENT
INC ITERAC1
CMP ITERAC1,19
JNE LOGA4
;EL RESULTADO ESTA EN LOGARITMO NATURAL,
;AHORA CONVERTIREMOS A LOGARITMO BASE 10 MULTIPLICANDO
;POR EL FACTOR DE CONVERSION:
MULTIPLICA
DIVIDE

FINAL, FACTORCONVERSION
, FINAL
FINAL, DIVISOR_10_A_LA_48 , FINAL

;AHORA, TODO EL CALCULO ANTERIOR SE HA HECHO COMO SI EL NUMERO


;DE MAXIMO 8 DIGITOS INGRESADO POR TECLADO SE TRATARA DE UN DECIMAL,
;ES DECIR EL USUARIO INGRESA 912578 , Y EN REALIDAD HEMOS CALCULADO
;HASTA AHORA EL LOGARITMO DE 0.912578 (ESTO ES PARA PODER UTILIZAR
;LA SERIE CONVERGENTE EN VALORES INFERIORES A UNO).
;PARA COMPENSAR SIMPLEMENTE RESTAMOS EL NUMERO DE DIGITOS INGRESADOS
;(SIN CEROS IZQUIERDOS) CON EL VALOR ALMACENADO EN "FINAL",
;CON ESTO TERMINAMOS TODO EL CALCULO.
MOV AX,CANTDIGITOS
MOV MINUENDO2[DIGDIVIS+DIGDIVIS],AL

RESTAR MINUENDO2, FINAL, FINAL


SETATRIBUTO CYAN,WHITE
LLENAR 7,15,71,19,219
MARCO2 7,15,71,19
PUTMSG 12,17,M81
GOTOXY 35,17
IMPRIMEPARCIAL FINAL
SETATRIBUTO LIGHTCYAN,RED
PUTMSG 11,23,M9
PUTMSG 11,24,M10
LOGA7:
GETCH
CMP AL, 27
JE LOGA8
CMP AL, 27
JE LOGA8
CMP AL, 13
JNE LOGA7
JMP LOGA1
LOGA8:
RET
LOGARITMO ENDP

SUMA PROC NEAR


SUMA4:
SETATRIBUTO GREEN,GREEN
LLENAR 0,0,79,29,219
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 2,1,77,27,219
MARCO2 2,1,77,27
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 7,3,72,3,219
PUTMSG 7,3,N8a
SETATRIBUTO RED,WHITE
LLENAR 4,5,75,8,219
PUTMSG 6,6,M0
MARCO2 4,5,75,8
GOTOXY 6,7
INGRESARENTERO OPR1, 16
SETATRIBUTO RED,WHITE
LLENAR 4,11,75,14,219
PUTMSG 6,12,M1
MARCO2 4,11,75, 14
GOTOXY 6,13

INGRESARENTERO OPR2, 16
SUMAR OPR1,OPR2,OPR3
SETATRIBUTO CYAN,WHITE
LLENAR 4,17,75, 20,219
PUTMSG 6,18,M8
MARCO2 4,17,75, 20
GOTOXY 6,19
IMPRIMEENTERO OPR3 , NUMELEMENT
SETATRIBUTO LIGHTCYAN,RED
PUTMSG 10,22,M9
PUTMSG 10,23,M10
SUMA5:

SUMA3:

GETCH
CMP AL, 27
JE SUMA3
CMP AL, 27
JE SUMA3
CMP AL, 13
JNE SUMA5
JMP SUMA4
NOP
RET

SUMA ENDP

PSUMAR PROC NEAR


MOV CARRY,0
MOV A[DIGSUMA-1],0
MOV B[DIGSUMA-1],0

SUMA1:

MOV
MOV
NOP
MOV
ADD
ADD
MOV

CX,DIGSUMA
SI,0
AL,A[SI]
AL,B[SI]
AL,CARRY
CARRY,0

SUMA2:

CMP AL,9
JLE SUMA2
SUB AL,10
MOV CARRY,1
NOP
MOV C[SI],AL
INC SI
LOOP SUMA1
RET

PSUMAR ENDP

RESTA PROC NEAR


REST5:
SETATRIBUTO GREEN,GREEN
LLENAR 0,0,79,29,219

SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 2,1,77,27,219
MARCO2 2,1,77,27
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 7,3,72,3,219
PUTMSG 7,3,N8b
SETATRIBUTO RED,WHITE
LLENAR 4,5,75,8,219
PUTMSG 6,6,M2
MARCO2 4,5,75,8
GOTOXY 6,7
INGRESARENTERO OPR1, 16
SETATRIBUTO RED,WHITE
LLENAR 4,11,75,14,219
PUTMSG 6,12,M3
MARCO2 4,11,75,14
GOTOXY 6,13
INGRESARENTERO OPR2, 16
RESTAR OPR1,OPR2,OPR3
SETATRIBUTO CYAN,WHITE
LLENAR 4,17,75,20,219
PUTMSG 6,18,M8
MARCO2 4,17,75,20
GOTOXY 6,19
CMP OPR3[DIGSUMA-1],0
JE REST3
MOV DL,45
MOV AH,02H
PUTCH1 DL
;INT 21H
COMPLEMENTAA10 OPR3
REST3:
MOV OPR3[DIGSUMA-1],0
IMPRIMEENTERO OPR3 , NUMELEMENT
SETATRIBUTO LIGHTCYAN,RED
PUTMSG 10,22,M9
PUTMSG 10,23,M10
REST6:

REST4:

GETCH
CMP AL, 27
JE REST4
CMP AL, 27
JE REST4
CMP AL,13
JNE REST6
JMP REST5
NOP
RET

RESTA ENDP
RESTARPROC PROC NEAR

MOV CARRY,0
MOV A[DIGSUMA-1],0
MOV B[DIGSUMA-1],0
MOV C[DIGSUMA-1],0
COMPLEMENTAA10 B

REST1:

MOV
MOV
MOV
NOP
MOV
ADD
ADD
MOV

CARRY,0
CX,DIGSUMA
SI,0
AL,A[SI]
AL,B[SI]
AL,CARRY
CARRY,0

CMP AL,9
JLE REST2
SUB AL,10
MOV CARRY,1
REST2:
NOP
MOV C[SI],AL
INC SI
LOOP REST1
RET
RESTARPROC ENDP

COMPLEMENTAA10PROC PROC NEAR


MOV CX,DIGSUMA
COMPL1:
NOP
MOV SI,CX
MOV BX,DIRECCION
SUB SI,1
MOV AL,[BX][SI]
MOV DL,9
SUB DL,AL
MOV [BX][SI],DL
LOOP COMPL1

COMPL2:
COMPL3:

MOV
MOV
ADD
MOV
CMP
JLE
MOV
SUB
MOV
NOP
MOV
MOV
NOP
MOV
ADD
MOV
CMP
JLE

CARRY,0
AL,1
[BX][0],AL
AL,9
[BX][0],AL
COMPL2
AL,10
[BX][0],AL
CARRY,1
CX,DIGSUMA-1
SI,1
AL,[BX][SI]
AL,CARRY
CARRY,0
AL,9
COMPL4

SUB AL,10
MOV CARRY,1
COMPL4:
NOP
MOV [BX][SI],AL
INC SI
LOOP COMPL3
RET
COMPLEMENTAA10PROC ENDP

MULTIPLICACION PROC NEAR


MULT8:
SETATRIBUTO GREEN,GREEN
LLENAR 0,0,79,29,219
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 2,1,77,27,219
MARCO2 2,1,77,27
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 7,3,72,3,219
PUTMSG 7,3,N8c
SETATRIBUTO RED,WHITE
LLENAR 4,5,75,8,219
PUTMSG 6,6,M4
MARCO2 4,5,75,8
GOTOXY 6,7
INGRESARENTERO MUL11 ,40
SETATRIBUTO RED,WHITE
LLENAR 4,11,75,14,219
PUTMSG 6,12,M5
MARCO2 4,11,75,14
GOTOXY 6,13
INGRESARENTERO MUL22 ,16
MULTIPLICA MUL11,MUL22,PRODUCTO
SETATRIBUTO CYAN,WHITE
LLENAR 4,17,75,20,219
PUTMSG 6,18 ,M8
MARCO2 4,17,75,20
GOTOXY 6,19
IMPRIMEENTERO PRODUCTO ,NUMELEMENT
SETATRIBUTO LIGHTCYAN,RED
PUTMSG 10,22,M9
PUTMSG 10,23,M10
MULT9:
GETCH
CMP AL, 27
JE MULT7
CMP AL, 27
JE MULT7
CMP AL, 13
JNE MULT9

JMP MULT8
NOP
RET
MULTIPLICACION ENDP
MULT7:

PMULTIPLICA PROC NEAR


MOV CX,NUMELEMENT
MULT1:
NOP
MOV SI,CX
MOV PROD[SI-1] , 0
LOOP MULT1
MULT4:

MULT5:

MULT3:

MULT6:

MOV CONT1,0
NOP
MOV DI,CONT1
CMP MUL2[DI],0
JE MULT2
MOV CONT2,0
NOP
MOV BP,CONT1
MOV CX,DIGMULT1
MOV SI,0
MOV CARRY,0
NOP
MOV AL,MUL1[SI]
ADD AL,CARRY
ADD AL,PROD[BP+SI]
MOV CARRY,0
CMP AL,10
;SISTEMA DE NUMERACION 16, 10, ETC.
JB MULT6
MOV CARRY,1
SUB AL,10
;SISTEMA DE NUMERACION 16, 10, ETC.
NOP
MOV PROD[BP+SI],AL
INC SI
LOOP MULT3

MOV AL,CARRY
ADD PROD[BP+DIGMULT1],AL
INC CONT2
MOV AL,MUL2[DI]
CMP CONT2,AL
JNE MULT5
MULT2:
NOP
INC CONT1
CMP CONT1,DIGMULT2
JNE MULT4
RET
PMULTIPLICA ENDP

DIVISION PROC NEAR


DIV16:
SETATRIBUTO GREEN,GREEN
LLENAR 0,0,79,29,219
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 2,1,77,27,219

MARCO2 2,1,77,27
SETATRIBUTO LIGHTCYAN,BLACK
LLENAR 7,3,72,3,219
PUTMSG 7,3,N8d
SETATRIBUTO RED,WHITE
LLENAR 4,5,75,8,219
PUTMSG 6, 6 ,M6
MARCO2 4,5,75, 8
GOTOXY 6, 7
INGRESARENTERO

OPR1, DIGDIVIS+DIGDIVIS

;32

SETATRIBUTO RED,WHITE
LLENAR 4,11,75, 14,219
PUTMSG 6,12 ,M7
MARCO2 4,11,75, 14
GOTOXY 6,13
INGRESARENTERO

OPR2, DIGDIVIS

;16

DIVIDE OPR1,OPR2,COCIENTE
SETATRIBUTO CYAN,WHITE
LLENAR 4,17,75,20,219
CMP FLAGERROR,0
JE DIV30
PUTMSG 6,19,M11
JMP DIV18
DIV30:
PUTMSG 6,18 ,M8b
MARCO2 4,17,75, 20
GOTOXY 6,19
;CALL IMPRIMECOCIENTE
;IMPRIMIR COCIENTE QUE ESTA EN ARREGLO COCIENTE[31..0]
CALL IMPRIMECOCIENTE2
DIV18:
SETATRIBUTO LIGHTCYAN,RED
PUTMSG 10,22,M9
PUTMSG 10,23,M10
DIV26:
GETCH
CMP AL, 27
JE DIV15
CMP AL, 27
JE DIV15
CMP AL, 13
JNE DIV26
JMP DIV16
NOP
RET
DIVISION ENDP
DIV15:

PDIVIDE PROC NEAR


MOV CANTIDAD1,NUMELEMENT
MOV CANTIDAD2,NUMELEMENT
MOV FLAGERROR,0
;VERIFICAR QUE EL DIVIDENDO NO SEA CERO PARA
;ELIMINARLE CEROS A LA IZQUIERDA.
MOV CX,NUMELEMENT
DIV22:
MOV SI,CX
CMP AA[SI-1],0
JNE DIV21
LOOP DIV22
MOV CANTIDAD1,1
JMP DIV19
;ELIMINAR CEROS A LA IZQUIERDA DEL ARREGLO "AA".
DIV21:
CMP AA[NUMELEMENT-1] , 0
JNE DIV19
MOV SI, NUMELEMENT-1
DIV20:
MOV
MOV
DEC
CMP
JNE
MOV
DEC
JMP

AL,AA[SI-1]
AA[SI],AL
SI
SI,0
DIV20
AA[0],0
CANTIDAD1
DIV21

DIV19:
MOV SI,DIGDIVIS+DIGDIVIS-1
MOV DI,NUMELEMENT-1
DIV27:
MOV
MOV
DEC
DEC
CMP
JNE

AL,AA[DI]
A[SI],AL
SI
DI
SI,-1
DIV27

;VERIFICAR QUE EL DIVISOR NO SEA CERO.


DIV11:

MOV CX,NUMELEMENT
NOP
MOV SI,CX
CMP XX[SI-1],0
JNE DIV25
LOOP DIV11
JMP DIV17
;ELIMINAR CEROS A LA IZQUIERDA DEL ARREGLO "XX".

DIV25:

CMP XX[NUMELEMENT-1] , 0
JNE DIV28
MOV SI, NUMELEMENT-1
DIV24:
MOV
MOV
DEC
CMP
JNE
MOV
DEC
JMP

AL,XX[SI-1]
XX[SI],AL
SI
SI,0
DIV24
XX[0],0
CANTIDAD2
DIV25

DIV28:
MOV SI,DIGDIVIS-1
MOV DI,NUMELEMENT-1
DIV29:
MOV
MOV
DEC
DEC
CMP
JNE

DIV10:

AL,XX[DI]
X[SI],AL
SI
DI
SI,-1
DIV29

MOV X[DIGDIVIS] , 0
MOV E[DIGDIVIS-1] , 0
;EL ARREGLO "E" ES COMO UN DIVIDENDO TEMPORAL CON EL QUE
;SE COMPARARA EL ARREGLO "X" (EL DIVISOR) PARA IR FIJANDO
;LOS DIGITOS C[] DEL COCIENTE.

DIV1:

MOV CX,DIGDIVIS-1
NOP
MOV SI,CX
MOV AL, A[SI+DIGDIVIS]
MOV E[SI-1] , AL
LOOP DIV1
;"DI" ES UN CONTADOR DESCENDENTE QUE DETERMINA EL NUMERO DE
;CIFRAS SIGNIFICATIVAS QUE TENDRA EL COCIENTE, AL MISMO TIEMPO
;ES EL NUMERO DE ITERACIONES+1 DEL LAZO PRINCIPAL.

DIV9:

MOV DI,DIGDIVIS
NOP
MOV C[DI] ,0
;ACTUALIZAMOS ARREGLO "E" QUE VA RECORRIENDO LOS DIGITOS
;DEL DIVIDENDO DE IZQUIERDA A DERECHA. AL INICIO CONTIENE
;A[15]..A[8] Y AL FINAL UN ARREGLO QUE TERMINA EN A[0]
; ( NO NECESARIAMENTE A[7]..A[0] ).

DIV2:

MOV CX,DIGDIVIS
NOP
MOV SI,CX
MOV AL, E[SI-1]
MOV E[SI],AL
LOOP DIV2

MOV AL,A[DI]
MOV E, AL
;
;
;
;
;
;
;
DIV7:
DIV5:

LA IDEA DEL SIGUIENTE "LOOP DIV5" ES LA DE INCREMENTAR C[DI]


SI EL ARREGLO TEMPORAL "E" ES MAYOR O IGUAL QUE EL ARREGLO "X"
CUANDO INCREMENTO C[DI] TAMBIEN PROCEDEMOS A RESTAR E[] - X[].
ESTA RESTA LA HACEMOS EN "LOOP DIV6".
CUANDO ENCONTRAMOS EN "LOOP DIV5" QUE "E" ES MENOR QUE "X"
QUE EN ALGUN MOMENTO DEBE OCURRIR, ENTONCES SALTAMOS A DIV4
DONDE VERIFICAMOS "DI" PARA VER SI LA DIVISION HA TERMINADO.

MOV CX,DIGDIVIS+1
NOP
MOV SI,CX
MOV AL,X[SI-1]
CMP E[SI-1] ,AL
JA DIV3
JB DIV4
LOOP DIV5
; INCREMENTAMOS C[DI] Y HACEMOS E[8..0] = E[8..0] - X[8..0].

DIV3:

DIV12:
DIV6:

DIV13:

DIV14:

NOP
INC C[DI]
MOV CARRY,0
MOV AL,E
SUB AL,X
MOV E,AL
CMP E,0
JGE DIV12
ADD E,10
;SISTEMA DE NUMERACION 16, 10, ETC.
MOV CARRY,1
NOP
MOV CX,DIGDIVIS
MOV SI,0
NOP
INC SI
MOV AL,E[SI]
SUB AL,X[SI]
CMP CARRY,0
JE DIV13
SUB AL,1
NOP
MOV CARRY,0
CMP AL,0
JGE DIV14
MOV CARRY,1
ADD AL,10
;SISTEMA DE NUMERACION 16, 10, ETC.
NOP
MOV E[SI],AL
LOOP DIV6
JMP DIV7
;VERIFICAR "DI" PARA VER SI SALIMOS DE LA ITERACION PRINCIPAL.

DIV4:

NOP
CMP DI,0
JE DIV8
DEC DI

JMP DIV9
;MENSAJE DE ERROR SI EL DIVISOR ES CERO.
DIV17:
MOV FLAGERROR,1
RET
DIV8:
MOV AX,CANTIDAD1
SUB AX,CANTIDAD2
MOV DIFERENCIA,AX
MOV SI,DIGDIVIS+DIGDIVIS+DIGDIVIS+DIGDIVIS-1

;63

DIV31:
MOV
DEC
CMP
JNE

CC[SI],0
SI
SI,-1
DIV31

MOV DI, DIFERENCIA


ADD DI, DIGDIVIS+DIGDIVIS
MOV SI,DIGDIVIS

;32

;16

DIV32:
MOV
MOV
DEC
DEC
CMP
JNE

AL,C[SI]
CC[DI],AL
SI
DI
SI,-1
DIV32

;COCIENTE ESTA EN ARREGLO CC[31..0]


RET
PDIVIDE ENDP

INGRESARENTEROPROC PROC NEAR


PUSH DI
;En el lazo siguiente se encera primero el arreglo que se va a llenar con l
os digitos
;que el usuario va a digitar por teclado, se asume que todos los arreglos q
ue almacenan
;numeros de varios digitos tienen exactamente NUMELEMENT digitos:
MOV CX,NUMELEMENT
OBTIE1:
MOV
SUB
MOV
MOV
MOV

DI,CX
DI,1
BX,DIRECCION
AL,0
[BX][DI],AL

;Numero de elementos del arreglo.

LOOP OBTIE1
OBTIE2:

MOV
MOV
INT
CMP
JE
CMP
JE
CMP
JE
JMP

SI,0
AH,08H
21H
SI,0
OBTIE3
SI,NUMDIGITOS
OBTIE6
AL,0DH
OBTIE6
OBTIE3

OBTIE6:
JMP OBTIE5
OBTIE3:
VALIDAASCII AL
CMP DX,0
JE OBTIE2
MOV AH,0
MOV DIGITO,AX
MOV CANTDIGITOS,SI
MOV AH,02H
MOV DX,DIGITO
PUTCH1 DL
;INT 21H
ASCIITOHEX DIGITO
MOV DIGITO,DX
MOV DI,NUMDIGITOS
SUB DI,1
SUB DI,SI
MOV AX,DIGITO
MOV BX,DIRECCION
MOV [BX][DI],AL
INC SI
JMP OBTIE2
OBTIE5:
;Hasta aqui los digitos ingresados se han almacenado en los bytes mas
significativos
;del arreglo cuya direccion efectiva es [BX], pero conviene desplazar
los hacia los
;bytes menos significativos para que las operaciones de SUMA, RESTA,
MULTIPLICACION,
;y DIVISION se efectuen correctamente:
ADD CANTDIGITOS,1
MOV SI, 0
MOV DI, NUMDIGITOS
SUB DI, CANTDIGITOS

;AQUI CANTDIGITOS vale minimo 1 y maximo NU

MDIGITOS.
;En este momento DI apunta al elemento del arreglo que tiene el digit
o menos
;significativo que el usuario ingreso por teclado.
;El siguiente lazo desplaza los digitos ingresados por teclado hacia
los bytes
;menos significativos de [BX]:
OBTIE4:
MOV AL,[BX][DI]
MOV [BX][SI],AL

INC
INC
CMP
JNE

DI
SI
SI, CANTDIGITOS
OBTIE4

;El siguiente lazo rellena los bytes restantes de [BX] con ceros:
OBTIE8:
CMP SI, NUMDIGITOS
JE OBTIE9
MOV AL,0
MOV [BX][SI],AL
INC SI
JMP OBTIE8
OBTIE9:
POP DI
RET
INGRESARENTEROPROC ENDP

INGRESARENTEROPROC1 PROC NEAR


;Este procedimiento difiere del anterior en que los digitos ingresados por t
eclado se
;almacenan en los bytes mas significativos del arreglo cuya direccion efecti
va es [BX],
;pero eliminando siempre los ceros a la izquierda que no debieron haberse in
gresado.
;Este procedimiento se utiliza solamente en la operacion del calculo del LOG
ARITMO.
PUSH DI
MOV CX,NUMELEMENT
OBTIE21:
MOV DI,CX
SUB DI,1
MOV BX,DIRECCION
MOV AL,0
MOV [BX][DI],AL
LOOP OBTIE21
OBTIE22:

MOV
MOV
INT
CMP
JE
CMP
JE
CMP
JE
JMP

SI,0
AH,08H
21H
SI,0
OBTIE23
SI,NUMDIGITOS
OBTIE26
AL,0DH
OBTIE26
OBTIE23

OBTIE26:
JMP OBTIE25
OBTIE23:
VALIDAASCII AL
CMP DX,0
JE OBTIE22
MOV AH,0
MOV DIGITO,AX

MOV AH,02H
MOV DX,DIGITO
PUTCH1 DL
;INT 21H
ASCIITOHEX DIGITO
MOV DIGITO,DX
MOV
SUB
SUB
MOV
MOV
MOV
MOV

CX,NUMDIGITOS
CX,1
CX,SI
DI,CX
BX,DIRECCION
AX,DIGITO
[BX][DI],AL

INC SI
JMP OBTIE22
OBTIE25:
;EL NUMERO HA SIDO INGRESADO PERO LE SACAREMOS CEROS A LA IZQUIERDA:
MOV CANTDIGITOS,SI
MOV BX,DIRECCION
MOV CX,NUMDIGITOS
OBTIE24:
MOV DI,CX
SUB DI,1
MOV AL,0
CMP BYTE PTR[BX][DI],AL
JNE OBTIE27
LOOP OBTIE24
;TODOS LOS DIGITOS SON CERO.
MOV CANTDIGITOS,0
JMP OBTIE28
OBTIE27:
;NO TODOS LOS DIGITOS SON CERO, PERO NO DEBE HABER CEROS A LA IZQUIERDA.
OBTIE29:
MOV
SUB
MOV
CMP
JNE

DI,NUMDIGITOS
DI,1
AL,0
BYTE PTR[BX][DI],AL
OBTIE28

MOV DI,NUMDIGITOS
OBTIE30:
MOV
MOV
DEC
CMP
JNE
MOV
MOV
DEC
JMP

AL,[BX][DI-2]
[BX][DI-1],AL
DI
DI,1
OBTIE30
AL,0
[BX],AL
CANTDIGITOS
OBTIE29

OBTIE28:
POP DI
RET
INGRESARENTEROPROC1 ENDP

IMPRIMEENTEROPROC PROC NEAR


MOV DI,0
MOV CEROIZQUIERDA,0
MOV AX,CANTIDAD1
ADD AX,CANTIDAD2
MOV TOTALCIFRAS,NUMELEMENT
MOV CX,NUMDIGITOS
IMPRIMIR11:
INC DI
MOV SI,CX
MOV BX,DIRECCION
MOV DL,[BX][SI-1]
MOV DH,0
CMP DX,0
JNE IMPRIMIR12
CMP CEROIZQUIERDA,0
JE IMPRIMIR13
IMPRIMIR12:
HEXTOASCII DX
MOV AH,02H
PUTCH1 DL
;INT 21H
MOV CEROIZQUIERDA,1
IMPRIMIR13:
CMP DI,TOTALCIFRAS
JE IMPRIMIR14
DEC CX
CMP CX,0
JE IMPRIMIR14
JMP IMPRIMIR11
IMPRIMIR14:
CMP CEROIZQUIERDA,0
JNE IMPRIMIR15
PUTCH1 '0'
IMPRIMIR15:NOP
RET
IMPRIMEENTEROPROC ENDP

IMPRIMECOCIENTE PROC NEAR


MOV AX,CANTIDAD1
SUB AX,CANTIDAD2
MOV DIFERENCIA,AX
MOV CX,DIGDIVIS+1
IMPRIMIR1:
MOV SI,CX
MOV DL,C[SI-1]
MOV DH,0
HEXTOASCII DX
MOV AH,02H
PUTCH1 DL
;INT 21H
CMP CX,DIGDIVIS+1
JNE IMPRIMIR2

MOV AH,02H
MOV DL,2EH
PUTCH1 DL
;INT 21H
IMPRIMIR2:
DEC CX
CMP CX,0
JE IMPRIMIR4
JMP IMPRIMIR1
IMPRIMIR4:
MOV AH,02H
MOV DL,' '
PUTCH1 DL
;INT 21H
MOV DL,'1'
PUTCH1 DL
;INT 21H
MOV DL,'0'
PUTCH1 DL
;INT 21H
MOV DL,'^'
PUTCH1 DL
;INT 21H
MOV DL,'('
PUTCH1 DL
;INT 21H
CMP DIFERENCIA,0
JGE IMPRIMIR3
MOV AH,02H
MOV DL,2DH
PUTCH1 DL
;INT 21H
NEG DIFERENCIA
IMPRIMIR3: NOP
MOV DX,DIFERENCIA
HEXTOASCII DX
MOV AH,02H
PUTCH1 DL
;INT 21H
MOV DL,')'
PUTCH1 DL
;INT 21H
RET
IMPRIMECOCIENTE ENDP

IMPRIMECOCIENTE2 PROC NEAR


MOV FLAG,0
MOV CX,DIGDIVIS+DIGDIVIS+DIGDIVIS+DIGDIVIS
IMPRIMIR21:
MOV SI,CX
MOV DL,COCIENTE[SI-1]
MOV DH,0
CMP DX,0
JE IMPRIMIR25
MOV FLAG,1

;64

JMP IMPRIMIR27
IMPRIMIR25:
CMP FLAG,0
JE IMPRIMIR28
IMPRIMIR27:
HEXTOASCII DX
MOV AH,02H
PUTCH1 DL
;INT 21H
IMPRIMIR28:
CMP CX,DIGDIVIS+DIGDIVIS+1
JE IMPRIMIR23
JMP IMPRIMIR22
IMPRIMIR23:
CMP FLAG,0
JNE IMPRIMIR26
MOV AH,02H
MOV DL,30H
PUTCH1 DL
;INT 21H
MOV FLAG,1
IMPRIMIR26:
MOV AH,02H
MOV DL,2EH
PUTCH1 DL
;INT 21H
IMPRIMIR22:
DEC CX
CMP CX,19
JE IMPRIMIR24
JMP IMPRIMIR21
IMPRIMIR24:
RET
IMPRIMECOCIENTE2 ENDP
CLRSCR_12H PROC NEAR
; LIMPIA LA PANTALLA en el modo de video 12h.
LLENAR 0,0,79,29,219
RET
CLRSCR_12H ENDP
CLRSCR_03H PROC NEAR
; LIMPIA LA PANTALLA en el modo de video 03h.
MOV AX,0600H
MOV BH,07H
MOV CX,0000H
MOV DX,184FH
INT 10H
RET
CLRSCR_03H ENDP
CODESG ENDS
END PRINCIPAL