Ensamblador - PRograma Que saque el promedio de tres numeros

 
Vista:

PRograma Que saque el promedio de tres numeros

Publicado por Rafael (3 intervenciones) el 25/06/2008 18:54:58
este es el enunciado del programa....

crear un programa que saque el promedio de tres numeros... pero que esos numeros sean del 0 al 20... por favor ayudenme no se como hacer eso...:( no doy ni atras ni alante...!! estoy trabajando en ms-dos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE: PRograma Que saque el promedio de tres numeros

Publicado por Perceval.Ciro (23 intervenciones) el 29/06/2008 20:13:30
macro mah2
mov ah, 2
mov dl, 10
int 21h
mov dl, 13
int 21h
endm
Macro PedidoM Cadena
lea dx, cadena
mov ah, 9
int 21h
endm

Macro Dec2Hex cadena
Mov ah, 0h
int 16h
mov dl, al
mov ah, 2
int 21h
sub al, 30h
mov bl, al
mov bl, 0Ah
mul bl
mov cadena[0], al
mov ah, 0h
int 16h
mov ah, 2
mov dl, al
int 21h
sub al, 30h
add cadena[0], al
endm

Macro Hex2Dec cadena, salida

mov si, 00h
bucle:
mov bl, 0Ah
div bl
add ah, 30h
mov salida[si], ah
cmp al, 0ah
jnae final
mov ah, 00h
inc si
jmp bucle
final:
add al, 30h
mov salida[si+1], al
endm

org 100h

jmp inicio
Pedido db 'Ingrese un numero: $'
pedido2 db 'Un segundo numero, por favor: $'
pedido3 db 'Un tercer numero, por favor: $'
resultado db 'El promedio es de: $'
salida db 'Por favor presione cualquier tecla...$'

numero1 db 2 dup(?)
numero2 db 2 dup(?)
numero3 db 2 dup(?)
resulview db 3 dup(?)
inicio:

PedidoM pedido
Dec2hex numero1
mah2
PedidoM pedido2
Dec2hex numero2
mah2
pedidoM pedido3
dec2hex numero3
mah2
mov al, 00h
add al, numero1[0]
add al, numero2[0]
add al, numero3[0]
mov ah, 00h
mov bl, 3h
div bl
mov ah, 0
hex2dec al, resulview
mah2
mah2
PedidoM resultado
mov ah, 2
mov dl, resulview[2]
int 21h
mov dl, resulview[1]
int 21h
mov dl, resulview[0]
int 21h
salir:
mah2
mah2
PedidoM salida
mov ah, 0h
int 16h
ret

Yo hice esto.. fijate que tendrias que bloquear solamente el ingreso de teclas menores a 30, y superiores a 32.... en el primer valor que te permite ingresar. Eso es el la parte de Hex2dec.. En realidad yo estaba viendo como hacer la suma y representar X cantidad de valores, por eso el codigo esta hecho para imprimir tres caracteres.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: PRograma Que saque el promedio de tres numeros

Publicado por Perceval.Ciro (23 intervenciones) el 29/06/2008 22:16:34
aca esta de nuevo pero con las dos funciones suma y promedio...

macro mah2
mov ah, 2
mov dl, 10
int 21h
mov dl, 13
int 21h
endm
Macro PedidoM Cadena
lea dx, cadena
mov ah, 9
int 21h
endm

Macro Dec2Hex cadena
Mov ah, 0h
int 16h
mov dl, al
mov ah, 2
int 21h
sub al, 30h
mov bl, al
mov bl, 0Ah
mul bl
mov cadena[0], al
mov ah, 0h
int 16h
mov ah, 2
mov dl, al
int 21h
sub al, 30h
add cadena[0], al
endm

Macro Hex2Dec cadena, salida
Local bucle, final
mov si, 00h
bucle:
mov bl, 0Ah
div bl
add ah, 30h
mov salida[si], ah
cmp al, 0ah
jnae final
mov ah, 00h
inc si
jmp bucle
final:
add al, 30h
mov salida[si+1], al
endm
Macro Suma3 n1, n2, n3
mov al, 00h
add al, n1
add al, n2
add al, n3
endm
Macro ImH2D m1, m2, m3
mov ah, 2
mov dl, m3
int 21h
mov dl, m2
int 21h
mov dl, m1
int 21h
endm
org 100h

jmp inicio
Pedido db 'Ingrese un numero: $'
pedido2 db 'Otro segundo numero, por favor: $'
pedido3 db 'Un tercer numero, por favor: $'
resultado db 'El promedio es de: $'
resulsuma db 'El resultado de la suma es: $'
salida db 'Por favor presione cualquier tecla...$'

numero1 db 2 dup(?)
numero2 db 2 dup(?)
numero3 db 2 dup(?)
resulview db 3 dup(?)
inicio:
;Pedido de datos
PedidoM pedido
Dec2hex numero1
mah2
PedidoM pedido2
Dec2hex numero2
mah2
pedidoM pedido3
dec2hex numero3
mah2
;calcular suma
suma3 numero1[0], numero2[0], numero3[0]
mov ah, 00h
hex2dec al, resulview
mah2
pedidoM resulsuma
imh2d resulview[0], resulview[1], resulview[2]
mov resulview[2], 00h
mov resulview[1], 00h
mov resulview[0], 00h
;calcular promedio
suma3 numero1[0], numero2[0], numero3[0]
mov ah, 00h
mov bl, 3h
div bl
mov ah, 0

hex2dec al, resulview
mah2
mah2
PedidoM resultado
imH2D resulview[0], resulview[1], resulview[2]

salir:
mah2
mah2
PedidoM salida
mov ah, 0h
int 16h
ret
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programa Que saque EL Promedio de Tres Numeros

Publicado por Rafael (3 intervenciones) el 30/06/2008 04:36:45
Ok hermano la ayuda esta muy buena ahora mira el que yo hice con ayuda del profesor, pero este solo suma los numeros del 0 hasta el nueve.. pero el q necesito hacer es desde 0 hasta 20... q se le debe cambiar a este programa para que la suma sea del 0- 20?? Gracias de antemano muchas gracias, de verdad que no entiendo como que mucho... xD

.MODEL SMALL
.STACK 256
.DATA

DATO DB 3 DUP(?)
RESUL DB ?
RESUL1 DW ?
PROM DB 4 DUP(00),"$"
.CODE
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
CALL LIMPIA
MOV CX,03
LEA SI,DATO
L3: CALL INPUT
CMP AL,29H
JA L2
JMP L3
L2: CMP AL,39H
JA L3
AND AL,0FH
MOV [SI],AL
INC SI
LOOP L3
MOV CX,02
LEA DI,DATO
LEA SI,DATO+1
MOV AL,[DI]
L4: MOV DL,[SI]
ADD AL,DL
DAA
INC SI
LOOP L4
LEA DI,RESUL
MOV [DI],AL
AND AX,00FFH
MOV CL,4
ROL AX,CL
MOV CL,4
ROR AL,CL
MOV RESUL1,AX
MOV BH,03H
AAD
DIV BH
LEA SI,PROM
OR AL,30H
MOV [SI],AL
CMP AH,01H
JE L5
CMP AH,02H
JE L7
L6: CALL CURSOR
CALL MOSTRAR
JMP L8
L5: LEA SI,PROM+1
MOV AL,"."
MOV [SI],AL
INC SI
MOV AH,03H
OR AH,30H
MOV [SI],AH
JMP L6
L7: LEA SI,PROM+1
MOV AL,"."
MOV [SI],AL
INC SI
MOV AH,06H
OR AH,30H
MOV [SI],AH
JMP L6
L8: MOV AX,4C00H
INT 21H


LIMPIA:
MOV AH,02H
MOV DX,00H
INT 10H
MOV AX,0920H
MOV BL,17H
MOV CX,2000
INT 10H
RETN

INPUT:
MOV AH,10H
INT 16H
RETN

CURSOR:
MOV AH,02H
MOV BH,00
MOV DH,05
MOV DL,12
INT 10H
RETN
MOSTRAR:
MOV AH,09H
LEA DX,PROM
INT 21H
RETN

END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Programa Que saque EL Promedio de Tres Numeros

Publicado por Perceval Ciro (23 intervenciones) el 30/06/2008 05:58:43
No problem,... yo te pido disculpa de antemano porque no puedo revisar todo tu codigo, y no soy un experto, con lo poco que lo probe, con el emu8086, no pude ver como lo trabajaste correctamente, lo que pasa es que tenes que pensar en la conversion de Hexadecimal a decimal, entendes, cuando haces la division por A, con Bl, tenes que fijarte que el resultado que dispara creo que en AL, tenes que directamente sumarle 30h,

Te explico la conversion a Hexadecimal para que puedas ver el resultado que queres.

Macro Hex2Dec cadena, salida

mov si, 00h
bucle:
mov bl, 0Ah
div bl
add ah, 30h
mov salida[si], ah
cmp al, 0ah
jnae final
mov ah, 00h
inc si
jmp bucle
final:
add al, 30h
mov salida[si+1], al
endm

Bueno esta es la macro que hice yo... donde se supone que AL contiene antes de entrar el valor total de la suma de los terminos. entonces movemos A, 10 en decimal, para dividir... Luego dividimos el valor total de AL, y arroja el resultado en AX, por un lado el resto y por el otro el resultado de la division... Suponete esta cuanta.

entonces AL = 18H <---- 18 / A
entonces operamos = AH = 1 AL = 8
Yo lo hice para que represente tres valores en decimal, bah! hasta 255... antes de terminar podes comprobar el resultado si AL es mayor que 20 decimal, entonces, mostrar mensaje X "Overflow", por ejemplo.
Y la otra macro para tomar los valores seria:
Macro Dec2Hex cadena
Mov ah, 0h
int 16h
mov dl, al
mov ah, 2
int 21h
sub al, 30h
mov bl, al
mov bl, 0Ah
mul bl
mov cadena[0], al
mov ah, 0h
int 16h
mov ah, 2
mov dl, al
int 21h
sub al, 30h
add cadena[0], al
endm

Tomo el caracter y lo imprimo, ves yo no compruebo, vos lo hiciste, con int 21h ah = 2
le resto los 30h, es importante eso, en hexadecimal. Despues multiplico por A, para darle posicionalidad, recorda lo que te enseñaron de los sistemas numericos son posicionales, le agrego un 0, basicamente, si tendria que ser de tres cifras le agregaria un 100d o 64H, vuelco el primer caracter que toma, que es que se le tiene que agregar posicion, igual vos tenes que sumar nada mas tres numeros simples, sino me equivoco. Lo que vi es que no haces comprobacion para imprimir, y que no trabajas el paso a Decimal, mejor dicho a ASCII.

AH!!! perdon!! no vi todo lo que pedias, no voy a borrar ahora todo, es el promedio... bueno claro, entonces lo que tenes que mejorar es esto ultimo, mira bien el codigo que escribi, es bien sencillito... y te permite tomar dos caracteres, mira. Yo en la semana trabajo, y generalmente no respondo con tiempo. Si me decis que lo vas a necesitar para la otra semana, lo reviso punto por punto y lo veo. Como quieras. Pero no te puedo prometer mas que eso.
entendes?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Programa Que saque EL Promedio de Tres Numeros

Publicado por Rafael (3 intervenciones) el 30/06/2008 07:31:38
Hermano el programa lo tengo q entregar para el 10 de julio... pero entedeme algo, voy a seguir investigando y practicando para ir mejorando.... la verdad esto como q me enrreda un poco... pero me estas ayudando un monton gracias... ok??? cualquier cosa del programa q te mande.... decime q parte le tengo q cambiar y listo.. .vale? hablamos hermano cuidese... Gracias por todo---
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Programa Que saque EL Promedio de Tres Numeros

Publicado por Perceval Ciro (23 intervenciones) el 30/06/2008 21:12:04
Hola como andas, mira no tengo mucho tiempo despues te corrijo las interrupciones, anda puliendolo si queres. fijate.

.MODEL SMALL
.STACK 256
.DATA

DATO DB 3 DUP(?)
RESUL DB ?
RESUL1 DW ?
PROM DB 4 DUP(00),"$"
.CODE

MOV AX,@DATA
MOV DS,AX
MOV ES,AX
LEA SI,DATO

CALL LIMPIA
Comienzo:
MOV CX,02

L3: CALL INPUT
CMP AL,29H
JA L2
JMP L3

L2: CMP AL,39H
JA L3
PUSH ax
MOV ah, 2
MOV dl, al
INT 21h
POP ax
AND AL,0FH
MOV [SI],AL
inc si
Loop L3

N1:
push ax
xor ax, ax
add al, [si-2]
mov bl, 0ah
mul bl
add al, [si-1]
mov [si-2], al
Pop ax
mov [si-1], 00h
cmp [si-2], 14h
ja ERROR
dec si

mov ah, 2
mov dl, 0ah
int 21h
mov dl, 13
int 21h

jmp comienzo


;Proc
LIMPIA:
MOV AH,02H
MOV DX,00H
INT 10H
MOV AX,0920H
MOV BL,17H
MOV CX,2000
INT 10H
RETN

INPUT:
MOV AH,00H
INT 16H
RETN

ERROR:

mov ah, 02h
mov dl, 08h
int 21h
int 21h
mov dl, 00h
int 21h
int 21h
dec si
dec si
mov dl, 08h
int 21h
int 21h
mov [si], 00h
JMP comienzo
retn

Todabia no llegue a la parte de la suma, mira el procedimiento ERROR, es horrible, pasa que no me acuerdo el numero la interrupcion que devuelve la ubicacion del puntero lo restas y queda mas prolijo. Obviamente falta la comprobacion de SI... y listo... a sumar y promediar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Medio resuelto

Publicado por Perceval Cirro (23 intervenciones) el 02/07/2008 04:39:32
Bueno aca tenes, hace lo que queres, no lo puli... no te prometo que lo voy a hacer.. como te dije fijate en los detalles de los procedimientos.. pero ahora toma los datos como corresponde, y saca el promedio. Anda arreglandolo, ponele lineas de pregunta hacelo mas grafico, y anda mostrandome los resultados, si tengo tiempo te muestro como lo optimice yo, pero ya funciona...

.MODEL SMALL
.STACK 256
.DATA

DATO DB 3 DUP(?)
flotante db ?
RESUL DB ?
RESUL1 DW ?
PROM DB 4 DUP(00),"$"
.CODE


MOV AX,@DATA
MOV DS,AX
MOV ES,AX
LEA SI,DATO

CALL LIMPIA
Comienzo:
MOV CX,02


L3: CALL INPUT
CMP AL,29H
JA L2
JMP L3

L2: CMP AL,39H
JA L3
PUSH ax
MOV ah, 2
MOV dl, al
INT 21h
POP ax
AND AL,0FH
MOV [SI],AL
inc si
Loop L3

N1:
push ax
xor ax, ax
add al, [si-2]
mov bl, 0ah
mul bl
add al, [si-1]
mov [si-2], al
Pop ax
mov [si-1], 00h
cmp [si-2], 14h
ja ERROR
dec si

call space
mov cx, 3
xor ax, ax
cmp si, 3
je L4
jmp comienzo
;comienzo
L4:
MOV DL,[SI-3]
ADD AL,DL
INC SI
LOOP L4



LEA DI,RESUL
MOV [DI],AL
AND AX,00FFH

MOV BH,03H
DIV BH
mov flotante[0], ah
and ax, 00ffh
LEA SI,PROM
mov bh, 0ah
div bh
or ax, 3030h
MOV [SI],ax
CMP flotante[0],01H
JE L5
CMP flotante[0],02H
JE L7

L6: CALL CURSOR
CALL MOSTRAR
JMP L8

L5: LEA SI,PROM+2
MOV AL,"."
MOV [SI],AL
INC SI
MOV AH,03H
OR AH,30H
MOV [SI],AH
JMP L6

L7: LEA SI,PROM+2
MOV AL,"."
MOV [SI],AL
INC SI
MOV AH,06H
OR AH,30H
MOV [SI],AH
JMP L6

L8: MOV AX,4C00H
INT 21H
;fin


;Proc

LIMPIA:
MOV AH,02H
MOV DX,00H
INT 10H
MOV AX,0920H
MOV BL,17H
MOV CX,2000
INT 10H
RETN

INPUT:
MOV AH,00H
INT 16H
RETN

ERROR:

mov ah, 02h
mov dl, 08h
int 21h
int 21h
mov dl, 00h
int 21h
int 21h
dec si
dec si
mov dl, 08h
int 21h
int 21h
mov [si], 00h
JMP comienzo
retn
space:
mov ah, 2
mov dl, 0ah
int 21h
mov dl, 13
int 21h
retn



;NEW
CURSOR:
MOV AH,02H
MOV BH,00
MOV DH,05
MOV DL,12
INT 10H
RETN
MOSTRAR:
MOV AH,09H
LEA DX,PROM
INT 21H
RETN


Y casi no mofique codigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Le falta menos

Publicado por Perceval Ciro (23 intervenciones) el 02/07/2008 08:28:40
.MODEL SMALL
.STACK 256
.DATA

DATO DB 3 DUP(?)
PROM DB 4 DUP(00),"$"
ERROR1 DB '<-- ESTE NUMERO NO PERTENECE AL RANGO PERMITIDO!', 0AH, 0DH, '$'
.CODE


INICIO:
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
LEA SI,DATO

CALL LIMPIA

COMIENZO: MOV CX,02h


INPUT: MOV AH,00h
INT 16H
CMP AL,29h
JA INPUT2
JMP INPUT

INPUT2: CMP AL,39h
JA INPUT
MOV AH, 2h
MOV DL, AL
INT 21h
AND AL,0Fh
MOV [SI],AL
INC SI
LOOP INPUT

NUMEROS: XOR AX, AX
ADD AL, [SI-2]
MOV BL, 0Ah
MUL BL
ADD AL, [SI-1]
MOV [SI-2], AL
MOV [SI-1], 00h
CMP [SI-2], 14h
JA ERROR
DEC SI
CALL SPACE
MOV CX, 3h
CMP SI, 3H
MOV AL, 00H
JE SUMA
JMP COMIENZO

SUMA: MOV DL,[SI-3]
ADD AL,DL
INC SI
LOOP SUMA

RESULTADO:AND AX,00FFH
MOV BH,03H
DIV BH
LEA SI,PROM
MOV [SI+2], AH
AND AX,00FFH
MOV BH, 0Ah
DIV BH
OR AX, 3030h
MOV [SI], AX
MOV AL, [SI+2]
MOV BL, 3
MUL BL
OR AX, 02E30h
XCHG AL, AH
MOV [SI+2], AX

PRINT: CALL SPACE
MOV AH,09H
LEA DX,PROM
INT 21H
CALL SPACE
JMP SALIR


SALIR: MOV AH, 00
INT 16H
RET


;Proc

LIMPIA:
MOV AH,02H
MOV DX,00H
INT 10H
MOV AX,0920H
MOV BL,17H
MOV CX,2000
INT 10H
RETN



ERROR:
LEA DX, ERROR1
MOV AH, 9
INT 21H
SUB SI, 2H
JMP COMIENZO
RETN

SPACE:
MOV AH, 2h
MOV DL, 0Ah
INT 21h
MOV DL, 13
INT 21h
RETN
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Medio resuelto

Publicado por Perceval Ciro (23 intervenciones) el 02/07/2008 20:41:05
ME CONVENCE....

macro LIMPIA
MOV AH,02H
MOV DX,00H
INT 10H
MOV AX,0920H
MOV BL,17H
MOV CX,2000
INT 10H
endm


macro SPACE
MOV AH, 2h
MOV DL, 0Ah
INT 21h
MOV DL, 13
INT 21h
endm

MACRO PrintCad cad
lea dx, cad
mov ah, 9
int 21h
endm
.MODEL SMALL
.STACK 256
.DATA

DATO DB 3 DUP(?)
PROM DB 4 DUP(00),"$"
Err db ?, '$'
ERROR1 DB '<-- ESTE NUMERO NO PERTENECE AL RANGO PERMITIDO!', 0AH, 0DH, '$'
ERROR2 DB '<-- QUE COSA NO ENTENDISTE 00-20!!!', 0AH, 0DH, '$'
ERROR3 DB '<-- SOS BASTANTE ASNO... 00000 A 20!!!!!!!!!', 0AH, 0DH, '$'
Consigna db 'Debe ingresar numeros del 00-20, procure no cometer errores', 0ah, 0dh, '$'
Cad1 db 'Ingrese un numero: $'
Cad2 db 'El promedio es: $'
Cad3 db 'Cantidad de errores: $'
DERROR db 0ah, 0dh, 'Demasiados errores para algo tan sencillo... Adios!!!$'
.CODE


INICIO:
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
LEA SI,DATO

LIMPIA
Space
printcad consigna
Space

COMIENZO:PrintCad cad1
MOV CX,02h


INPUT: MOV AH,00h
INT 16H
CMP AL,29h
JA INPUT2
JMP INPUT

INPUT2: CMP AL,39h
JA INPUT
MOV AH, 2h
MOV DL, AL
INT 21h
AND AL,0Fh
MOV [SI],AL
INC SI
LOOP INPUT

NUMEROS: XOR AX, AX
ADD AL, [SI-2]
MOV BL, 0Ah
MUL BL
ADD AL, [SI-1]
MOV [SI-2], AL
MOV [SI-1], 00h
CMP [SI-2], 14h
JA ERROR
DEC SI
SPACE
MOV CX, 3h
CMP SI, 3H
MOV AL, 00H
JE SUMA
JMP COMIENZO

SUMA: MOV DL,[SI-3]
ADD AL,DL
INC SI
LOOP SUMA

RESULTADO:AND AX,00FFH
MOV BH,03H
DIV BH
LEA SI,PROM
MOV [SI+2], AH
AND AX,00FFH
MOV BH, 0Ah
DIV BH
OR AX, 3030h
MOV [SI], AX
MOV AL, [SI+2]
MOV BL, 3
MUL BL
OR AX, 02E30h
XCHG AL, AH
MOV [SI+2], AX

PRINT: SPACE
PRINTCAD cad2
MOV AH,09H
LEA DX,PROM
INT 21H
SPACE
printcad cad3
OR err[0], 30h
printcad err
JMP SALIR

ERROR:
cmp err[0], 0
je e1
JA e2
E1:
printcad error1
JMP CONTINUE
E2:
CMP ERR[0], 5
JAE E3
printcad error2
JMP CONTINUE
E3:
PRINTCAD ERROR3
JMP CONTINUE
CONTINUE:
SUB SI, 2H
inc err[0]
cmp err[0], 9
Je exceso
JMP COMIENZO
EXCESO:
Printcad DERROR
mov ah, 0h
int 16h
jmp salir

SALIR: MOV AH, 00
INT 16H
MOV AX,4C00H
INT 21H
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar