• Sábado 9 de Noviembre de 2024, 03:26

Autor Tema:  Enviando Dato Ascii  (Leído 2379 veces)

GsOiD

  • Miembro activo
  • **
  • Mensajes: 83
  • Nacionalidad: mx
    • Ver Perfil
Enviando Dato Ascii
« en: Jueves 7 de Junio de 2007, 08:21 »
0
Os molesto de nuevo.... me han dicho que nomàs no quieren con otro programita...  que a producto de gallina debe ser en ensamblador... dis que pa tener mayor control del dispositivo que manejamos...  tengo esto:

mov dl, caracter ascii
mov ah, 05h
int 21h

esto me sirve igual que esto:

mov dx, 378h
mov al, dato  
out  dx, al

????

ya puedo enviar datos numericos, pero  quiero enviar un dato que muestro en pantalla al puerto, este dato  fuè convertido a ASCII antes de ser enviado a pantalla.. y asì quiero enviarlo al paralelo....  se podra??  

Y agrego:  me disculpo por mi actitud inicial... y si q no es tarea.. me urge por que es un proyecto con unos cuates .....  y muchas gracias por la info que me puedan proporcionar   :) ...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Enviando Dato Ascii
« Respuesta #1 en: Jueves 7 de Junio de 2007, 09:11 »
0
Un caracter ASCII es un numero: http://www.asciitable.com/

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Toph

  • Moderador
  • ******
  • Mensajes: 420
  • Nacionalidad: sv
    • Ver Perfil
    • http://www.electronicayotros.blogspot.com/
Re: Enviando Dato Ascii
« Respuesta #2 en: Viernes 8 de Junio de 2007, 02:42 »
0
Cita de: "GsOiD"
ya puedo enviar datos numericos, pero  quiero enviar un dato que muestro en pantalla al puerto, este dato  fuè convertido a ASCII antes de ser enviado a pantalla.. y asì quiero enviarlo al paralelo....  se podra?? 

Si se puede, si por ejemplo mandaste a pantalla  53 en decimal (o 35 en hexadecimal) que equivale a "5", al sacar el dato por el puerto paralelo vas a sacar 35h o sea
00110101
pero si lo que quieres es sacar solamente el 5 (00000101) no tiene que ser en ascii.



saludos
Por favor leer esto antes de postear. Gracias
NO alimenten al TROLL y morirá
¿Querés ayudar?, pues doná comida gratis con un simple clic aqui ,sin trucos
photobucket , Google , wine y cutepdf Rock!!!


programacion,c,c++,
Microcontroladores,java,linux,videojuegos,
,.NET,asm,codigo
por favor este 2012 que sea

GsOiD

  • Miembro activo
  • **
  • Mensajes: 83
  • Nacionalidad: mx
    • Ver Perfil
Re: Enviando Dato Ascii
« Respuesta #3 en: Sábado 9 de Junio de 2007, 05:17 »
0
:hola:  Muchas gracias... mi programita a quedado re chulo :P os muestro aquì :   :rolleyes:

;******************************************************************************
; Nombre del programa   :   CONTANDO.ASM
; Objetivo              :   Realizar manejo del puerto
;******************************************************************************
; COMANDO DE ENSAMBLE   : Tasm CONTANDO.ASM;
; COMANDO DE ENLACE     : Tlink CONTANDO;
; COMANDO DE EJECUCION  : CONTANDO [Enter]
;******************************************************************************
;------------------------------------------------------------------------------
; Define el MODELO DE MEMORIA
;------------------------------------------------------------------------------
.MODEL SMALL
;------------------------------------------------------------------------------
; Define el area DE DATOS
;------------------------------------------------------------------------------
.Data
  ErrorCAP DB  0     ; Bandera de error en la captura de las cantidades
  Cantidad DB  0     ; La cantidad sobre la que se opera. Si es 0 se opera
                     ; sobre la cantidad 1, si es 1 se opera sobre la
                     ; cantidad 2.
  CantUnoR DW  0     ; Variable que guarda la cantidad 1 convertida a binario.
  CantDosR DW  0     ; Variable que guarda la cantidad 2 convertida a binario.
  CantUnoN DB  4,0,4 DUP(?)  ; Variable que almacena la cantidad 1
  CantDosN DB  4,0,4 DUP(?)  ; Variable que almacena la cantidad 2
  Funcion  DB  0             ; Variable que guarda la funcion a realizar
  Resulta  DB  13,10,13,10,'NuMeRoS: $'
  ResultaR DB  11 DUP('?')
  Mensaje  DB  'Bienvenidos a Contando,... Al fin terminamos banda GsOiD'
          DB  13,10,13,10,'$'
  Pregunta DB  13,10,13,10,'DIGITE:',13,10,13,10
           DB  ' (1) para Incrementar.',13,10
           DB  ' (2) para Decrementar.',13,10
           DB  ' (3) para Autor.',13,10
           DB  ' (4) para TERMINAR.',13,10,'$'
  Error    DB  7,7,7,13,10,'ERROR : en la seleccion de las opciones.'
           DB  13,10,13,10,'$'
  Error1   DB  7,7,7,13,10,'ERROR : digito INVALIDO en CANTIDAD 1.'
           DB  13,10,13,10,'$'
  Error2   DB  7,7,7,13,10,'ERROR : digito INVALIDO en CANTIDAD 2.'
           DB  13,10,13,10,'$'
  Error3   DB  7,7,7,13,10,'ERROR : cantidad fuera de RANGO ( 255).'
          DB  ' !!!.'
           DB  13,10,13,10,'$'
  CantunoM DB  13,10,13,10,'DiGiTe CaNtIdAd (debe ser < a 256)'
          DB  ' : $'
  CantDosM DB  13,10,13,10,'NúMeRo de Inc o Dec'
          DB  ' : $'
           DB  13,10,13,10
  Autores  DB  'Code by EsToIcA GsOiD   !  ',13,10
       DB  13,10,13,10,'$'

;------------------------------------------------------------------------------
; TABLA DE POTENCIAS USADA PARA CONVERTIR EL RESULTADO BINARIO DE LA
; OPERACION EN FORMATO ASCII.
;------------------------------------------------------------------------------
  Potencia  DW  0001h, 000ah, 0064h  ;, 03E8h, 2710h
;------------------------------------------------------------------------------
; Define el area del Stack
;------------------------------------------------------------------------------
.STACK
;------------------------------------------------------------------------------
; Define el area de codigo
;------------------------------------------------------------------------------
.CODE                       ; Area de codigo
;------------------------------------------------------------------------------
; Inicia programa
;------------------------------------------------------------------------------
Empieza:                    ; Etiqueta de comienzo de programa
;------------------------------------------------------------------------------
; BORRA LA PANTALLA CAMBIANDO LA MODALIDAD DE VIDEO.
;------------------------------------------------------------------------------
  Mov  Ah, 0Fh              ; Obtiene la modalidad de video actual
  Int  10h
  Mov  Ah, 0                ; Cambia la modalidad de video que se obtuvo
  Int  10h
  Mov  Ax,@Data             ; Inicializa DS con la direccion de @Data
  Mov  Ds, Ax
  Mov  Dx, Offset Mensaje   ; Despliega el mensaje de bienvenida
  Call Imprime
  Mov  Si, Offset ResultaR  ; Inicializa la variable ResultaR
  Add  Si, 11
  Mov  Al, '$'
  Mov  [Si], Al
;------------------------------------------------------------------------------
; SE DESPLIEGA EL MENU DE OPCIONES A ELEGIR.
;------------------------------------------------------------------------------
OTRA:
  Mov  Dx, Offset Pregunta  ; Despliega menu de opciones
  Call Imprime
  Call ObtenTecla           ; Espera a que el usuario seleccione la
                            ; funcion a realizar (1 a 4)
  Cmp  Al, 49               ; La seleccion del usuario es mayor o igual
  Jae  SIGUE                ; a 1 ?.
  Mov  Dx, Offset Error     ; NO, despliega mensaje de error
  Call Imprime
  Jmp  OTRA

SIGUE:
  Cmp  Al, 52               ; La seleccion del usuario es menor o igual
  Jbe  TODOBIEN             ; a 4?.
  Mov  Dx, Offset Error     ; NO, despliega mensaje de error
  Call Imprime
  Jmp  OTRA

TODOBIEN:
  Cmp  Al, 52
  Jnz  CHECATODO
  Jmp  FUNCION4

CHECATODO:
  Mov  Funcion, Al          ; Guarda la funcion a realizar
;------------------------------------------------------------------------------
; SE CAPTURAN LAS CANTIDADES Y SE GUARDAN EN SUS RESPECTIVAS VARIABLES PARA
; PODER TRABAJAR SOBRE ELLAS MAS ADELANTE.
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; CAPTURA PRIMER CANTIDAD.
;------------------------------------------------------------------------------

CAPCANT01:
  Mov  Dx, Offset CantUnoM  ; Mensaje de captura de cantidad 1
  Call Imprime
  Mov  Ah, 0Ah              ; Captura la cantidad (hasta 3 digitos)
  Mov  Dx, Offset CantUnoN
  Int  21h
  Mov  ErrorCAP, 0          ; Supone que no hay errores y que se esta
  Mov  Cantidad, 0          ; operando sobre la cantidad 1.
  Call ConvNUM              ; Convierte cantidad 1 a binario
  Cmp  ErrorCAP, 1          ; ¨Hubo error?
  Jz   CAPCANT01            ; S¡, regresa a la captura
  Mov  CantUnoR, Bx         ; Guarda resultado de conversion
  cmp  CantUnoR,255
  jg   CAPCANT01
   
;------------------------------------------------------------------------------
; CAPTURA SEGUNDA CANTIDAD.
;------------------------------------------------------------------------------
CAPCANT02:
  Mov  ErrorCAP, 0          ; Supone que no hay error
  Mov  Cantidad, 1          ; Indica a ConvNUM que es la segunda cantidad
  Mov  Dx, Offset CantDosM  ; Mensaje de captura de cantidad 2
  Call Imprime
  Mov  Ah, 0Ah              ; Captura la segunda cantidad
  Mov  Dx, Offset CantDosN
  Int  21h
  Call ConvNUM              ; Convierte cantidad 2 a binario
  Cmp  ErrorCAP, 1          ; ¨Hay error?
  Jz   CAPCANT02            ; S¡, regresa a capturar la cantidad
  Mov  CantDosR, Bx         ; Guarda conversion de cantidad 2

;------------------------------------------------------------------------------
; DESPUES DE CAPTURAR LAS DOS CANTIDADES SOBRE LAS CUALES SE VA A OPERAR,
; SE DEFINE CUAL ES LA FUNCION POR REALIZAR.
;------------------------------------------------------------------------------
  Mov  Al, Funcion          ; Funcion que selecciono el usuario
  Cmp  Al, 31h              ; Es 1?
  Jne  FUNCION2             ; No.
  Call Incrementa           ; Incremento
  Jmp  OTRA
FUNCION2:
  Cmp  Al, 32h              ; Es 2?
  Jne  FUNCION3             ; No.
  Call Decrementa           ; Decrementa
  Jmp  OTRA
FUNCION3:
  Cmp  Al, 33h              ; Es 3?
  Jne  FUNCION4             ; No.
  Call MuestraAutores       ; Muestra Autores
  Jmp  OTRA

FUNCION4:
;------------------------------------------------------------------------------
; TERMINA EL PROGRAMA
;------------------------------------------------------------------------------
  Mov  Ax, 4C00h          ; Termina el programa sin errores.
  Int  21h
;******************************************************************************
;                   R U T I N A S    D E    S O P O R T E
;******************************************************************************
;------------------------------------------------------------------------------
; Rutina      : Incrementa
;------------------------------------------------------------------------------
Incrementa Proc Near
  Mov  Ax, CantUnoR         ; Primera cantidad (multiplicando)
  Call Incremento  
  ;Call convASCII
  ;Mov  Dx, Offset Resulta   ; Despliega la cadena del resultado
  ;Call Imprime
  ;Mov  Dx, Offset ResultaR  ; Despliega el resultado.
  ;Call Imprime
  Ret
Incrementa Endp

Incremento proc near
   mov   ax, 00h
   mov   dx, 37Ah
   out   dx, ax
   
   
     
atras:          mov     dx, 378h      ;Indica que puerto se utiliza como salida
                mov     ax, CantUnoR  ;Envía la cantidad uno determinada en el segmento de           Not     ax            ;invierte el dato que enviará al puerto
                Not     ax
                out   dx, ax      ;Envia el dato al puerto paralelo
                cmp     CantDosR,0
          je      salta
             mov     dx,00h
                mov     ax,00h
                mov     ax,CantUnoR
                Call    ConvASCII
                mov     Dx, Offset ResultaR
          call    Imprime  
                inc     CantUnoR      ;Incrementa en uno el valor del dato uno
          dec     CantDosR
                Call    Retardo       ;llama a retardo para poder visualizar el dato
                Loop    atras         ;Itera hasta que llegue al dato maximo
salta:  
  ret
Incremento endp

Retardo Proc Near
                mov     Ax,00ffh
atras0:         mov     Bx,0ffffh
atras1:       nop
                dec     Bx
                cmp     Bx,0000h
          jne   atras1
                dec     Ax
                cmp     Ax,0000h
                jne     atras0
   ret
Retardo Endp

;------------------------------------------------------------------------------
; Rutina      : Decrementa
;------------------------------------------------------------------------------
Decrementa Proc Near
  Mov  Ax, CantUnoR        
  Call Decre  
  ;Mov  Dx, Offset Resulta   ; Despliega la cadena del resultado
  ;Call Imprime
  ;Mov  Dx, Offset ResultaR  ; Despliega el resultado.
  ;Call Imprime
  Ret
Decrementa Endp

Decre proc near
   mov   ax, 00h
   mov   dx, 37Ah
   out   dx, ax
       
atras3:         mov     dx, 378h      ;Indica que puerto se utiliza como salida
                mov     ax, CantUnoR  ;Envía la cantidad uno determinada en el segmento de           Not     ax            ;invierte el dato que enviará al puerto
                Not     ax
                out   dx, ax      ;Envia el dato al puerto paralelo
                cmp     CantDosR,0
          je      salta2
             mov     dx,00h
                mov     ax,00h
                mov     ax,CantUnoR
                Call    ConvASCII
                mov     Dx, Offset ResultaR
          call    Imprime  
                dec     CantUnoR      ;Incrementa en uno el valor del dato uno
          dec     CantDosR
          Call    Retardo       ;llama a retardo para poder visualizar el dato
                Loop    atras3         ;Itera hasta que llegue al dato maximo
salta2:  
  ret
Decre endp
;------------------------------------------------------------------------------
; Rutina      :Muestra Autores
;------------------------------------------------------------------------------
MuestraAutores Proc Near
  Mov  Dx, Offset Autores  ; Despliega nombre de autores
  Call Imprime
  ret
MuestraAutores Endp

;------------------------------------------------------------------------------
; Rutina      : Imprime
; Prop¢sito   : Despliega una cadena
; Par metros  : El registro DX contiene el desplazamiento de la cadena
; Regresa     : Nada
;------------------------------------------------------------------------------
Imprime Proc Near
  Mov  Ah, 9               ; Prepara para desplegar la cadena a traves de la
  Int  21h                 ;  INT 21h.
  Ret
Imprime Endp
;------------------------------------------------------------------------------
; Rutina      : ObtenTecla
; Proposito   : Espera a que el usuario digite una tecla
; Parametros  : Ninguno
; Regresa     : En el registro AL el codigo ASCII de la tecla
;------------------------------------------------------------------------------
ObtenTecla Proc Near
  Mov  Ah, 0               ; Lee una tecla del teclado a traves de la INT 16h
  Int  16h
  Ret
ObtenTecla Endp
;------------------------------------------------------------------------------
; Rutina      : ConvNUM
; Prop¢sito   : Convertir una cadena a un entero largo
; Par metros  : La longitud de la cadena y la direccion de la misma, y se
;               pasan a la pila.
; Regresa     : En el registro BX la cadena convertida en un entero
;------------------------------------------------------------------------------

ConvNUM Proc Near
  Mov  Dx, 0Ah                   ; Multiplicador es 10
  Cmp  Cantidad, 0               ; ¨Es la cantidad 1?
  Jnz  CONVNUM01                 ; NO, asi que es la cantidad 2
  Mov  Di, Offset CantUnoN + 1   ; Bytes leidos de la cantidad 1
  Mov  Cx, [Di]
  Mov  Si, Offset CantUnoN + 2   ; La cantidad 1
  Jmp  CONVNUM02

CONVNUM01:
  Mov  Di, Offset CantDosN + 1   ; Bytes leidos de la cantidad 2
  Mov  Cx, [Di]
  Mov  Si, Offset CantDosN + 2   ; La cantidad 2

CONVNUM02:
  Xor  Ch, Ch                    ; CH = 0
  Mov  Di, Offset Potencia       ; Direccion de la tabla de potencias
  Dec  Si                        ; Posiciona Si en el primer byte de la
  Add  Si, Cx                    ; cadena capturada y le suma el
  Xor  Bx, Bx                    ; desplazamiento de bytes leidos
  Std                            ; para que podamos posicionarnos en el
                                 ; final de la misma (apunta al ultimo
                                 ; digito capturado). BX = 0 y lee la
                                 ; cadena en forma inversa; es decir, de
                                 ; atras hacia adelante.

CONVNUM03:
  Lodsb                 ; Levanta un byte del numero (esta instruccion indica
                        ; que el registro AL sera cargado con el contenido
                        ; de la direccion apuntada por DS:SI).
  Cmp  AL,"0"           ; ¨Es menor a 0? (entonces NO es un digito valido)
  Jb   CONVNUM04        ; S¡, despliega el mensaje de error y termina
  Cmp  AL,"9"           ; ¨Es mayor a 9? (entonces NO es un d¡gito valido)
  Ja   CONVNUM04        ; S¡, despliega el error y salta
  Sub  Al, 30h          ; Convierte el digito de ASCII a binario
  Cbw                   ; Convierte a palabra
  Mov  Dx, [Di]         ; Obtiene la potencia de 10 que sera usada para
  Mul  Dx               ; multiplicar, multiplica numero y lo suma
  ;Jc   CONVNUM05        ; a BX. Revisa si hubo acarreo, y si lo hubo, esto
  Add  Bx, Ax           ; significa que la cantidad es > 65535.
  ;Jc   CONVNUM05        ; Si hay acarreo la cantidad es > 65535
  Add  Di, 2            ; Va a la siguiente potencia de 10
  Loop CONVNUM03        ; Itera hasta que CX sea = 0
  Jmp  CONVNUM06

CONVNUM04:
  Call HuboERROR        ; Algo ocurrio, despliega mensaje y salta
  Jmp  CONVNUM06

CONVNUM05:
  Mov  Cantidad, 2      ; Hubo acarreo en la conversion, por lo tanto la
  Call HuboERROR        ; cantidad capturada es mayor a 65535.

CONVNUM06:
  Cld                   ; Regresa la bandera de direccion a su estado normal
  Ret                   ; y REGRESA.

ConvNum Endp

;------------------------------------------------------------------------------
; Rutina      : ConvASCII
; Prop¢sito   : Convertir un valor binario en ASCII
; Par metros  : El registro par DX:AX
; Regresa     : Nada, pero almacena el resultado en el buffer ResultaR
;------------------------------------------------------------------------------

ConvASCII Proc Near

;------------------------------------------------------------------------------
; Lo primero que se hace es inicializar la variable que contendra el
; resultado de la conversion.
;------------------------------------------------------------------------------

  Push Dx
  Push Ax                  ; Guarda el resultado
  Mov  Si, Offset ResultaR ; Inicializa la variable ResultaR llenandola
  Mov  Cx, 10              ; con asteriscos
  Mov  Al, '*'

ConvASCII01:
  Mov  [Si], Al
  Inc  Si
  Loop ConvASCII01
  Pop  Ax
  Pop  Dx
  Mov  Bx, Ax                  ; Palabra baja de la cantidad
  Mov  Ax, Dx                  ; Palabra alta de la cantidad
  Mov  Si,Offset ResultaR      ; Cadena donde se guardara el resultado
  Add  Si, 11
  Mov  CX, 10                  ; Divisor = 10

OBTENDIGITO:
  Dec  Si
  Xor  Dx, Dx                  ; DX contendra el residuo
  Div  Cx                      ; Divide la palabra alta (AX)
  Mov  Di, Ax                  ; Guarda cociente (AX)
  Mov  Ax, Bx                  ; AX = palabra baja (BX)
  Div  Cx                      ; DX tenia un residuo de la division anterior
  Mov  Bx, Ax                  ; Guarda el cociente
  Mov  Ax, Di                  ; Regresa la palabra alta
  Add  Dl,30h                  ; Convierte residuo en ASCII
  Mov  [Si], Dl                ; Lo almacena
  Or   Ax, Ax                  ; ¨Palabra alta es 0?
  Jnz  OBTENDIGITO             ; No, sigue procesando
  Or   Bx, Bx                  ; ¨Palabra baja es 0?
  Jnz  OBTENDIGITO             ; No, sigue procesando
  Ret

ConvASCII Endp

;------------------------------------------------------------------------------
; Rutina      : HuboERROR
; Prop¢sito   : Desplegar el mensaje de error adecuado.
; Par metros  : Nada
; Regresa     : Nada
;------------------------------------------------------------------------------

HuboERROR  Proc Near

  Cmp  Cantidad, 0        ; ¨Es la cantidad 1?
  Jnz  HUBOERROR02        ; No.
  Mov  Dx, Offset Error1
  Call Imprime
  Mov  ErrorCAP, 1        ; Enciende la bandera de error
  Jmp  HUBOERROR05

HUBOERROR02:
  Cmp  Cantidad, 1        ; ¨Es la cantidad 2?
  Jnz  HUBOERROR03        ; No.
  Mov  Dx, Offset Error2
  Call Imprime
  Mov  ErrorCAP, 1
  Jmp  HUBOERROR05

HUBOERROR03:
  Cmp  Cantidad, 2        ; ¨Cantidad capturada esta fuera de rango ?
  Jnz  HUBOERROR05        ; No.
  Mov  Dx, Offset Error3
  Call Imprime
  Mov  ErrorCAP, 1
 
HUBOERROR05:
  Ret

HuboERROR Endp

;------------------------------------------------------------------------------
; Termina programa
;------------------------------------------------------------------------------

  End  Empieza

Agrego que hay cosillas que no se ocupan pero me dìo flojera quitarlas  :P ... despues de todo no hando tan mal en esto del ensamblador...
Ademas dicen que se ocupa pa los celulares y no se q otras cosas... entons seguirè en esto... si ago otros programitas os enviarè pa que los vean... jijijijijiji   :D