Programa 1:Este programa lo que hace es multiplicar 2 cifras en ensamblador.
Resultado:
Programa 2: Este programa lo que hace es multiplicar 2 cifras en ensamblador con macros Printn.
include 'emu8086.inc'
.model small ;Modelo de memoria m?s 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
printn 'Programa que multiplica dos numeros de dos digitos'
printn ''
print 'Ingrese primer numero: '
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
printn ''
print 'Ingrese segundo numero: '
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
printn ''
printn ''
mov ah,02H ;Muestra el primer valor
mov dl,chr1
add dl,30h
int 21h
mov ah,02H ;Muestra el segundo valor
mov dl,chr2
add dl,30h
int 21h
print ' * '
mov ah,02H ;Muestra el tercer valor
mov dl,chr3
add dl,30h
int 21h
mov ah,02H ;Muestra el cuarto valor
mov dl,chr4
add dl,30h
int 21h
;Realizamos operaci?n
mov al,chr4 ;al=1 ;unidad del segundo numero
mov bl,chr2 ;bl=1 ;unidad del primer numero
mul bl ;al=1 ;multiplicar
mov ah,0 ;ah=0 ;limpiamos ah0
aam ;ax=00 01 ;separamos de hex a dec
mov ac1,ah ;ac1=00 ;decenas del primera multiplicacion
mov r4,al ;r4=01 ;unidades del primera multiplicacion
mov al,chr4 ;bl=1 ;unidades del segundo numero
mov bl,chr1 ;al=1 ;decentas del primer numero
mul bl ;al=14h ;multiplicar
mov r3,al ;r3=14h ;movemos el resultado de la operacion a r3
mov bl,ac1 ;bl=00 ;movemos el acarreo a bl
add r3,bl ;r3=16h ;sumamos resultado mas acarreo
mov ah,00h ;ah=00 ;limpiamos ah por residuos
mov al,r3 ;al=16h ;movemos el resultado de la suma a al
aam ;ax=00 01 ;separamos de hex a dec
mov r3,al ;r3=00 ;guardamos unidades en r3
mov ac1,ah ;ac1=0 ;guardamos decenas en ac1
mov al,chr3 ;al=1 ;al = chr3
mov bl,chr2 ;bl=1 ;bl = chr2
mul bl ;al=1 ;AL = chr3*chr2 (BL*AL)
mov Ah,0h ;ah=0
AAM ;ax=00 01 ;ASCII Adjusment
mov ac,AH ;ac=00 ;ac = AH (Acarreo)
mov r2,AL ;r2=0 ;r2 = AL (Unidad del resultado)
mov al,chr3 ;al=1 ;AL = chr3
mov bl,chr1 ;bl=1 ;BL = chr1
mul bl ;al=1 ;AL = chr1*chr3 (BL*AL)
mov r1,al ;r1=1 ;r1 = AL (Decena del resultado)
mov bl,ac ;bl=00 ;BL = Acarreo anterior
add r1,bl ;r1=1; ;r1 = r1+ac (r1 + Acarreo)
mov ah,00h ;ah=00
mov al,r1 ;al=1 ;AL = r1 (Asignaci?n para el ajust)
AAM ;ax=00 01 ;ASCII Adjustment
mov r1,al ;r1=01 ;r1 = AL
mov ac,ah ;ac=0 ;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 ;al=01 ;movemos el segundo resultado de la primera mult a al
mov bl,r2 ;bl=1 ;movemos primer resultado de la segunda mult a bl
add al,bl ;al=1 ;sumamos
mov ah,00h ;ah=00 ;limpiamos ah
aam ;ax=00 01 ;separamos hex a dec
mov r3,al ;r3=01 ;r3 guarda las decenas del resultado final
mov r2,ah ;r2=0 ;r2 se utiliza como nuevo acarreo
mov ax,0000h ;''''
mov al,ac1 ;al=00 ;movemos el acarreo de la primera mult a al
mov bl,r1 ;bl=1 ;movemos segundo resultado de la segunda mult a bl
add al,r2 ;al=0 ;sumamos el nuevo acarreo de la suma anterior a al
add al,bl ;al=Bh ;sumamos al a bl
mov ah,00h ;ah=00 ;limpiamos el registro ah
aam ;ax=00 01 ;separamos de hex a dec
mov r1,al ;r1=01 ;r1 guarda las centenas
mov r2,ah ;R2=00 ;ah se sigue utilizando como acarreo
mov al,r2 ;al=00 ;movemos el acarreo a al
mov bl,ac ;bl=00 movemos ac a bl
add al,bl ;al=00 ;sumamos al a bl
;aam ;separamos hex a dec
mov ac,al ;ac=00 mov al a ac como nuestro acarreo final
;Mostramos resultado
printn ''
print 'El resultado es: '
mov ah,02h
mov dl,ac
add dl,30h
int 21h ;Mostramos ac (millar) ac=0
mov ah,02H
mov dl,r1
add dl,30h
int 21h ;Mostramos r1 (centena) r1=1
mov ah,02H
mov dl,r3
add dl,30h
int 21h ;Mostramos r3 (decena) r3=2
mov ah,02H
mov dl,r4
add dl,30h
int 21h ;unidad r4=1
.exit
end
.model small ;Modelo de memoria m?s 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 ;al=5 ;unidad del segundo numero mov bl,chr2 ;bl=5 ;unidad del primer numero mul bl ;bl=25 ;multiplicar mov ah,0 ;ah=0 ;limpiamos ah0 aam ;ax=02 05 ;separamos de hex a dec mov ac1,ah ;ac1=02 ;decenas del primera multiplicacion mov r4,al ;r4=05 ;unidades del primera multiplicacion mov al,chr4 ;bl=4 ;unidades del segundo numero mov bl,chr1 ;al=5 ;decentas del primer numero mul bl ;al=14h ;multiplicar mov r3,al ;r3=14h ;movemos el resultado de la operacion a r3 mov bl,ac1 ;bl=02 ;movemos el acarreo a bl add r3,bl ;r3=16h ;sumamos resultado mas acarreo mov ah,00h ;ah=00 ;limpiamos ah por residuos mov al,r3 ;al=16h ;movemos el resultado de la suma a al aam ;ax=02 02 ;separamos de hex a dec mov r3,al ;r3=02 ;guardamos unidades en r3 mov ac1,ah ;ac1=0 ;guardamos decenas en ac1 mov al,chr3 ;al=2 ;al = chr3 mov bl,chr2 ;bl=5 ;bl = chr2 mul bl ;al=10 ;AL = chr3*chr2 (BL*AL) mov Ah,0h ;ah=0 AAM ;ax=01 00 ;ASCII Adjusment mov ac,AH ;ac=01 ;ac = AH (Acarreo) mov r2,AL ;r2=0 ;r2 = AL (Unidad del resultado) mov al,chr3 ;al=2 ;AL = chr3 mov bl,chr1 ;bl=4 ;BL = chr1 mul bl ;al=8 ;AL = chr1*chr3 (BL*AL) mov r1,al ;r1=8 ;r1 = AL (Decena del resultado) mov bl,ac ;bl=01 ;BL = Acarreo anterior add r1,bl ;r1=9; ;r1 = r1+ac (r1 + Acarreo) mov ah,00h ;ah=00 mov al,r1 ;al=9 ;AL = r1 (Asignaci?n para el ajust) AAM ;ax=00 09 ;ASCII Adjustment mov r1,al ;r1=09 ;r1 = AL mov ac,ah ;ac=0 ;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 ;al=02 ;movemos el segundo resultado de la primera mult a al mov bl,r2 ;bl=0 ;movemos primer resultado de la segunda mult a bl add al,bl ;al=2 ;sumamos mov ah,00h ;ah=00 ;limpiamos ah aam ;ax=00 02 ;separamos hex a dec mov r3,al ;r3=02 ;r3 guarda las decenas del resultado final mov r2,ah ;r2=0 ;r2 se utiliza como nuevo acarreo mov ax,0000h ;'''' mov al,ac1 ;al=02 ;movemos el acarreo de la primera mult a al mov bl,r1 ;bl=9 ;movemos segundo resultado de la segunda mult a bl add al,r2 ;al=2 ;sumamos el nuevo acarreo de la suma anterior a al add al,bl ;al=Bh ;sumamos al a bl mov ah,00h ;ah=00 ;limpiamos el registro ah aam ;ax=01 01 ;separamos de hex a dec mov r1,al ;r1=01 ;r1 guarda las centenas mov r2,ah ;R2=01 ;ah se sigue utilizando como acarreo mov al,r2 ;al=01 ;movemos el acarreo a al mov bl,ac ;bl=00 movemos ac a bl add al,bl ;al=01 ;sumamos al a bl ;aam ;separamos hex a dec mov ac,al ;ac=01 mov al a ac como nuestro acarreo final ;Mostramos resultado mov ah,02h mov dl,ac add dl,30h int 21h ;Mostramos ac (millar) ac=1 mov ah,02H mov dl,r1 add dl,30h int 21h ;Mostramos r1 (centena) r1=1 mov ah,02H mov dl,r3 add dl,30h int 21h ;Mostramos r3 (decena) r3=2 mov ah,02H mov dl,r4 add dl,30h int 21h ;unidad r4=5 .exit end
Resultado:
Programa 2: Este programa lo que hace es multiplicar 2 cifras en ensamblador con macros Printn.
include 'emu8086.inc'
.model small ;Modelo de memoria m?s 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
printn 'Programa que multiplica dos numeros de dos digitos'
printn ''
print 'Ingrese primer numero: '
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
printn ''
print 'Ingrese segundo numero: '
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
printn ''
printn ''
mov ah,02H ;Muestra el primer valor
mov dl,chr1
add dl,30h
int 21h
mov ah,02H ;Muestra el segundo valor
mov dl,chr2
add dl,30h
int 21h
print ' * '
mov ah,02H ;Muestra el tercer valor
mov dl,chr3
add dl,30h
int 21h
mov ah,02H ;Muestra el cuarto valor
mov dl,chr4
add dl,30h
int 21h
;Realizamos operaci?n
mov al,chr4 ;al=1 ;unidad del segundo numero
mov bl,chr2 ;bl=1 ;unidad del primer numero
mul bl ;al=1 ;multiplicar
mov ah,0 ;ah=0 ;limpiamos ah0
aam ;ax=00 01 ;separamos de hex a dec
mov ac1,ah ;ac1=00 ;decenas del primera multiplicacion
mov r4,al ;r4=01 ;unidades del primera multiplicacion
mov al,chr4 ;bl=1 ;unidades del segundo numero
mov bl,chr1 ;al=1 ;decentas del primer numero
mul bl ;al=14h ;multiplicar
mov r3,al ;r3=14h ;movemos el resultado de la operacion a r3
mov bl,ac1 ;bl=00 ;movemos el acarreo a bl
add r3,bl ;r3=16h ;sumamos resultado mas acarreo
mov ah,00h ;ah=00 ;limpiamos ah por residuos
mov al,r3 ;al=16h ;movemos el resultado de la suma a al
aam ;ax=00 01 ;separamos de hex a dec
mov r3,al ;r3=00 ;guardamos unidades en r3
mov ac1,ah ;ac1=0 ;guardamos decenas en ac1
mov al,chr3 ;al=1 ;al = chr3
mov bl,chr2 ;bl=1 ;bl = chr2
mul bl ;al=1 ;AL = chr3*chr2 (BL*AL)
mov Ah,0h ;ah=0
AAM ;ax=00 01 ;ASCII Adjusment
mov ac,AH ;ac=00 ;ac = AH (Acarreo)
mov r2,AL ;r2=0 ;r2 = AL (Unidad del resultado)
mov al,chr3 ;al=1 ;AL = chr3
mov bl,chr1 ;bl=1 ;BL = chr1
mul bl ;al=1 ;AL = chr1*chr3 (BL*AL)
mov r1,al ;r1=1 ;r1 = AL (Decena del resultado)
mov bl,ac ;bl=00 ;BL = Acarreo anterior
add r1,bl ;r1=1; ;r1 = r1+ac (r1 + Acarreo)
mov ah,00h ;ah=00
mov al,r1 ;al=1 ;AL = r1 (Asignaci?n para el ajust)
AAM ;ax=00 01 ;ASCII Adjustment
mov r1,al ;r1=01 ;r1 = AL
mov ac,ah ;ac=0 ;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 ;al=01 ;movemos el segundo resultado de la primera mult a al
mov bl,r2 ;bl=1 ;movemos primer resultado de la segunda mult a bl
add al,bl ;al=1 ;sumamos
mov ah,00h ;ah=00 ;limpiamos ah
aam ;ax=00 01 ;separamos hex a dec
mov r3,al ;r3=01 ;r3 guarda las decenas del resultado final
mov r2,ah ;r2=0 ;r2 se utiliza como nuevo acarreo
mov ax,0000h ;''''
mov al,ac1 ;al=00 ;movemos el acarreo de la primera mult a al
mov bl,r1 ;bl=1 ;movemos segundo resultado de la segunda mult a bl
add al,r2 ;al=0 ;sumamos el nuevo acarreo de la suma anterior a al
add al,bl ;al=Bh ;sumamos al a bl
mov ah,00h ;ah=00 ;limpiamos el registro ah
aam ;ax=00 01 ;separamos de hex a dec
mov r1,al ;r1=01 ;r1 guarda las centenas
mov r2,ah ;R2=00 ;ah se sigue utilizando como acarreo
mov al,r2 ;al=00 ;movemos el acarreo a al
mov bl,ac ;bl=00 movemos ac a bl
add al,bl ;al=00 ;sumamos al a bl
;aam ;separamos hex a dec
mov ac,al ;ac=00 mov al a ac como nuestro acarreo final
;Mostramos resultado
printn ''
print 'El resultado es: '
mov ah,02h
mov dl,ac
add dl,30h
int 21h ;Mostramos ac (millar) ac=0
mov ah,02H
mov dl,r1
add dl,30h
int 21h ;Mostramos r1 (centena) r1=1
mov ah,02H
mov dl,r3
add dl,30h
int 21h ;Mostramos r3 (decena) r3=2
mov ah,02H
mov dl,r4
add dl,30h
int 21h ;unidad r4=1
.exit
end
Comentarios
Publicar un comentario