Ensamblador - Introducir un numero por el teclado

 
Vista:

Introducir un numero por el teclado

Publicado por daCrow (1 intervención) el 14/07/2005 14:14:37
Buenas.
He intentado introducir un numero desde el teclado mediante int21h/ah=01h, mediante int16h/ah=00h y mediante int21h/ah=07h. No me ha funcionado ninguna de las tres funciones. Alguna sugerencia? Aqui os dejo el programa para que os hagais una idea:

<--------------------------------------CODIGO--------------------------------------->
ORG 100h

JMP comienzo

numero1 DB 0
numero2 DB 0
prompt1 DB 'Introduce un número (0-255): ','$'
prompt2 DB 'Introduce el segundo número: ','$'
prompt3 DB 'El mayor es ','$'
mayor DB 'El primer número es mayor que el segundo.','$'
menor DB 'El primer número es menor que el segundo.','$'
igual DB 'Ambos números son iguales.','$'

comienzo:
LEA DX,prompt1

CALL escribe

CALL leealgo

MOV BL,AL

LEA DX,prompt2

CALL escribe

CALL leealgo

MOV BH,AL

CMP BL,BH

JZ iguales
JA mayorque

LEA DX,menor
CALL escribe
JMP final

iguales:
LEA DX,igual
CALL escribe
JMP final

mayorque:
LEA DX,mayor
CALL escribe

final: RET

escribe PROC
MOV AH,09h
INT 21h
escribe ENDP

leealgo PROC
MOV AH,01h
INT 21h
leealgo ENDP
<--------------------------------------CODIGO--------------------------------------->
Gracias de antemano
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:Introducir un numero por el teclado

Publicado por Ge-ergon (46 intervenciones) el 14/07/2005 21:18:24
Hola!

Las rutinas que mencionaste del BIOS y DOS no son para ser utilizadas espécificamente para leer numeros.

Primero debes crear una rutina para leer cadenas o "strings", luego debes verificar si lo que se ingreso es un formato de número valido, despues debes convertir el numero ingresado a su valor real para realizar las operaciones aritméticas. (Se puede verificar las dos cosas a la ves).
O tambien puedes crear una rutina que lea solo números, es decir validar cada tecla pulsada, y si es un número (0..9) se carga.

Ejemplo:

Si se ingresa el número: 45 ,
en el vector donde almacenas los caracteres ingresados deberás tener los siguientes dos bytes con el valores 34h 35h, es decir lo que estas ingresando es "45" y no 45. (Las comillas significa strings).
Por lo tanto debes realizar la conversión.

Recuerda que 45 = 4 * 10^1 + 5 * 10^0

Muchas Gracias por su tiempo!!
Att : Geergon
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
sin imagen de perfil

RE:Introducir un numero por el teclado

Publicado por Oscar Eduardo (5 intervenciones) el 04/07/2013 20:56:01
hola disculpen las molestias....

cree un tema donde necesito ayuda jejeje :$ y pues aja es para introducir datos por medio del teclado y que despliege mensajes el programa.....si pudiesen ayudarme se los agradeceria muchisimo....

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
; EJEMPLO DE PROGRAMA
 
DATOS SEGMENT ; empieza segmento de datos
    NUMEROS DB 1,2,-3,-4,5,6,-7,-8,99,10  ; ARREGLO DE DATOS
    CUENTA DW 10; NUMERO DE DATOS A SUMAR
 
    C DB 0
    D DB 0
    U DB 0
    MENS1 DB "EL RESULTADO ES: $"
    DATOS ENDS
PILA SEGMENT STACK; SEPARA 256 LOCALIDADES DE 16B
    DW 256 DUP (?); PARA EL SATCK
    PILA ENDS
CODIGO SEGMENT; INICIA SEGMENTO DE CODIGO
    SUMA PROC FAR; EMPIEZA PROGRAA PRINCIPAL
        ASSUME CS:CODIGO, DS:DATOS, SS:PILA; ASIGNA LOS
        PUSH DS
        XOR AX, AX
        PUSH AX ; DIRECCION DE RETORNO A WINDOWS
        MOV AX, DATOS
        MOV DS, AX; EMPIEZA PROGRAMA DE SUMA
        MOV AL, 00H; INICIALIZA SUMADOR
        MOV SI, 00H; APUNTADOR DE DATOS
        MOV CX, CUENTA; CARGA EN CX NUMERO DE DATOS
CICLO: CMP NUMEROS [SI], 0; SI ES NEGATIVO NO LO SUMA
JL SIGUE
ADD AL , NUMEROS [SI]; SUMA SOLO POSITIVOS
SIGUE: INC SI ; INCREMENTA APUNTADOR DE DATOS
LOOP CICLO; REPITE EL CICLO CUENTA VECES
; DESPLIEGA LA SUMA Y TERMINA
; LIMPIA
 
CICLO2: CMP AL, 99
        JG SIGUE2
 
        AAM
        MOV U, AL
        MOV D, AH
        MOV AH, 02H
        MOV DL, D
        ADD DL, 30H
        INT 21H
        MOV DL, D
        ADD DL, 30H
        INT 21H
        JMP ALLA
 
SIGUE2: AAM
        MOV U, AL
        MOV AL, AH
        AAM
        MOV C,AH
        MOV D,AL
        MOV AH, 02h
        MOV DL , C
        ADD DL, 30H
        INT 21H
        MOV DL, D
        ADD DL, 30H
        INT 21H
        MOV DL, U
        ADD DL, 30H
        INT 21H
 
ALLA: MOV AH,07H
      INT 21H
      RET
 
      SUMA ENDP
CODIGO ENDS
END SUMA
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:Introducir un numero por el teclado

Publicado por JimMaster (1 intervención) el 28/09/2018 14:43:36
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
pila segment para stack 'stack'
    DB 32 dup ("pila")
pila ends
datos segment para 'data'
 
mensaje db "INGRESA UN NUMERO $" ;$ requerido por funcion 9 int 21h
salto db 0AH,0DH,"$"
mensajeno db "ESO NO ES UN NUMERO >:/ $" ;$ requerido por funcion 9 int 21h
mensajesi db "Bien$" ;$ requerido por funcion 9 int 21h
 
;Aqui se declara las variables
 
 
datos ends
codigo segment para 'code'
princ proc far
	assume ss:pila, ds:datos, cs:codigo
	mov ax,datos
	mov ds,ax
 
 
	;desplieqgue de cadena
	mov dx,offset mensaje
	mov ah,9
	int 21h
	MOV DX,offset salto
	int 21h
 
	;EMPIEZA EL PRIMER ENCABEZADO
	Leer: MOV AH,01H
	INT 21H
 
	;COMPARAMOS EL PRIMER CARATER OBTENIDO
	CMP AL,30H
	JB NoesN
 
	;COMPARAMOS EL SIGUIENTE CARACTER
	CMP AL,39H
	JA  NoesN
	JMP Sies
 
	;Etiqueta NoesN
	NoesN: MOV AH,09H
	MOV DX,offset salto
	int 21h
	MOV DX,offset mensajeno
	int 21h
	MOV DX,offset salto
	int 21h
	JMP Leer
 
 
	;Etiqueta Sies
	Sies: Mov AH,09H
	MOV DX,offset salto
	int 21h
	MOV DX,offset mensajesi
	int 21h
 
 
 
 
	mov ax,4c00H
	int 21h
 
princ endp
codigo ends
	end princ
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