.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
Alberto Vega - Lenguajes de Interfaz
Ingenieria en Sistemas Computacionales. Instituto Tecnológico De Matamoros.
Multiplicacion de dos numeros
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
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
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZWTQg7ewRmr1SEHq7S9RWSx-GbKLiBWHhCqzxEkwJYjHTHF7hUGGX32FRfXdRJIzsG80nSVOVcr5jAdhF4limiak9-lNxbK0QQ5-iNBamYpRUFtlma8RuDnoTRqC9kJixgMeDhKuFdYU/s1600/resultado+de+operacion3+datos.jpg)
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5CfOc7m2q0C5BNhjg9vILbjLdYwgZ5Bwgw0mK4kW0V_Yo4C833byqOhcXxIhpjryls6OPtJw5RzLjB4_UjuMINh_gVTN9nJrWnn-O7VELrXp1bqpgEZPFNt1DOaYMiEvrxDajFZ3a20g/s400/resultado+de+operacion2.jpg)
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.
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZWTQg7ewRmr1SEHq7S9RWSx-GbKLiBWHhCqzxEkwJYjHTHF7hUGGX32FRfXdRJIzsG80nSVOVcr5jAdhF4limiak9-lNxbK0QQ5-iNBamYpRUFtlma8RuDnoTRqC9kJixgMeDhKuFdYU/s1600/resultado+de+operacion3+datos.jpg)
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5CfOc7m2q0C5BNhjg9vILbjLdYwgZ5Bwgw0mK4kW0V_Yo4C833byqOhcXxIhpjryls6OPtJw5RzLjB4_UjuMINh_gVTN9nJrWnn-O7VELrXp1bqpgEZPFNt1DOaYMiEvrxDajFZ3a20g/s400/resultado+de+operacion2.jpg)
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie9qvc5pa7dltk3CBKEq2VC20EOh73xqPVEA1u1Ef2J-ohMTZtmkDyAfz2YCsvLRdjnviMzeOuQAtqQeTXaccZUOeUMTdkAyuDbfXenCwNzJYpa23aNNTZWOZftVqmfajP1gpQg6lkT2A/s400/resultado+de+operacion.jpg)
Suscribirse a:
Entradas (Atom)
-
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 Ciclo...
-
En esta entrada continuamos con sencillos programas sobre ensamblador 8086. En mi caso, estoy utilizando el programa "emu8086" par...
-
En esta ocasión veremos los registros básicos a la hora de programar dentro de ensamblador. Si bien, tenemos varios registros dentro de lo q...