Buscador
YoReparo.com La Web 
www.YoReparo.com

Regístrate gratis para participar de los foros, o si ya estás registrado haz login.

Lenguaje C, puntero a funcion

comentario del autor Jue May 13, 2004 7:59 pm
   
Estudio C de un libro y hay un ejercicio propuesto de imprimir los 100 primeros bytes de printf()
Segun lo que leo printf es un puntero tipo constante al codigo de inicio de la funcion, mis dudas son (trabajo en modelo small):
¿La direccion es el offset desde el inicio del CS o una direccion absoluta.

Se puede hacer
unsigned int _cs *ptr;
for(ptr=printf; ptr<printf+50; ptr++) printf("%X", *ptr);

Quiza parezca una consulta tonta, pero consultando con diferentes personas me dan distintas versiones.

Saludos y gracias.

sanata

Reputación

asistió a la solución Sab May 15, 2004 12:52 pm
   
No quiero payar, pero en modelo small justamente todas las direcciones son justamente solo el offset pues se trabaja dentro de un segmento.

Sobre el código para hacer el ejercicio, tendría que pensarlo. ¡¿Dónde dejé el K&R?!

Saludos.

mauricio

Reputación

comentario del autor Mar Jun 08, 2004 4:49 pm
   
Gracias por responder Mauricio, yo la duda existencial que tengo es que si el offset esta tomado desde el CS por ser la funcion codigo, si yo declaro una variable (para recorrer la funcion leyendo la memoria) , como es un dato, va a estar ubicada en el DS (voy a tener el offset correcto pero respecto al DS si hago el puntero=printf; ). Yo hice una prueba con un puntero lejano y con un puntero cercano con especificador _cs que por lo que leo toma directamente el offset desde el CS y cuando imprimo su contenido me dan cosas distintas. Ya consulte con 4 personas y las versiones son distintas, si alguien tiene algun dato de alguna pagina, foro o libro donde buscar, muy agradecido.
Saludos y gracias

sanata

Reputación

comentario Mie Jul 28, 2004 5:32 am
   
PRUEBA CON ESTO:
CHAR INTELIGENCIA[20]
PROCEDURE(SOY UN TONTO)
REPEAT
WRITEXY("SOY UN TONTO")
UNTIL INTELIGENCIA == "NOTONTO"

Bill Gates

Reputación

comentario Mie Jul 28, 2004 2:26 pm
   
Bill, eso que escribistes no es C y ciertamente ni siquiera es PASCAL. Podrías habernos demostrado tu sabiduría suprema usando al menos código real.

mauricio

Reputación

comentario del autor Jue Jul 29, 2004 1:11 am
   
Agradezco la colaboracion de todos, luego de leer algunas cosas pude ver que como todo lo que es codigo esta fuera del segmento de datos, en small hay que usar un puntero far o con modificador _cs para refenciar, de modo que tome los 2 bytes de direccion y los 2 de offset.
Saludos y gracias

sanata

Reputación

sin valorar Jue Jul 29, 2004 2:18 am
   
Y dicho en código ¿cuál fue la solución?

La verdad que la pregutna estaba buena, lástima que hace dos años que solo toco PHP. Sad

mauricio

Reputación

comentario del autor Lun Ago 23, 2004 1:21 am
   
Bueno, mando el codigo, perdon por la tardanza, pero no tengo internet en casa y me olvidaba de bajarlos a diskete.
Saludos y gracias por todo, le estoy metiendo pata a ver si paso a C++ y luego a Java, como veras tengo un atraso importante pero confio en avanzar rapido.

/* Muestra los primeros 100 bytes de la funcion printf usando
modificadores de segmento.*/

#include<conio.h>
#include<stdio.h>
#include<dos.h>

void main(){
unsigned char _cs* funcion; // _cs especifica puntero cercano al CS
int bloque , i ;
struct SREGS dir; // tiene como campos la direccion de los registros (DOS.H)

bloque = 100;
funcion = (unsigned char _cs*) printf;
clrscr();
printf("Primeros %d bytes de codigo de la funcion printf \n\n", bloque);
segread(&dir);
while (bloque){
printf("%4p:%4p ", dir.cs, funcion);
for(i=0 ; i<16 ; i++){
printf("%02X ", *funcion );
if (!(-- bloque)) break;
funcion ++;}
printf("\n");}
getche();
}



/* Muestra los primeros 100 bytes de la funcion printf usando
punteros lejanos */

#include <stdio.h>
#include <conio.h>
#define bloque 100


void main()
{
unsigned char far* codigo ; // es lejano para contener la direccion y el offset
int i , j, cuenta ;

codigo = (unsigned char far*) printf;
cuenta=1;
clrscr();
printf("Primeros %d bytes de codigo de la funcion printf \n\n", bloque);
for ( i=0 ; i < 17 ; i++ ) {
printf("%lX \b\b\b\b\b:%X ", codigo, codigo);
for( j=1 ; j < 17 ; j++ ) {
printf("%02X ", *codigo);
if (!(bloque - cuenta )) break;
cuenta ++;
codigo++;
}
printf("\n") ;
if (!( bloque-cuenta )) break;
}
getch();
}

sanata

Reputación



Hacer una pregunta

Reglamento / P+F

Foros

Miembros / Expertos