• Viernes 3 de Mayo de 2024, 08:48

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Logan

Páginas: [1]
1
C/C++ / Re: Error En Ciclo Do While
« en: Miércoles 2 de Marzo de 2005, 22:01 »
Gracias por su apoyo y sus comentarios, he recurrido a la funcion flushall() que me limpia el buffer de entrada y con esto he resuelto mi problema, de hecho llamo a esta función antes de usar el ultimo scanf()y al iniciar el ciclo y con eso quedo muy bien.

Espero que mi caso le sirva a algunos. Nos seguimos viendo. :D

2
C/C++ / Error En Ciclo Do While
« en: Martes 22 de Febrero de 2005, 19:00 »
Hola a todo el foro.

Me he encontrado con un error al ejecutar un ciclo do while , para que alguien pueda hacerme ver la falta en la que estoy incurriendo colocaré el codigo a continuación:
Código: Text
  1.  
  2. #include<stdio.h>
  3. #include<conio.h>
  4.  
  5. char res;
  6. char palabra[20];
  7.  
  8. int main()
  9. {
  10.   do
  11.   {
  12.    clrscr();
  13.    printf("Escribe tu nombre ");
  14.    scanf("%s",&palabra);
  15.    printf("hola %s",palabra);
  16.    gotoxy(20,22);
  17.    printf("desea continuar ... s/n ");
  18.    scanf("%c",&res);
  19.  
  20.    }while (res=='s' || res=='S');
  21.  
  22.   printf("bien...");
  23.   puts("Bye...");
  24.  getch();
  25. return 0;
  26. }
  27.  
  28.  

Bien, el error consiste en que al ejecutar dicho programa las instrucciones dentro del ciclo se ejecutan en su totalidad unicamente la primera vez, es decir, en el primer recorrido del ciclo, en las siguiente repeticiones solo despliega los letreros y me ignora los scanf, y yo ignoro porque suceda esto, el programa no tiene errores estructurales y creo que logicos tampoco, pero no doy con este problema.
Quiero mencionar que esto lo he notado con la estructura do while y tambien con la while, el problema momentaneamente lo he solventado escribiendo la condicion de esta forma
Código: Text
  1.  
  2. do {
  3. ....
  4. }while(getch()==115)
  5.  
  6.  
Asi, funciona perfectamente, pero la verdad sigo sin comprender porque con la primera forma las lineas scanf no se ejecutan como debe ser, es decir, no esperan a que se ingresen datos por teclado.

Por ultimo quiero comentar que este programa lo he ejecutado en un  Borland C++ 1.01 (bastante antugüo) y tambien C++3.0.

Gracias por su ayuda y sus comentarios, un saludo para todos.

3
ASM (Ensamblador) / Re: Ayuda Con Una Division!
« en: Viernes 29 de Octubre de 2004, 16:10 »
Hola Dennis, te comento que cada vez que desees realizar una division debes ver lo siguiente (usar unas funciones de conversion para que el dividendo sea siempre de mayor tamaño que el divisor, y no aparezca el error de desbordamiento):

Si quieres dividir un valor de tipo byte entre otro de tipo byte necesitas codificar
Ejemplo:
   MV AL,valor1_byte   ;pasamos a AL el valor del valor byte a dividir
   CBW                       ;funcion para convertir Byte a Word, es necesaria esta funcion
   DIV valor2_byte       ;dividir lo que tiene AX entre valor2_byte

El cociente se almacena en AL y el residuo en AH.

Si la division involucra dos valor Word:

   MV AX,valor1_word   ;pasamos a AX el valor del valor word a dividir
   CWD                       ;funcion para convertir Word a Double(32 bits), es necesaria esta funcion
   DIV valor2_byte       ;dividir lo que tiene AX entre valor2_word

El cociente se almacena en AX y el residuo en DX


Espero que este te sea de ayuda. Hasta pronto
 :hola:

4
ASM (Ensamblador) / Re: Entrada Y Salida De Datos
« en: Viernes 24 de Septiembre de 2004, 15:42 »
Dennis te coloco aqui un programa que pide dos digitos desde teclado y muestra la suma resultante.
En este ejemplo se piden SOLO UN digito (puede ser un caracter si no fuera suma) a la vez, esto se hace usando la funcion 01h de Int 21h que menciona Super G. Si deseas introducir una palabra o una cadena de caracteres por teclado te recomiendo que uses la funcion 0Ah de int 21h, como ya se ha mencionado anteriormente.
Espero que te sirva.


;suma de dos digitos introducidos desde teclado
title suma.asm
pila segment para stack'stack'
    db 64 dup('stack')
pila ends
datos segment para public 'data'
     pide1 db 'escribe un numero','$'
     pide2 db 'escribe otro numero','$'
     resul db 'la suma es:','$'
     n1 db ?
     n2 bd ?
     salto db  10,13,'$'
datos ends
codigo segment para pulic'code'
inicio proc near
     assume ss:pila,ds:datos,cs:codigo
     mov ax,datos
     mov ds,ax
mostrar macro mssg
     mov ah,09h
     lea dx,mssg
     int 21h
endm
     mostrar pide1
     mov ah,01h  ;aqui se toma el valor desde el teclado
     int 21h        
     sub al,30h    ;con esta suma convertimos el Ascii a decimal
     mov n1,al
     xor al,al
     mostrar salto
     mostrar pide2
     mov ah,01h   ;aqui tomamos el segundo digito por el teclado
     int 21h
     sub al,30h
     add n1,al
     xor al,al
     cmp n1,9d
     ja dos_digit
     jmp un_digit
dos_digit:
     xor al,al
     mov al,n1
     mov bl,10d
     sub al,bl
     mov n1,1d
     add n1,30h
     mov n2,al
     add n2,30h
     mostrar salto
     mostrar resul
     mov ah,09h
     lea dx,n1
     int 21h
     jmp salir
un_digit
     add n1,30h
     mostrar salto
     mostrar resul
     mov ah,09h
     lea dx,n1
     int 21h
salir:
     mov  ah,4ch
     int 21h
inicio endp
codigo ends
      end inicio

 :hola:

5
ASM (Ensamblador) / Re: Ayuda Con Codigo
« en: Viernes 17 de Septiembre de 2004, 19:42 »
Ha sido un placer Sajosue , yo tambien agradezco a todos los que aportan sus conocimientos en este foro ya que a mi me ha servido mucho y me ha sido de gran apoyo. Estamos aprendiendo unos de otros, retroalimentandonos y eso en muy gratificante.

Saludos a todo el Foro.

 :hola:

6
ASM (Ensamblador) / Re: Ayuda Con Novato Fecha Y Hora En La Pc
« en: Viernes 17 de Septiembre de 2004, 17:52 »
Hola a todos:
Aqui les dejo este programa que muestra la fecha del sistema dd/mm/aa.
Para mostrar la hora podemos emplear el mismo programa con algunas modificaciones (funcion que devuelve la hora y registros que almacenan los datos) ya que las horas, minutos y segundos se pueden mostrar en la misma forma que este programa muestra los dias  y meses.
El año se muestra con un procedimiento diferente.

Espero que le pueda servir a OSW.

;Programa que muestra la fecha del sistema

pila segment para stack 'stack '
   dw 64 dup(' ')
pila ends
datos segment para public 'data'
        dia     db 0
        mes     db 0
        anio    dw 0
   n1   db 0
   n2   db 0
        n3      db 0
        n4      db 0
        res     dw 0
        mil     dw 1000
        cien    dw 100
        diez    dw 10
               
datos ends
codigo segment
   assume ss:pila,ds:datos,cs:codigo

mensage macro x
   mov ah,06h
   mov dl,x
   int 21h
endm

inicial proc
   mov ax,datos
   mov ds,ax

        mov ah,2AH  ;funcion que devuelve la fecha
   int 21h
        mov dia,dl     ;movemos el valor del dia a una variable
        mov mes,dh
        mov anio,cx
   

        ; ********* Obtencion y despliegue del dia *********

        mov al,dia     ;cl obtiene la hora y se transiere a al
   aam      ;ax se convierte a BCD
   
   add al,'0'   ;convertimos AL en ASCII
   mov n2,al   ;movemos la parte baja de AX a n2
   add ah,'0'   ;convertimos AH en ASCII
   mov n1,ah   ;movemos la parte alta de AX a n1
   
   mensage n1
        mensage n2
        mensage '/'

        ; ********* Obtencion y despliegue del mes *********

        mov al,mes
   aam      ;ax se convierte a BCD
   
   add al,'0'   ;convertimos AL en ASCII
   mov n2,al   ;movemos la parte baja de AX a n2
   add ah,'0'   ;convertimos AH en ASCII
   mov n1,ah   ;movemos la parte alta de AX a n1

   mensage n1
        mensage n2
        mensage '/'

        ; ********* Obtencion y despliegue del a¤o *********
        mov ax,anio   ;movemos el valor del año a ax
        cwd      ;convertirmos ax en doble palabra (es indispensable para realizar esta división)
        div mil      ;dividimos ax entre mil=1000, AX almacena el cociente y DX el residuo
        aam      ;ax es convertido a BCD
        mov res,dx   ;se lamacena el residuo que esta en dx a la variable RES
        add al,'0'   ;convertimos a ASCII la parte baja de aX que contiene el valor del residuo despues de convertirse en BCD
        mov n1,al   ;movemos el residuo a N!
        mensage n1   ;mostramos el valor del residuo que es el promer numero del año
      
   ;mostramos el segundo numero del año
        mov ax,res
        cwd
        div cien
        aam
        mov res,dx
        add al,'0'
        mov n1,al
        mensage n1

   ;mostramos el tercer numero del año        
        mov ax,res
        cwd
        div diez
        aam
        mov res,dx
        add al,'0'
        mov n1,al
        mensage n1

   ;mostramos el cuarto y ultimo numero del año
        mov ax,res
        aam
        add al,'0'
        mov n1,al
        mensage n1

        mov ah,4ch
   int 21h
inicial endp
codigo ends
   end inicial

Saludos  :lightsabre:

7
ASM (Ensamblador) / Re: Ayuda Con Codigo
« en: Viernes 17 de Septiembre de 2004, 15:47 »
Hola SaJosue:

Acabo de checar tu programa, y el error que tienes no es grave, lo unico que estaba sucediendo es que al momento de LIMPIAR PANTALLA estabas cometiendo un error en la siguiente instruccion MOV BX,30 que se ubica en este procedimiento.

Q10CLR PROC NEAR
MOV AX,0600H
MOV BX,30               ;por esta instruccion tu programa no te permitia ver nada
MOV CX,0000
MOV DX,184FH
INT 10H
RET
Q10CLR ENDP

Lo correcto es MOV BH,30h la parte alta del registro BX es la que almacena el color de "fondo de texto" y del "texto". En este caso el numero 3 establece un color Verde turquesa como fondo de texto y el numero 0 establece un color Negro para el texto. puedes modificar estos valores (3 y 0) para buscar una mejor combinacion de fondo y texto.

Ojo, si al final de numero 30 escribes la letra H (es decir:  mov bh,30h) obtienes diferente colores que si no la escribes, prueba para que lo veas.

Suerte y no pares en el esfuerzo!!!.  :kicking:

8
PHP / Ayuda Para Corregir Error En Appserv
« en: Viernes 27 de Agosto de 2004, 20:13 »
Hola a todos los integrantes del foro:

Deseo empezar a trabajar con PHP y Mysql por lo cual instale el AppServ para win32 ver. 2.5.1, todo salio en la instalación. Utilizo Win98.
Por medio del PhpMyAdmin pude crear mi base de datos y mis tablas correspondientes, pero en la parte inferior de la pagina donde se muestran las tablas de la BD's me aparece el siguiente error:

Las opciones adicionales para trabajar con tablas vinculadas
fueron desactivadas. Para saber porqué, dé clic aquí.

Lei el vinculo que se indica y aparece lo siguiente:

PMA Database ... no recibió el OK[ Documentación ]
Opciones de relación general Deshabilitado

Lei parte de la documentación y modifique una linea de mi archivo C:\Appserv\www\phpMyAdmin\conf.inc.php

estaba asi......

$cfg['Servers'][$i]['pmadb']         = '';

la modifique a .....

$cfg['Servers'][$i]['pmadb']         = TRUE;

Guarde los cambios y volvi a cargar my phpMyAdmin pero aun sigue marcando el error, la verdad no se que sea concretamente, si alguien sabe la solución o el porque de este error de antemano agradezco mucho apoyo.

Gracias po su atención y un saludo para todos.

Logan

 :kicking:

9
ASM (Ensamblador) / Re: Int 19h
« en: Lunes 3 de Noviembre de 2003, 20:56 »
He usado la Int 19h para reiniciar el sistema (DOS), en lugar de cerrar un programa con mov ah,4Ch Int 21h lo he hecho con la int 19h y la ventana de ms-dos se cierra, esto usando un Windows Me, tambien lo he probado en windows 2000 y XP pero unicamente termina el programa sin cerrar la ventana, alguien sabe por que?
Aprovechando, deseo encontrar una forma de reiniciar el sistema Windows por medio de ensamblador ya sea 98, Me, 2000 o XP. No axactamente que es lo que tengo que hacer en ese caso.

10
ASM (Ensamblador) / Re: Obtener espacio libre del disco
« en: Lunes 27 de Octubre de 2003, 20:33 »
Estoy tratando de encontrar la cantidad disponoble de espacio en disco, se que por medio de la funcion 36 de la int 21h se devuelve este valor en BX (en clusters), quiero mostrar esta cantidad en pantalla, se que se almacena en binario pero a caso lo tengo que convertir a decimal y despues a ascii para finalmente mostrarlo en pantalla?
Si alguien ya ha hecho algo como esto agradezco el apoyo.

11
ASM (Ensamblador) / Re: como imprimo con Ensamblador?
« en: Miércoles 22 de Octubre de 2003, 19:48 »
Hola, estoy tratando de imprimir algo en ensamblador, lo que sea, palabras o numeros, he estado checando la int 17h, tambien la instrucciones IN y OUT, pero creo que la 17 maneja el puerto paralelo, mi impresora es USB, no he encontrado la forma de transferis datos a la impresora, por lo consiguiente no he impreso nada verdad, bueno espero que alguien me pueda dar algun tip al respecto porque la verdad no le encuentro.

Este es un programa que probe para imprimir 10 veces una cadena, lo probe en una impresora con puerto paralelo pero solo jala la hoja y no imprime nada.



title cprint
comment*
        Programa que lee caracteres provenientes del teclado utilizando
        INT 21h  y los escribe en la pantalla de exhibici¢n y los imprime
        en impresora*
stack   segment para stack 'stack'
        db      64 dup ('stack')
stack   ends

data    segment para public 'data'
msg     db      'introduce caracteres','$'
buff1   db      80
buff2   db      ?       ;longitud del buffer de entrada
char    db      80 dup (' '),'$'
blank   db      ' '
nprint  dw      26      ;linea limite de la salida de entrada
data    ends

cseg    segment para public 'code'
cprint  proc far
        assume cs:cseg,ds:data;ss:stack

        push    ds
        sub     ax,ax
        push    ax

        mov     ax,seg data
        mov     ds,ax

        mov     ah,6
        mov     al,0
        mov     cx,0
        mov     dh,23
        mov     dl,79
        mov     bh,7
        int     10h

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

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

        lea     dx,msg
        mov     ah,9
        int     21h

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

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

        lea     dx,buff1
        mov     ah,10
        int     21h

        mov     cx,10
        mov     bh,0
        mov     bl,buff2
        mov     si,bx
        lea     bx,char
        mov     ah,blank

        mov     byte ptr [bx+si],ah

d01:
                mov     ah,9
                lea     dx,char
                int     21h
                loop    d01


        mov     dx,0
        mov     ah,1
        int     17h

        mov     si,1
d03:
                lea     bx,char
                mov     di,0
                mov     ah,0
                mov     al,buff2
                mov     cx,ax
d02:
                mov     ah,5
                mov     dl,byte ptr [bx+di]
                inc     di
                int     21h
                loop    d02

        mov     ah,5
        mov     dl,0ah
        int     21h
        mov     ah,5
        mov     dl,0dh
        int     21h
        inc     si
        cmp     si,nprint
        jb      d03

        ret
cprint  endp
cseg    ends
end     cprint:ouch:

12
ASM (Ensamblador) / Re: como hacer un temporizador
« en: Miércoles 15 de Octubre de 2003, 16:29 »
Yo he estado tratando de trabajar con esas instrucciones, pero los valores que se devuelven de la función 2ch INT 21h y almacenan en los registros AL,DL,etc estan en binario no es asi?... creo que se tienen que convertir a ASCII para poder mostrarse en pantalla. al convertir estos datos en ASCII he tenido problemas, si lo resuelvo antes pongo el codigo, si Super_G tienes una solucion te agradeceré tu ayuda.  
:question:

13
ASM (Ensamblador) / Que onda con el BIOS?
« en: Viernes 10 de Octubre de 2003, 14:52 »
Hola que tal?, he estado checando las instrucciones para el manejo de rutinas del BIOS (in,out), me parace que misterwilliam realizó un programa que detectaba el Hw de su pc, mi pregunta es, en este caso se utilizan esta instrucciones?, por lo que he leido, se puede obtener datos sobre la cantidad de Disco, memoria, etc. pero no tengo ningun ejemplo practico, que haga algo en concreto relacionado con la comunicación hacia un dispositivo periferico usando rutinas del Bios, si alguien sabe de esto agradezco mucho su ayuda y comentarios.

:food:

14
ASM (Ensamblador) / Re: Par e Impar
« en: Jueves 2 de Octubre de 2003, 19:33 »
Muchas gracias Super_G  era precisamento lo que me dijiste, el resuduo queda en DX, solo cambie eso y el programa funciona correctamente, ahora leeré más del por qué de este almacenamiento en DX y no en AH como yo creia, gracias nuevamente, hasta pronto.
:beer:

15
ASM (Ensamblador) / Re: Par e Impar
« en: Lunes 29 de Septiembre de 2003, 20:49 »
:brickwall:
Hola Amigos, tengo un problemilla , estoy realizando un programa que me determine si un numero es Par o Impar pero algo no esta bien, aqui les muestro el codigo esperando que uno de ustedes me pueda iluminar porque no he podido, siento que estoy mal en los saltos, pero no lo consigo, les agradezco mucho ayuda bye.

pila    segment         stack
pila    ends
data    segment
        msg1     db     "Par",10,13,"$"
        msg2     db     "Impar",10,13,"$"
        num     dw      6
        d       dw      2      
data    ends
code    segment
        assume ds:data,cs:code,ss:pila
inicio:
        mov ax,data
        mov ds,ax
        mov dx,0
        mov ax,num
        mov bx,d
        div bx
        cmp ah,0d
        jz par
        jmp impar


par:
        mov dx,offset msg1
        mov ah,09h
        int 21h
        jmp fin

impar:
        mov dx,offset msg2
        mov ah,09h
        int 21h
        jmp fin

fin:
        mov ah,4ch
        int 21h

code    ends
       end inicio


:jumpie:

16
ASM (Ensamblador) / como imprimir un número en pantalla?
« en: Viernes 26 de Septiembre de 2003, 21:36 »
John , mira hay varias formas, y ademas tienes que ver que clase de numeros, porque los enteros se imprimen en forma diferente de los reales(punto flotante), asi que tienes que ver que tipo de numeros deseas imprimir en pantalla

17
ASM (Ensamblador) / Re: uso del coprocesador
« en: Miércoles 24 de Septiembre de 2003, 20:47 »
:comp:

Gracias por el programita de suma Super_G, por cierto, he trabajado con una forma de mostrar en pantalla numeros fraccionarios pero no se si tu o alguien más conozca otra forma de hacerlo, lo que pasa es que me arroja una variación en el resultado de casi cualquier operacion (sumas en especifico), agradezco la ayuda que me puedas prestar (o alguien que sepa que es lo que pasa en este caso).
cuelgo el codigo de un programa que he usado para sumar dos numeros y mostrar el resultado en reales.

Hasta pronto!!!

   ;Programa que usa el coprocesador y  muestra un numero de punto flotante con
      ;de precisión sencilla
.286
.287
DATAS   SEGMENT

TEMP   DW   ?
WHOLE   DW   ?
FRACT   DD      ?
n1      dd      -51.35
n2      dd      30.25
suma    dd      ?

DATAS   ENDS
CODE   SEGMENT
   ASSUME CS:CODE,DS:DATAS
;PROGRAMA PRINCIPAL QUE MUETRA NUMB
MAIN   PROC   FAR
   MOV   AX,DATAS
   MOV   DS,AX
;        CALL    LIMPIA  
   call   sumar
        CALL    DISP    ;MUETRA suma
   MOV   AH,4CH
   INT   21H

MAIN   ENDP

LIMPIA  PROC    FAR
        MOV     AH,6
        MOV     AL,0
        MOV     CX,0
        MOV     DH,23
        MOV     DL,79
        MOV     BH,7
        INT     10H
        RET
                       
LIMPIA  ENDP

sumar   proc   NEAR
   fld   n1
        fadd    n2
   fstp   suma
   fwait
   ret
sumar   endp
   
DISPS   PROC   NEAR
   MOV   AH,6   ;MOSTRAR AL
   MOV   DL,AL
   INT   21H
        RET
DISPS   ENDP

DISP   PROC   NEAR
   FSTCW   temp
   OR   temp,0C00H
   FLDCW   TEMP

        FLD     suma            ;OBTENER AREA
        FTST                    ;PROBAR AREA
   FSTSW   AX      ;ESTADO AX
   AND   AX,4500H   ;OBTENER C3,C2,C0
   CMP   AX,0100H   ;PROBAR PARA -
   JNE   DISP1      ;SI ES POSITIVO
   MOV   AL,'-'      
   CALL   DISPS      ;MOSTRAR MENOS

DISP1:
   FABS         ;CONVERTIR ST EN POSITIVO
   FRNDINT         ;OBTENER NUMERO ENTERO
   FIST   WHOLE      ;GUARDAR NUMERO ENTERO
   FLD   suma
   FABS
   FSUB         ;OBTENER FRACCION
   FABS
   FSTP   FRACT      ;GUARDAR FRACCION
   FWAIT

;MOSTRAR PARTE DE NUMERO ENTERO

   MOV    AX,WHOLE
   MOV   CX,0
   MOV   BX,10

DISP2:
   INC   CX
   XOR   DX,DX
   DIV   BX
   ADD   DX,'0'      ;CONVERTIR A ASCII
   PUSH   DX
   OR   AX,AX
   JNE   DISP2      ;SI NO ES CERO
DISP3:
   POP   AX
   CALL   DISPS      ;MOSTRARLO
   LOOP   DISP3
   MOV   AL,'.'      ;MOSTRAR PUNTO DECIMAL
   CALL   DISPS

;MOSTAR PARTE DE FRACCION
   
        MOV     AX,WORD PTR FRACT
        MOV     DX,WORD PTR FRACT+2
   MOV   CX,8

DISP4:
   SHL   AX,1
   RCL   DX,1
   LOOP   DISP4
        OR      DX,8000H           ;INSTALAR BIT IMPLICITO
   XCHG   AX,DX
   MOV   BX,10

DISP5:

   MUL    BX
   PUSH   AX
   XCHG   DX,AX
   ADD   AL,'0'
   CALL   DISPS
   POP   AX
   OR   AX,AX
   JNZ   DISP5
   RET
DISP   ENDP
CODE    ENDS
   END   MAIN

18
ASM (Ensamblador) / Re: uso del coprocesador
« en: Viernes 19 de Septiembre de 2003, 15:53 »
:comp:
¡¡¡Hola Amigos!!!
Ok, tengo un problema, he estado tratando de programar algo del coprocesador, solo que he checado en libros y en paginas, y la verdad encuentro pocos ejemplos de programas que empleen instrucciones para el coprocesador, espero que alguien me pueda ayudar mandandome algun programa(por pequeño que sea) que maneje el coprosador.
Se los agradezco mucho, hasta pronto.


logan@itoaxaca.edu.mx

:yes:

19
ASM (Ensamblador) / Re: codigo de suma
« en: Miércoles 20 de Agosto de 2003, 15:19 »
Hola a todos, agradeceré a que alguien me ayude con un codigo para sumar dos numeros insertados por teclado, lo he intentado pero algo sale mal y no me muestra el resultado.
:comp:

Muchas Gracias

Páginas: [1]