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 PRINCIPAL

2. 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 PRINCIPAL

3. 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
END

4. 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 PRINCIPAL

5. 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 INICIO

6. 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 FINAL

7. 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 INICIO

8. 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

Entradas relacionadas: