Multiplicacion de dos numeros


.model small ;Modelo de memoria mas utilizado
.stack

.data        ;definición de datos(variables), donde se almacenara información
.code
   chr1  db ? ;primer digito
   chr2  db ? ;segundo digito
   chr3  db ? ;multiplo
   chr4  db ?
   r1    db ? ;resultado 1
   r2    db ? ;resultado 2
   r3    db ?
   r4    db ?
   ac    db 0 ;acarreo
   ac1   db 0
.startup
   ;cls
   mov ah,00h     ;Function(Set video mode)
   mov al,03      ;Mode 80x25 8x8 16
   int 10h        ;Interruption Video

   mov ah,01h     ;Function(character read) Guarda en AL
   int 21h        ;Interruption DOS functions
   sub al,30h     ;ajustamos valores
   mov chr1,al    ;[chr1].chr2 * chr3 = ac.r1.r2

   mov ah,01h     ;Function(character read) Guarda en AL
   int 21h        ;Interruption DOS functions
   sub al,30h     ;Ajustamos valores
   mov chr2,al    ;chr1.[chr2] * chr3 = ac.r1.r2

   mov ah,02h     ;Function(character to send to standard output)
   mov dl,'*'     ;Character to show
   int 21h

   mov ah,01h     ;Function(Read character) Guarda en AL
   int 21h        ;Interruption DOS Functions
   sub al,30h     ;Transform(0dec = 30hex)
   mov chr3,al    ;chr1.chr2 * [chr3] = ac.r1.r2

   mov ah,01h     ;Function(Read character) Guarda en AL
   int 21h        ;Interruption DOS Functions
   sub al,30h     ;Transform(0dec = 30hex)
   mov chr4,al    ;chr1.chr2 * [chr3] = ac.r1.r2

   mov ah,02h     ;Character to send to standar output
   mov dl,'='     ;
   int 21h        ;Interruption DOS functions

   ;Realizamos operaci?n 

   mov al,chr4  ;unidad del segundo numero
   mov bl,chr2  ;unidad del primer numero
   mul bl       ;multiplicar
   mov ah,0     ;limpiamos ah0
   aam          ;separamos de hex a dec
   mov ac1,ah   ;decenas del primera multiplicacion
   mov r4,al    ;unidades del primera multiplicacion
         
   mov al,chr4  ;unidades del segundo numero
   mov bl,chr1  ;decentas del primer numero
   mul bl       ;multiplicar
   mov r3,al    ;movemos el resultado de la operacion a r3
   mov bl,ac1   ;movemos el acarreo a bl
   add r3,bl    ;sumamos resultado mas acarreo
   mov ah,00h   ;limpiamos ah por residuos
   mov al,r3    ;movemos el resultado de la suma a al
   aam          ;separamos  de hex a dec
   mov r3,al    ;guardamos unidades en r3
   mov ac1,ah   ;guardamos decenas en ac1

   

   mov al,chr3    ;al = chr3
   mov bl,chr2    ;bl = chr2
   mul bl         ;AL = chr3*chr2 (BL*AL)
   mov Ah,0h      ;
   AAM            ;ASCII Adjusment
   mov ac,AH      ;ac = AH (Acarreo)
   mov r2,AL      ;r2 = AL       (Unidad del resultado)

   mov al,chr3    ;AL = chr3
   mov bl,chr1    ;BL = chr1
   mul bl         ;AL = chr1*chr3 (BL*AL)
   mov r1,al      ;r1 = AL       (Decena del resultado)
   mov bl,ac      ;BL = Acarreo anterior
   add r1,bl      ;r1 = r1+ac (r1 + Acarreo)
   mov ah,00h     ;
   mov al,r1      ;AL = r1 (Asignaci?n para el ajust)
   AAM            ;ASCII Adjustment
   mov r1,al      ;r1 = AL
   mov ac,ah      ;ac = AH (Acarreo para la Centena del resultado)


   ;suma final
   ;R4 resulta ser las unidades de mul y no se toma en cuenta ya que se pasa entero


   mov ax,0000h   ;limpiamos ax

   mov al,r3      ;movemos el segundo resultado de la primera mult a al
   mov bl,r2      ;movemos primer resultado de la segunda mult a bl
   add al,bl      ;sumamos
   mov ah,00h     ;limpiamos ah
   aam            ;separamos hex a dec
   mov r3,al      ;r3 guarda las decenas del resultado final
   mov r2,ah      ;r2 se utiliza como nuevo acarreo

   mov ax,0000h   ;''''

   mov al,ac1     ;movemos el acarreo de la primera mult a al
   mov bl,r1      ;movemos segundo resultado de la segunda mult a bl
   add al,r2      ;sumamos el nuevo  acarreo de la suma anterior  a al
   add al,bl      ;sumamos al a bl
   mov ah,00h     ;limpiamos el registro ah
   aam            ;separamos de hex a dec
   mov r1,al      ;r1 guarda las centenas
   mov r2,ah      ;ah se sigue utilizando como acarreo

   mov al,r2      ;movemos el acarreo a al
   mov bl,ac      ;movemos ac a bl
   add al,bl      ;sumamos al a bl
   ;aam            ;separamos hex a dec
   mov ac,al      ;mov al a ac como nuestro acarreo final



   ;Mostramos resultado
   mov ah,02h
   mov dl,ac
   add dl,30h
   int 21h        ;Mostramos ac (millar)

   mov ah,02H
   mov dl,r1
   add dl,30h
   int 21h        ;Mostramos r1 (centena)

               

   mov ah,02H
   mov dl,r3
   add dl,30h
   int 21h        ;Mostramos r3 (decena)

   mov ah,02H
   mov dl,r4
   add dl,30h
   int 21h        ;unidad

.exit
end

Letrero con Offset


ORG 100H
INCLUDE 'EMU8086.INC' 

.DATA
DATO DB 10,13,'lETRERO$',10,13

.CODE

MOV CX,4

COMIENZO:
    MOV DX, OFFSET DATO
   
    MOV AH,09
    INT 21H
    LOOP COMIENZO


RET
END

Letrero con lea


ORG 100H
INCLUDE 'EMU8086.INC'

.DATA
DATO DB 10,13,'lETRERO$',10,13

.CODE

MOV CX,4

COMIENZO:
    LEA DX, DATO
 
    MOV AH,09
    INT 21H
    LOOP COMIENZO


RET

Letrero con macro


ORG 100H
INCLUDE 'EMU8086.INC'

MOV CX,4

COMIENZO:
PRINTN 'LETRERO'

LOOP COMIENZO

RET

3 Ejemplos de Programas con Saltos


;Ejemplo 1
org 100h
mov    ax, 5        ; set ax to 5.
mov    bx, 2          ; set bx to 2.

 jmp    calc            ; go to 'calc'.
 back:  jmp stop      ; go to 'stop'.
calc:
add    ax, bx         ; add bx to ax.
jmp    back           ; go 'back'.
 stop:
 ret                   ; return to os


;Ejemplo 2
include 'emu8086.inc' 
.MODEL SMALL
.STACK .DATA 
num1 db 8 
num2 db 8 
msg1 db , 'NUMEROS IGUALES', '$' 
msg2 db , 'NUMEROS 1 MAYOR', '$' 
msg3 db , 'NUMEROS 2 MAYORES', '$'
 .code 
main: 
mov ax, @data 
mov ds, ax   
mov al, num1 
cmp al, num2   
jc Mayor2 
jz igual 
jnz Mayor1   
. exit
 igual: 
printn 'Los numeros son iguales' 
jmp fin

 Mayor2: 
printn 'Numero 2 es mayor' 
 jmp fin
 Mayor1: 
printn 'Numero 1 es mayor' 
 jmp fin
 fin:
 END


;Ejemplo 3
include 'emu8086.inc'
.MODEL SMALL
.STACK
.DATA
    num1 db 8
    num2 db 8
    msg1 db , 'NUMEROS IGUALES', '$'
    msg2 db , 'NUMEROS 1 MAYOR', '$' 
    msg3 db , 'NUMEROS 2 MAYORES', '$'
.code
    main:
    mov ax, @data
    mov ds, ax
   
    mov al, num1 
    cmp al, num2
   
    jc Mayor2
    jz igual
    jnz Mayor1   
   
.exit
igual:
    printn 'Los numeros son iguales'
    jmp fin
    ;mov ah, 09H
    ;lea dx,msg1
    ;int 21h
;.exit
Mayor2:
    printn 'Numero 2 es mayor'
    jmp fin
    ;mov ah,09H
    ;lea dx,msg1
    ;int 21h
;.exit
Mayor1: 
    printn 'Numero 1 es mayor'
    jmp fin
    ;mov ah,09H
    ;lea dx,msg1
    ;int 21h
;.exit
fin:
END

Unidad 2: Programación Básica

2.1 Ensamblador (y ligador) a utilizar
2.2 Ciclos numéricos
2.3 Captura básica de cadenas
2.4 Comparación y prueba
2.5 Saltos
2.6 Ciclos condicionales
2.7 Incremento y decremento
2.8 Captura de cadenas con formato
2.9 Instrucciones aritméticas
2.10 Manipulación de la pila
2.11 Obtención de cadena con representación decimal
2.12 Instrucciones lógicas
2.13 Desplazamiento y rotación
2.14 Obtención de una cadena con la representación hexadecimal
2.15 Captura y almacenamiento de datos numéricos
2.16 Operaciones básicas sobre archivos de disco

Programa con modulo emu8086.inc

En esta ocasion pondre un programa que encontre con el modulo de emu8086.inc en donde dados dos numeros de alta, y un operador el programa realiza la operacion indicada con los numeros dados.

Link de consulta: https://www.programacion.com.py/escritorio/ensamblador/ejercicios-resueltos-en-ensamblador-8086




Sintaxis


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
org 100h ; inicio de programa
include 'emu8086.inc' ;Incluye funciones de libreria emu8086
; DEFINE_SCAN_NUM
; DEFINE_PRINT_STRING
 DEFINE_PRINT_NUM
 DEFINE_PRINT_NUM_UNS
  
mov si, 0
mov al, 0
;Convertir primera cadena a numero
 cadAnum:
cmp cad1[si], "$"
 jz seguir
 mov bl, 10
 mul bl
sub cad1[si], '0'
 add al, cad1[si]
 inc si ;realiza un incremento
loop cadAnum ;
seguir:
mov aux1, al
;Convertir segunda cadena a numero
mov si, 0
mov al, 0
cadAnum2:
cmp cad3[si], "$"
 jz seguir2 ;Saltar si el resultado es cero
 mov bl, 10
 mul bl
sub cad3[si], '0'
 add al, cad3[si]
 inc si
loop cadAnum2
seguir2:
mov bl, al
mov al, aux1
;realizar operaciones normalmente teniendo ya los dos numeros decimales
cmp cad2, "-"
jz resta
cmp cad2, "+"
jz suma
cmp cad2, "*"
jz multi
cmp cad2, "/"
jz divi
resta:
sub al, bl
jmp fin
suma:
add al, bl
jmp fin
multi:
mul bl
jmp fin
divi:
div bl
jmp fin
fin:
mov bx, ax
mov ah,09
lea dx,msg
int 21h
mov ax, bx
call PRINT_NUM
ret   
cad1 db "20$"
cad2 db "-"
cad3 db "2$"
aux1 db ?
aux2 dw ?
msg dw "El resultado es: $"





A diferencia del otro programa que había subido con anterioridad, la declaración de los datos en esta ocasión es al final del programa y la declaración de las funciones es al inicio del programa.

Una vez aclarado esto, les pondré la corrida del programa. Como pueden ver, damos de alta el numero 20 y el numero 2, así como el símbolo de resta para realizar esa operación.









Dado de alta los siguientes datos, en la parte de corrida del programa podemos ver lo que es las variables que anteriormente habíamos declarado para ver los movimientos de esta a lo largo de la sintaxis.









Finalmente, aquí tenemos lo que es programa nos devuelve como mensaje final. A mi gusto, podríamos modificarlo para que nos muestre los números que se ingresaron y la operación seleccionada para que no solo nos lance el resultado sin ningún contexto.