Foros del Web » Programación para mayores de 30 ;) » Programación General »

Capturar Valores en ASM

Estas en el tema de Capturar Valores en ASM en el foro de Programación General en Foros del Web. Hola chicos de ForosdelWeb, no se si esto va aca, pues no encontre un foro de ASM, quiero hacer un programita que me capture 2 ...

  #1 (permalink)  
Antiguo 11/06/2005, 09:26
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Pregunta Capturar Valores en ASM

Hola chicos de ForosdelWeb, no se si esto va aca, pues no encontre un foro de ASM, quiero hacer un programita que me capture 2 valores y los sume o lo que sea, la cosa es que capture los valores, como el scanf de C , osea:
printf("Digite un valor: ");
scanf("%d",valor);

Es como prueba ya que estoy empezando con esto del assembler.
  #2 (permalink)  
Antiguo 11/06/2005, 10:44
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Para que te podamos ayudar necesitas decirnos tanto la plataforma como el Sistema Operativo para el cual queres desarrollar este programa.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 11/06/2005, 11:13
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Pregunta

Pues bien estoy con WinXP y un AMD Athlon, lo que he hecho es lo siguiente
Código:
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 'DIGITE VALOR 2: $'
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    MOV AH, 09h		;imprime mensaje VAL1 con la
    INT 21h		;función 9h
    MOV AH, 01h		;captura un valor del teclado
    INT 21h		;y se guarda en AL
    PUSH AX
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    MOV AH, 09h		;imprime mensaje VAL1 con la
    INT 21h		;función 9h
    MOV AH, 01h		;captura un valor del teclado
    INT 21h		;y se guarda en AL
    MOV BL, AL
    POP AX
    ADD BX, AX
    MOV AH, 4Ch
    INT 21h
END inicio
Como ves lo que quiero hacer es una suma, pero al compilarlo vi que no hacia nada mas que mandarme los 2 mensajes, no se si los capturo o no, ademas el mensaje 1, me salia delante del mensaje 2, como hago para ponerlo abajo, como un salto de linea '\n' en C.

Gracias Chao
  #4 (permalink)  
Antiguo 11/06/2005, 11:21
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
O no entendiste bien mi pregunta o no sabes bien que es lo que estas haciendo.
Tu entorno de desarrollo, en este caso, no es el mismo que el de destino del desarrollo en si ya que tu programa es para MS-DOS y no para Windows XP.

Voy a desenpolvar mis herramientas par MS-DOS (MASM) y vere que te puedo decir.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 11/06/2005, 11:23
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
jejeje gracias y disculpa.
  #6 (permalink)  
Antiguo 11/06/2005, 11:29
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No hay problema, vamos a empezar de a poquito y te advierto que MS-DOS no es lo mio:

Lo del texto lo podrias solucionar asi:
VAL1 DB 'DIGITE VALOR 1: $'
VAL2 DB 13, 10, 'DIGITE VALOR 2: $'

13 y 10 son los valores ASCII que le corresponden a \r\n. Otra cosa, a los registros no se les 'envian' cosas sino que se les establecen valores.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 11/06/2005, 11:37
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
¿Ya que estamos usando dos 'variables' para el texto porque no usamos una mas?
En tu modelo actual el principal problema es que usas AX (AH es 1 ya que ese valor le asignas para que se ejecuta la funcion que queres) y en BX vaya a saber Dios que hay (BL sera el valor pero ¿BH?). Usando otra 'variable' tambien nos ahorramos salvar los registros en la pila.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #8 (permalink)  
Antiguo 11/06/2005, 11:45
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Al ser unicamente dos caracteres los que vas a sumar como maximo podes obtener un 18 entonces con un variable del tamaño de un BYTE alcanza y sobra, deberias hacer comprobaciones para que no te puedan escribir una letra en vez de un numero.

Este seria el codigo mas o menos:
Código:
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13, 10, 'DIGITE VALOR 2: $'
    numeros DB 0
.CODE

inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    
    MOV DX, OFFSET VAL1			;Envia a DX el mensaje VAL1
    MOV AH, 09h							;imprime mensaje VAL1 con la
    INT 21h									;función 9h
    
    MOV AH, 01h							;captura un valor del teclado
    INT 21h									;y se guarda en AL
    
    sub al, 48                   ;restamos al caracter el ASCII de 0 para convertirlo en un numero
    mov numeros, al
    
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    MOV AH, 09h		;imprime mensaje VAL1 con la
    INT 21h		;función 9h
  
    MOV AH, 01h		;captura un valor del teclado
    INT 21h		;y se guarda en AL
    sub al, 48                     ;restamos al caracter el ASCII de 0 para convertirlo en un numero
    add numeros, al             ;aca tenemos el resultado de la suma
    
    MOV AH, 4Ch
    INT 21h
END inicio
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 11/06/2005, 12:40
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Código:
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13,10,'DIGITE VALOR 2: $'
    MSG DB 13,10,'LA SUMA ES: $'
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    PUSH AX
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    MOV BL, AL		;muevo el valor que se capturo en BL
    POP AX		;saca el valor introducido a la pila
    ADD BX, AX		;suma BX con AX y guarda en AX
    MOV AX, SEG MSG
    MOV DS, AX
    MOV DX, OFFSET MSG  ;Envia a DX el mensaje MSG
    CALL Print
    MOV AH, 02h
    MOV DX ,AX
    INT 21h	
    MOV AH, 4Ch
    INT 21h
Print Proc Near
    MOV AH, 09h		;imprime mensaje con la
    INT 21h		;función 9h
    RET
Print Endp
Capt Proc Near
    MOV AH, 01h		;captura un valor del teclado
    INT 21h		;y se guarda en AL
    RET    
Capt Endp
END inicio
Ya lo de la otra variable lo habia pensado
  #10 (permalink)  
Antiguo 11/06/2005, 12:41
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
mmm pero no asi.
  #11 (permalink)  
Antiguo 11/06/2005, 12:48
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Si queres usar AX limpia AH con xor ah, ah.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #12 (permalink)  
Antiguo 11/06/2005, 12:56
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Ahora me esta saliendo el error "Unexpected end of file encountered", tanto en el tuyo como en el mio, y antes no me salia cuando compilaba
  #13 (permalink)  
Antiguo 11/06/2005, 12:59
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No se que habras hecho pero a mi si me ensambla (compilar es lo que hacen los compiladores) perfectamente. Supongo que estas utilizando ml archivo.asm, ¿Verdad?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #14 (permalink)  
Antiguo 11/06/2005, 13:01
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
tasm capt.asm
tlink capt.obj

No le he cambiado nada
  #15 (permalink)  
Antiguo 11/06/2005, 13:04
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Bueno, yo no uso tasm asi que puede haber alguna diferencia en la sintaxis que cause el problema. ¿En que linea te da el error?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #16 (permalink)  
Antiguo 11/06/2005, 13:37
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Código:
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13,10,'DIGITE VALOR 2: $'
    MSG DB 13,10,'LA SUMA ES: $'
    RESU DB 0
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    MOV RESU, AL
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    ADD RESU, AL
    MOV AX, SEG MSG
    MOV DS, AX
    MOV DX, OFFSET MSG  ;Envia a DX el mensaje MSG
    CALL Print
    MOV AH, 02h
    MOV DX ,AX
    INT 21h	
    MOV AH, 4Ch
    INT 21h
Print Proc Near
    MOV AH, 09h		;imprime mensaje con la
    INT 21h		;función 9h
    SUB AL, 48          ;restamos al caracter el ASCII de 0 para convertirlo en un numero
    RET
Print Endp
Capt Proc Near
    MOV AH, 01h		;captura un valor del teclado
    INT 21h		;y se guarda en AL
    RET    
Capt Endp
END inicio ;esta es la linea del error 
;***Fatal*** capt.asm(43) Unexpected end of file encountered
  #17 (permalink)  
Antiguo 11/06/2005, 13:44
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
No es que halla un error, sino que no ha encontrado las instrucciones que necesita para empezar.

TASM trabaja con varias sintaxis, revisa si estás en la correcta.
  #18 (permalink)  
Antiguo 11/06/2005, 13:45
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Lo mas interesante es que no existe tal linea, el codigo ese tiene 42 lineas. ¿No tendras algun caracter irreconocible para el ensamblador en esa linea, no?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #19 (permalink)  
Antiguo 11/06/2005, 16:45
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Pero si asi ha estado desde el principio, no le he cambiado, sino las lineas que tu me explicastes.
  #20 (permalink)  
Antiguo 12/06/2005, 02:23
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Sugerencia: usa MASM. Otra alternativa, quitar lineas 'sospechosas' hasta que el programa si ensamble.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #21 (permalink)  
Antiguo 13/06/2005, 09:17
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Tengo MASM32 y las lineas de programacion para este son diferentes y las sentencias para el ensamblado tambien, asi que no puedo probar el MASM por ahora, a menos que me pueda conseguir uno para programación DOS
  #22 (permalink)  
Antiguo 13/06/2005, 09:36
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
MASM32 es un paquete para desarrollar programas en assembly para Windows. Lo que necesitas es MASM de 16 bits que sirve para MS-DOS.

http://www.doslife.com/stuff.html
http://usuarios.lycos.es/scratchupload/
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #23 (permalink)  
Antiguo 13/06/2005, 11:36
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Pregunta

El error era que habia guardado en formato Unicode.
Ahora ya compilado esto eslo que sale.

  #24 (permalink)  
Antiguo 13/06/2005, 11:41
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Bueno, eso es otra historia, el ensamblador solo entiende ANSI.

Para poder mostrar el resultado correcto tenes que transformar el numero a caracter, hay que ir dividiendo por diez. En este caso al ser numeros hasta 18 solo necesitas dividir una vez y sumarle 48 tanto al resultado de la division (siendo el primer caracter) como al resto (siendo el segundo).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #25 (permalink)  
Antiguo 13/06/2005, 13:09
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Y me puedes ayudar por que es que no sabo como
  #26 (permalink)  
Antiguo 13/06/2005, 14:44
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Aca tenes un ejemplo (MUY simple):

Código:
    mov ax, 17
    mov bl, 10
    div bl

    mov bx, ax

    mov dl, bl
    add dl, 48
    mov ah, 02h
    int 21h

    mov dl, bh
    add dl, 48
    mov ah, 02h
    int 21h
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #27 (permalink)  
Antiguo 13/06/2005, 15:37
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
gracias External Idol
  #28 (permalink)  
Antiguo 14/06/2005, 15:48
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
De nadas y es Eternal Idol.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #29 (permalink)  
Antiguo 16/06/2005, 14:57
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
Mira External Idol, gracias por todo, ya lo termine
Código:
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13,10,'DIGITE VALOR 2: $'
    MSG DB 13,10,'LA SUMA ES: $'
    RESU DB '0'
    CAPT1BIN DB '0'
    CAPT2BIN DB '0'
.CODE
inicio:
 ;CAPTURAR PRIMER VALOR
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1    ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    MOV CAPT1BIN, AL       ;Guarda en Binario
    SUB CAPT1BIN, 48       ;Se restan 48 para dar valor ASCII

 ;CAPTURAR SEGUNDO VALOR
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2    ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    MOV CAPT2BIN, AL       ;Guarda en Binario
    SUB CAPT2BIN, 48       ;Se restan 48 para dar valor ASCII

 ;SE EFECTUA LA SUMA
    MOV BL, CAPT1BIN
    ADD BL, CAPT2BIN
    MOV RESU, BL

 ;SE IMPRIME MENSAJE DE RESULTADO
    MOV AX, SEG MSG
    MOV DS, AX
    MOV DX, OFFSET MSG   ;Envia a DX el mensaje MSG
    MOV AH, 09h          ;imprime mensaje con la
    INT 21h              ;función 9h

 ;IMPRIMIR LOS RESULTADOS
    MOV AH, 0		;Se limpia el registro
    MOV AL, RESU	;El dividendo en AX para impresion de digitos uno por uno
    MOV BL, 10		;Se le pone 10 al divisor BL
    DIV BL		;Se divide (al=numero/divisor=10 ) COCIENTE=AL RESIDUO=DX
    MOV CL, AL		;Guardamos el cociente en CL
    MOV CH, AH		;Guardamos el residuo en CH
    ADD AL, 48		;Sumamos 48d al numero para convertirlo en ascii
    MOV AH, 2		;Funcion del DOS para imprimir un caracter
    MOV DL, AL		;Imprimir el primer digito
    INT 21h
    ADD CH, 48		;Sumamos 48d al numero para convertirlo en ascii
    MOV DL, CH		;Imprimimos el segundo caracter
    INT 21h
    MOV AH, 4Ch         ;Sale al DOS
    INT 21h

;PROCEDIMIENTO PARA IMPRIMIR CADENA
Print Proc Near
    MOV AH, 09h		;imprime mensaje con la
    INT 21h		;función 9h
    SUB AL, 48          ;restamos al caracter el ASCII de 0 para convertirlo en un numero
    RET
Print Endp

;PROCEDIMIENTO DE CAPTURA 
Capt Proc Near
    MOV AH, 01h		;captura un valor del teclado
    INT 21h		;y se guarda en AL
    RET    
Capt Endp
END inicio
  #30 (permalink)  
Antiguo 16/06/2005, 15:03
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Parece funcionar bien siempre que se escriban numeros y no letras

PD. Es eTernal, no eXternal.
Ahora yo podes ir olvidandote de ese tipo de programacion arcaica en 16 bits e ir pensando en 32 y 64 bits.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:18.