|
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
« 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.
2
« 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: #include<stdio.h> #include<conio.h> char res; char palabra[20]; int main() { do { clrscr(); printf("Escribe tu nombre "); scanf("%s",&palabra); printf("hola %s",palabra); gotoxy(20,22); printf("desea continuar ... s/n "); scanf("%c",&res); }while (res=='s' || res=='S'); printf("bien..."); puts("Bye..."); getch(); return 0; }
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 do { .... }while(getch()==115)
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
« 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
4
« 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
5
« 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.
6
« 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
7
« 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!!!.
8
« 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
9
« 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
« 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
« 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
« 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.
13
« 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.
14
« 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.
15
« en: Lunes 29 de Septiembre de 2003, 20:49 »
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
16
« 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
« en: Miércoles 24 de Septiembre de 2003, 20:47 »
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
« en: Viernes 19 de Septiembre de 2003, 15:53 »
¡¡¡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
19
« 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. Muchas Gracias
Páginas: [1]
|
|
|