Programas en Ensamblador (Assembly) para Notas, Números Primos, Sumas, Relojes, Calculadoras y Áreas
Clasificado en Matemáticas
Escrito el en
español con un tamaño de 22,85 KB
Programas en Ensamblador: Ejemplos Prácticos
A continuación se presentan varios programas en lenguaje ensamblador para procesadores x86, con sus respectivos problemas planteados y código fuente.
1. Programa de Notas (Promedio de Alumnos)
Problema: Considerando 10 alumnos, ingresar 4 notas de laboratorio a partir de la dirección 2000H, un examen parcial a partir de la dirección 0030H y un examen final a partir de la dirección 0035H. Hacer un programa para calcular el promedio.
Fórmula: PF = (PROMLABO + 2EP + 2EF) / 5
;===================
STACK SEGMENT
DB 64 DUP(?)
STACK ENDS
DATOS SEGMENT
MENSAJE DB "PROGRAMA DE NOTAS $ "
DATOS ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO,DS:DATOS,SS:STACK
PRINCIPAL:
MOV AX,DATOS ; DIRECCIONAR DATOS
MOV DS,AX ;
LEA DX,MENSAJE ; DIRECCIONA MENSAJE
MOV AH,09
INT 21H ; MUESTRA
MOV BL, 10 ; ALUMNOS
INICIO: MOV SI,0000H
MOV DX,0000H
;--------------- LABORATORIOS ---------------------
CALL INGRESARNOTA ; LABORATORIO 1
MOV [SI], DL
CALL INGRESARNOTA ; LABORATORIO 2
MOV [SI+1],DL
CALL INGRESARNOTA ; LABORATORIO 3
MOV [SI+2], DL
CALL INGRESARNOTA ; LABORATORIO 4
MOV [SI+3],DL
CALL PROMEDIOLABORATORIO
MOV [SI+50H],AL
MOV DH,AL
;------------------ EXAMEN PARCIAL
CALL INGRESARNOTA
MOV [SI+ 30H],DL
ADD DH,DL ; PESO 2
;------------------ EXAMEN FINAL
CALL INGRESARNOTA
MOV [SI+ 35H],DL
ADD DH,DL ; PESO 2
CALL PROMEDIOFINAL
MOV [SI+0FFFEH],AL
DEC BL
JNZ INICIO
MOV AH,4CH
INT 21H
PROMEDIOFINAL PROC NEAR
MOV CL,5
MOV AL,DH
MOV AH,0
DIV CL
RET
PROMEDIOFINAL ENDP
PROMEDIOLABORATORIO PROC NEAR
MOV CL,4
MOV AL,DH
MOV AH,0
DIV CL
RET
PROMEDIOLABORATORIO ENDP
INGRESARNOTA PROC NEAR
MOV AH,01
DENUEVO: INT 21H
CMP AL, 30H
JE CERO
CMP AL, 31H
JE UNO
CMP AL, 32H
JE DOS
JMP DENUEVO
CERO: MOV AL,0
JMP UNIDADES
UNO: MOV AL,10
JMP UNIDADES
DOS: MOV AL,20
JMP SIGUE3
UNIDADES: MOV DL,AL
DENUEVO2: INT 21H
CMP AL,30H
JL DENUEVO2
CMP AL,39H
JG DENUEVO2
SUB AL,30H
SIGUE3: ADD DL,AL
ADD DH,DL
RET
INGRESARNOTA ENDP
CODIGO ENDS
END PRINCIPAL2. Hallar los Números Primos de 5 Números de 2 Cifras Ingresados
MENSAJE MACRO MENS
MOV AH,09
LEA DX,MENS
INT 21H
ENDM
STACK SEGMENT
DB 64 DUP ('X')
STACK ENDS
DATOS SEGMENT
TITULO DB "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",10,13
DB "³ INGRESA 5 NUMEROS DE DOS CIFRAS ³",10,13
DB "³ Y MUESTRA LOS PRIMOS ³",10,13
DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ$",10,13
ENTRADA DB 10,13," LEER NUMEROS : $"
SALIDA DB 10,13," LOS PRIMOS SON : $"
DATOS ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO,DS:DATOS,SS:STACK
PRINCIPAL: MOV AX,DATOS
MOV DS,AX
MENSAJE TITULO
MENSAJE ENTRADA
;-------------LECTURA --------------
MOV DI,5
MOV SI,1000H
LAZO1: CALL LEER
MOV [SI],BL
INC SI
DEC DI
JNZ LAZO1
;------------- MOSTRAR PRIMOS-------
MENSAJE SALIDA
MOV DI,5
MOV SI,1000H
LAZO3: CALL PRIMO
INC SI
DEC DI
JNZ LOOP LAZO3
MOV AH,4CH
INT 21H
LEER PROC NEAR
MOV BX,0
MOV CX,2 ; DOS DIGITOS
INGRE:
MOV AH,01 ; SERVICIO DE INGRESO DE DATOS
VUELVE:
INT 21H
CMP AL,39H ; COMPARAR CON 9
JA SIGUE ; MAYOR A 9 ? IR SIGUE
CMP AL,30H ; COMPARAR CON 0
JB SIGUE ; MENOR QUE 0 ? IR A SIGUE
SUB AL,30H ; RESTAR 30H
CMP CX,2
JE DOS
XOR AH,AH
ADD BX,AX
JMP LAZO
DOS: PUSH AX
PUSH CX
XOR AH,AH
MOV CX,10
MUL CX
ADD BX,AX
POP CX
POP AX
LAZO: LOOP VUELVE ; VOLVER
MOV AH,02
MOV DL,20H ; ESPACIO
INT 21H
RET ; FIN DE RUTINA
SIGUE:
MOV AH,02 ;
MOV DL,07 ; BEEP
INT 21H ;
MOV DL,08 ; VOLVER CURSOR UNA POSICION
INT 21H ;
MOV DL,20H ;
INT 21H ; MOSTRAR BLANCO
MOV DL,08
INT 21H ; VOLVER CURSOR UNA POSICION;
JMP INGRE ; VOLVER A LEER
LEER ENDP
PRIMO PROC NEAR
MOV BL,2
DENUEVO:MOV AL,[SI]
CMP AL,BL
JE SIGUE3
MOV AH,0
DIV BL
CMP AH,0
JE FIN
INC BL
JMP DENUEVO
SIGUE3: MOV AL,[SI]
MOV AH,0
CALL DECIMAL
FIN:
RET
PRIMO ENDP
DECIMAL PROC NEAR
PUSH SI
MOV SI,10
XOR CX,CX
NOCERO:
XOR DX,DX
DIV SI
PUSH DX
INC CX
OR AX,AX
JNE NOCERO
ESCRIBIR:
POP DX
MOV AH,02
ADD DL,30H
INT 21H
LOOP ESCRIBIR
POP SI
RET
DECIMAL ENDP
CODIGO ENDS
END PRINCIPAL3. Suma y Resta de 2 Números de 8 Cifras
MENSAJE MACRO M
LEA DX,M
MOV AH,09
INT 21H
ENDM
.MODEL SMALL
.STACK
.DATA
NUMERO1 DB 10,13,"NUMERO 1 : $"
NUMERO2 DB 10,13,"NUMERO 2 : $"
OPERAC DB 10,13,"OPERACION + O - ----> $"
RESULTADO DB 10,13,"RESULTADO ES : $"
NUM1 DB 8 DUP(0)
NUM2 DB 8 DUP(0)
RESUL DB 8 DUP(0)
.CODE
MOV AX,@DATA
MOV DS,AX
CALL INGRESA1
CALL INGRESA2
CALL OPERACION
FIN: MOV AH,4CH
INT 21H
INGRESA1 PROC
MENSAJE NUMERO1
LEA SI,NUM1
MOV CX,8
L1: CALL LEER
MOV [SI],AL
INC SI
LOOP L1
RET
INGRESA1 ENDP
INGRESA2 PROC
MENSAJE NUMERO2
LEA SI,NUM2
MOV CX,8
L2: CALL LEER
MOV [SI],AL
INC SI
LOOP L2
RET
INGRESA2 ENDP
OPERACION PROC
MENSAJE OPERAC
LAZO2: MOV AH,1
INT 21H
CMP AL,"+"
JZ SUMA
CMP AL,"-"
JZ RESTA
JMP LAZO2
RET
OPERACION ENDP
LEER PROC NEAR
LAZO: MOV AH,01
INT 21H
CMP AL,30H
JL LAZO
CMP AL,39H
JG LAZO
SUB AL,30H
RET
LEER ENDP
SUMA PROC
MOV CX,8
MOV BX,7
SUM:
MOV AL, NUM1[BX]
ADC AL, NUM2[BX]
AAA
MOV RESUL[BX], AL
DEC BX
LOOP SUM
JNC SIGUE
MOV RESUL[BX],1
SIGUE:
; MOSTRAR RESULTADO:
MENSAJE RESULTADO
MOV CX, 9
MOV BX, -1
ESCRIBIR:
MOV DL, RESUL[BX]
MOV AH,02
ADD DL,30H
INT 21H
INC BX
LOOP ESCRIBIR
MOV AH,4CH
INT 21H
RESTA PROC
MOV CX,8
MOV BX,7
RES:
MOV AL, NUM1[BX]
SBB AL, NUM2[BX]
AAS
MOV RESUL[BX], AL
DEC BX
LOOP RES
; MOSTRAR RESULTADO:
MENSAJE RESULTADO
MOV CX, 8
MOV BX, 0
ESCRIBIR1:
MOV DL, RESUL[BX]
MOV AH,02
ADD DL,30H
INT 21H
INC BX
LOOP ESCRIBIR1
MOV AH,4CH
INT 21H
END4. Reloj
MENSAJE MACRO M
PUSH DX
MOV AH,09
LEA DX,M
INT 21H
POP DX
ENDM
PILA SEGMENT
DB 64 DUP(0)
PILA ENDS
DATOS SEGMENT
PORTADA DB "RELOJ",10,13
DATOS ENDS
CODIGO SEGMENT
ASSUME:CS:CODIGO,DS:DATOS,SS:PILA
PRINCIPAL PROC FAR
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATOS
MOV DS,AX
MENSAJE PORTADA
;CH =HORAS,CL=MINUTOS,DH=SEG
L4:MOV CH,0
L3:MOV CL,0
L2:MOV DH,1
L1:CALL MOSTRAR
INC DH
CMP DH,60
JL L1
INC CL
CMP CL,60
JL L2
INC CH
CMP CH,24
JL L3
JMP L4
RET
PRINCIPAL ENDP
MOSTRAR PROC NEAR
MOV AV,CH
CALL DECIMAL
MOV AL,CL
CALL DECIMAL
MOV AL,DH
CALL DECIMAL
RET
MOSTRAR ENDP
DECIMAL PROC NEAR
PUSH CX
PUSH DX
MOV AH,0
MOV SI,10
MOV CX,0
VOLVER:MOV DX,0
DIV SI
PUSH DX
INC CX
OR AX,AX
JNE VOLVER
ESCRIBIR:POP DX
MOV AH,02
ADD DL,30H
INT 21H
LOOP ESCRIBIR
MOV AH,02
MOV DL,':'
INT 21H
POP DX
POP CX
RET
DECIMAL ENDP
CODIGO ENDS
END PRINCIPAL5. Calculadora de 3 Dígitos
MOSTRAR MACRO M
LOCAL M
PUSH AX
PUSH DX
LEA DX,M
MOV AH,09
INT 21H
POP DX
POP AX
ENDM
STACK SEGMENT
DB 64 DUP (' ') ;SEPARA 64 BYTES PARA LA PILA
STACK ENDS
DATOS SEGMENT
N1 DB 10,13," INGRESE PRIMER NUMERO : $"
N2 DB 10,13," INGRESE SEGUNDO NUMERO : $"
OPER DB 10,13," LA OPERACION A REALIZAR ES : $"
RESUL DB 10,13," EL RESULTADO ES : $"
SINO DB 10,13," DESEA CONTINUAR (S/N) : $"
DATOS ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO,DS:DATOS,SS:STACK
INICIO: MOV AX,DATOS
MOV DS,AX
MOSTRAR N1
CALL LEER
MOV SI,BX
MOSTRAR N2
CALL LEER
MOV DI,BX
MOSTRAR OPER
CALL OPERACION
MOSTRAR SINO
LAZO9: MOV AH,01H
INT 21H
CMP AL,'S'
JE INICIO
CMP AL,'N'
JE FINAL
MOV AH,02
MOV DL,07
INT 21H
MOV DL,08
INT 21H
MOV DL,20H
INT 21H
MOV DL,08
INT 21H
JMP LAZO9
FINAL: MOV AH,4CH
INT 21H
OPERACION PROC NEAR
LL8: MOV AH,01
INT 21H
CMP AL,'+'
JE SUMAR
CMP AL,'-'
JE RESTAR
CMP AL,'*'
JE MULTIPLICAR
CMP AL,'/'
JE DIVIDIR
MOV AH,02
MOV DL,07
INT 21H
MOV DL,08
INT 21H
MOV DL,20H
INT 21H
MOV DL,08
INT 21H
JMP LL8
SUMAR: ADD SI,DI
MOV AX,SI
MOV DX,0
CALL RESULTADO
JMP VOLVER
RESTAR: CMP SI,DI
JG SIGUE4
XCHG SI,DI
SIGUE4:SUB SI,DI
MOV AX,SI
MOV DX,0
CALL RESULTADO
JMP VOLVER
MULTIPLICAR: MOV AX,SI
MUL DI
CALL RESULTADO
JMP VOLVER
DIVIDIR : MOV AX,SI
MOV DX,0
CMP DI,0
JE VOLVER
DIV DI
MOV DX,0
CALL RESULTADO
JMP VOLVER
;-- PARA MOSTRAR HASTA 9 DIGITOS ----------
RESULTADO PROC NEAR
MOSTRAR RESUL
CMP DX,0
JE SIGUE2
MOV BX,10000
DIV BX
MOV BX,DX
CALL DECIMAL
MOV AX,BX
SIGUE2: CALL DECIMAL
RET
RESULTADO ENDP
DECIMAL PROC NEAR
MOV SI,10
MOV CX,0
LAZO61:
MOV DX,0
DIV SI
PUSH DX
INC CX
CMP AX,0
JNE LAZO61
MOV DX,0
CEROS: CMP CX,4
JGE ESCRIBIR
PUSH DX
INC CX
JMP CEROS
ESCRIBIR:
POP DX
MOV AH,02
ADD DL,30H
INT 21H
LOOP ESCRIBIR
RET
DECIMAL ENDP
VOLVER: RET
OPERACION ENDP
LEER PROC NEAR
MOV BX,0
MOV CX,3 ; 3 DIGITOS
INGRE:
MOV AH,01 ; INGRESA CARACTER
VUELVE:
INT 21H
CMP AL,'9'
JA SIGUE
CMP AL,'0'
JB SIGUE
SUB AL,30H
CMP CX,3
JE CIEN
CMP CX,2
JE DIEZ
MOV AH,0
ADD BX,AX
JMP LAZO
CIEN:
PUSH AX
PUSH CX
MOV AH,0
MOV CX,100
MUL CX
ADD BX,AX
POP CX
POP AX
JMP LAZO
DIEZ: PUSH AX
PUSH CX
MOV AH,0
MOV CX,10
MUL CX
ADD BX,AX
POP CX
POP AX
LAZO: LOOP VUELVE ; VOLVER
RET ; FIN DE RUTINA
SIGUE:
MOV AH,02
MOV DL,07 ; BEEP
INT 21H
MOV DL,08
INT 21H ;
MOV DL,20H ; BLANCO
INT 21H
MOV DL,08
INT 21H
JMP INGRE
LEER ENDP
CODIGO ENDS
END INICIO6. Programa de Áreas
MOSTRAR MACRO M ;
PUSH DX
PUSH AX
LEA DX, M
MOV AH, 9
INT 21H
POP AX
POP DX
MOSTRAR ENDM
PUSH SI
PUSH AX
PUSH DX
XOR AX,AX
LEA DX,N
MOV SI,DX
MOV AX,VALOR
MOV [SI],AX;
POP DX
POP AX
POP SI
AGREGA_VALOR ENDM
OBTIENE_VALOR MACRO N ;
PUSH SI
PUSH DX
XOR AX,AX
LEA DX,N
MOV SI,DX
MOV AX,[SI];
POP DX
POP SI
OBTIENE_VALOR ENDM
DATA SEGMENT
CAD0 DB 10,13,"INGRESE EL NUMERO DE LA OPCION: $"
CAD1 DB 10,13,"LA FIGURA ES: $"
CAD2 DB 10,13,10," ***** INGRESE PARAMETROS ***** $",10,13
CAD3 DB 10,13,"AL AREA ES: $"
CAD4 DB 10,13,"ERROR - SOLO ELIJA ENTRE LAS OPCIONES PERMITIDAS$"
FIGURA DB 41 DUP(?)
TRIANGULO1 DB 10,13, "1) TRIANGULO - [1]$"
CUADRADO1 DB 10,13, "2) CUADRADO - [2]$"
RECTANGULO1 DB 10,13,"3) RECTANGULO - [3]$"
TRAPECIO1 DB 10,13, "4) TRAPECIO - [4]$"
POLIGONO1 DB 10,13, "5) POLIGONO DE N LADOS - [5]$"
TRIANGULO_BASE DB 10,13,"INGRESE LA BASE: $"
TRIANGULO_ALTURA DB 10,13,"INGRESE LA ALTURA: $"
CUADRADO_LADO DB 10,13,"INGRESE EL LADO: $"
RECTANGULO_LADO1 DB 10,13,"INGRESE EL PRIMER LADO: $"
RECTANGULO_LADO2 DB 10,13,"INGRESE EL SEGUNDO LADO: $"
TRAPECIO_BASE_MENOR DB 10,13,"INGRESE LA BASE MENOR: $"
TRAPECIO_BASE_MAYOR DB 10,13,"INGRESE LA BASE MAYOR: $"
TRAPECIO_ALTURA DB 10,13,"INGRESE LA ALTURA: $"
POLIGONO_APOTEMA DB 10,13,"INGRESE EL APOTEMA: $"
POLIGONO_LADO DB 10,13,"INGRESE EL LADO: $"
POLIGONO_NUMERO_LADOS DB 10,13,"INGRESE EL NUMERO DE LADOS: $"
LADO3 DB "TRIANGULO EQUILATERO$"
LADO4 DB "CUADRADO$"
LADO5 DB "PENTAGONO REGULAR$"
LADO6 DB "HEXAGONO REGULAR$"
LADO7 DB "HEPTAGONO REGULAR$"
LADO8 DB "OCTOGONO REGULAR$"
LADON DB "POLIGONO REGULAR DE $"
LADOS DB " LADOS$"
NLADO DB 00H
INDICADOR_LADO DB 00H
ENDS
STACK SEGMENT
DW 128 DUP(0)
ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
; SET SEGMENT REGISTERS:
MOV AX, DATA
MOV DS, AX
MOSTRAR TRIANGULO1
MOSTRAR CUADRADO1
MOSTRAR RECTANGULO1
MOSTRAR TRAPECIO1
MOSTRAR POLIGONO1
MOSTRAR CAD0
CALL INGRESAOPCION; BL TIENE LA OPCION
MOSTRAR CAD2
CALL MENU ; LLAMA AL MENU
MOSTRAR CAD3
MOV CX,AX
MOV AX,SI
CALL DECIMAL
MOV AX,CX
CALL DECIMAL ;
MOV AX, 4C00H
INT 21H
MENU PROC NEAR;
CMP BL,1; SE ELIGIO LA OPCION 1
JNE SALTO1
CALL TRIANGULO
JMP FIN22
SALTO1:
CMP BL,2; SE ELIGIO LA OPCION 2
JNE SALTO2
CALL CUADRADO
JMP FIN22
SALTO2:
CMP BL,3; SE ELIGIO LA OPCION 3
JNE SALTO3
CALL RECTANGULO
JMP FIN22
SALTO3:
CMP BL,4 ; SE ELIGIO LA OPCION 4
JNE SALTO4
CALL TRAPECIO
JMP FIN22
SALTO4:
CMP BL,5 ; SE ELIGIO LA OPCION 5
JNE SALTO5
CALL POLIGONO
JMP FIN22
SALTO5:
FIN22:
RET
MENU ENDP
TRIANGULO PROC NEAR
MOSTRAR TRIANGULO_BASE
CALL INGRESA
XOR AH,AH
MOV AL,BL
MOSTRAR TRIANGULO_ALTURA
CALL INGRESA
MUL BL
MOV BL,02H
XOR BH,BH
DIV BX; AX TIENE EL RESULTADO
RET
TRIANGULO ENDP
CUADRADO PROC NEAR ;
MOSTRAR CUADRADO_LADO
XOR BH,BH
CALL INGRESA; AX TIENE EL RESULTADO
XOR AH,AH
MOV AL,BL
XOR BH,BH
MUL BX
RET
CUADRADO ENDP
RECTANGULO PROC NEAR ;
CALL INGRESA
XOR AH,AH
MOV AL,BL
MOSTRAR RECTANGULO_LADO2
CALL INGRESA
XOR BH,BH
MUL BX; AX TIENE EL RESULTADO
RET
RECTANGULO ENDP
TRAPECIO PROC NEAR
MOSTRAR TRAPECIO_BASE_MENOR
CALL INGRESA
MOV AL,BL
XOR AH,AH
MOSTRAR TRAPECIO_BASE_MAYOR
CALL INGRESA
XOR AH,AH
ADD AL,BL
MOSTRAR TRAPECIO_ALTURA
CALL INGRESA
XOR BH,BH
MUL BL
MOV BL,02H
DIV BX; AX TIENE EL RESULTADO
RET
TRAPECIO ENDP
POLIGONO PROC NEAR ;
MOSTRAR POLIGONO_APOTEMA
CALL INGRESA
MOV AL,BL
XOR AH,AH
MOSTRAR POLIGONO_LADO
CALL INGRESA
XOR BH,BH
MUL BX
MOSTRAR POLIGONO_NUMERO_LADOS
AGREGA_VALOR INDICADOR_LADO, 01H; CALL INGRESA
XOR BH,BH
AGREGA_VALOR NLADO, BX
MOV DX,00H
MUL BX
MOV SI,DX
MOV DI,AX
MOV AX,SI
MOV DX,00H
MOV BX,02H
DIV BX
MOV SI,AX
MOV BX,DX
MOV AX,1000H
MUL BX
MOV BX,AX
MOV AX,DI
MOV DI,02H
DIV DI
ADD AX,BX;
MOV DX,SI;
AGREGA_VALOR INDICADOR_LADO, 00H;
MOV BX,AX
MOSTRAR CAD1
PUSH AX
OBTIENE_VALOR NLADO
MOV BX,AX
CMP BL,3
JNE MAS_ALLA1
MOSTRAR LADO3
JMP FINAL1
MAS_ALLA1:
CMP BL,4
JNE MAS_ALLA2
MOSTRAR LADO4
JMP FINAL1
MAS_ALLA2:
CMP BL,5
JNE MAS_ALLA3
MOSTRAR LADO5
JMP FINAL1
MAS_ALLA3:
CMP BL,6
JNE MAS_ALLA4
MOSTRAR LADO6
JMP FINAL1
MAS_ALLA4:
CMP BL,7
JNE MAS_ALLA5
MOSTRAR LADO7
JMP FINAL1
MAS_ALLA5:
CMP BL,8
JNE MAS_ALLA6
MOSTRAR LADO8
JMP FINAL1
MAS_ALLA6:
POP AX
PUSH AX
OBTIENE_VALOR NLADO
CALL DECIMAL
MOSTRAR LADOS
POP AX
JMP FINAL11
FINAL1:
POP AX
FINAL11:
RET
POLIGONO ENDP
INGRESAOPCION PROC NEAR
PUSH CX;
DENUEVO1:XOR CH,CH;MOV DX,00H
MOV BX,00H
MOV CX,2; MAXIMO DE CIFRAS A INGRESAR + 1
OTRAVEZ1:MOV AH,08H;
INT 021H
CMP AL,0DH;
JNE S11
CMP CL,02H;
JE OTRAVEZ1
CMP CL,02H;
JB FIN11
S11:
CMP AL,08H;
JNE S21
CMP CL,02H;
JE OTRAVEZ1
CMP CL,02H;
JB RETRO1
S21:
CMP CL,01H;
JE OTRAVEZ1
CMP AL,39H;
JA OTRAVEZ1
CMP AL,30H;
JB OTRAVEZ1
MOV AH,02H
MOV DL,AL
INT 21H
XOR DX,DX
XOR AH,AH
CMP CL,3
JE S31
PUSH AX
MOV AX,BX
MOV BX,10
MUL BX
MOV BX,AX
POP AX
S31:
SUB AX,'0'
ADD BX,AX
CMP BX,5 ;
JA RETRO21
CMP BX,0
JE RETRO21
LOOP OTRAVEZ1
FIN11: POP CX
XOR AX,AX
XOR DX,DX
RET
RETRO1: MOV AH,02
MOV DL,07
INT 21H
MOV DL,08
INT 21H
MOV DL,20H
INT 21H
MOV DL,08
INT 21H
INC CL
XOR DX,DX
MOV AX,BX
MOV BX,10
DIV BX
MOV BX,AX
MOV DX,00H
JMP OTRAVEZ1
RETRO21: MOV AH,02
MOV DL,07
INT 21H
MOV DL,08
INT 21H
MOV DL,20H
INT 21H
MOV DL,08
INT 21H
ADD CL,01H
XOR BX,BX
JMP DENUEVO1
INGRESAOPCION ENDP
INGRESA PROC NEAR
PUSH AX
PUSH CX;
DENUEVO:XOR CH,CH;MOV DX,00H
MOV BX,00H
MOV CX,3; MAXIMO DE CIFRAS A INGRESAR + 1
OTRAVEZ:MOV AH,08H;
INT 021H
CMP AL,0DH;
JNE S1
CMP CL,03H;
JE OTRAVEZ
CMP BX,0
JE RETRO2
OBTIENE_VALOR INDICADOR_LADO; EN AX
CMP AX,1
JNE SALE1
CMP BX,2
JA SALE2
JMP RETRO2
SALE2:
SALE1:
CMP CL,03H;
JB FIN1
S1:
CMP AL,08H;
JNE S2
CMP CL,03H;
JE OTRAVEZ
CMP CL,03H;
JB RETRO
S2:
CMP CL,01H
JE OTRAVEZ
CMP AL,39H
JA OTRAVEZ
CMP AL,30H;
JB OTRAVEZ
MOV AH,02H
MOV DL,AL
INT 21H
XOR DX,DX
XOR AH,AH
CMP CL,3
JE S3
PUSH AX
MOV AX,BX
MOV BX,10
MUL BX
MOV BX,AX
POP AX
S3:
SUB AX,'0'
ADD BX,AX
LOOP OTRAVEZ
FIN1: POP CX
POP AX
XOR DX,DX
RET
RETRO: MOV AH,02
MOV DL,07
INT 21H
MOV DL,08
INT 21H
MOV DL,20H
INT 21H
MOV DL,08
INT 21H
INC CL
XOR DX,DX
MOV AX,BX
MOV BX,10
DIV BX
MOV BX,AX
MOV DX,00H
JMP OTRAVEZ
RETRO2: MOV AH,02
MOV DL,07
INT 21H
MOV BL,3
MOV BH,BL
SUB BL,CL
MOV CL,BL
MOV BL,00H
RETORN1:
MOV DL,08
INT 21H
MOV DL,20H
INT 21H
MOV DL,08
INT 21H
INC BL
LOOP RETORN1:
ADD BL,BH
MOV CL,BL
XOR BX,BX
JMP DENUEVO
INGRESA ENDP
DECIMAL PROC NEAR
PUSH SI
PUSH CX
PUSH AX
MOV SI,10
MOV CX,0
Z5:
MOV DX,0
DIV SI
PUSH DX
INC CX
CMP AX,0
JNE Z5
ESCRIBIR:
POP DX
MOV AH,02
ADD DL,30H
INT 21H
LOOP ESCRIBIR
POP AX
POP CX
POP SI
VOLV: RET
DECIMAL ENDP
ENDS
END START ; PUNTO FINAL7. Multiplicar 2 Números en Direcciones de Memoria
Problema: Multiplicar 2 números que se encuentran en las direcciones 3FCEH y 3FCFH, con resultado en las direcciones 245AH y 245BH.
DATOS SEGMENT
DB 100H DUP(0)
DATOS ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
INICIO: MOV BX, 3FCEH
MOV AL,[BX]
MOV BX,3FCFH
MOV DL,[BX]
MUL DL
MOV BX,245AH
MOV [BX],AX
MOV AH,4CH
INT 21H
CODIGO ENDS
END INICIO8. División de 2 Números en Direcciones de Memoria
Problema: División de 2 números que se encuentran en las direcciones (AX dividendo, BL divisor) 3FCEH y 3FCFH. Cociente en la dirección 245AH (en AL), resto en la dirección 245BH (en AH).
DATOS SEGMENT
DB 100H DUP(0)
DATOS ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
INICIO:MOV BX,3FCEH
MOV AL,[BX]
MOV BX,3FCFH
MOV DL,[BX]
DIV DL
MOV BX,245BH
MOV [BX],AL
MOV AH,4CH
INT 21H
CODIGO ENDS
END INICIO