Citar
y veo un "sub $0x16,%esp" y no un "sub $0x20,%esp" en function, y supongo que es porque cada palabra(word) es de
2 bytes y no 4 como dice el texto, porque serian 6 bytes es decir 3 palabras para buffer1 y 5 palabras
para buffer2, es decir un total de 16 bytes.
2 bytes y no 4 como dice el texto, porque serian 6 bytes es decir 3 palabras para buffer1 y 5 palabras
para buffer2, es decir un total de 16 bytes.
Por lo que tengo entendido te equibocas. 5 bytes (del buffer 1) + 10 (del buffer 2) suman 15 bytes y como se reserva de 4 en 4 se queda en 16 bytes.
3-zhynar_X no creo que los valores que se guardan en la pila se puedan mezclar asi no creo que sea valido simplemente sumar los 5 y 10 bytes y dado que se reservan de a 4 (si un word es de 4) finalmente se ocupen 16 bytes, me parece mas logico el procedimiento seguido en el texto en el cual se van guardando asi no se utilicen 2 words para 5 bytes (si el word es de 4 bytes) y asi sucesivamente, entonces porque obtengo el "sub $0x16,%esp"?????.
Con este código:
Código:
char a[60];
char c[2];
char b[2];
strcpy(b,"AAAAABCD--------------AAAA");
printf("Contenido de b -> %s\n",b);
printf("Contenido de a -> %s\n",a);
Según he entendido a zhynar_X en la pila se almacenan los 2 bytes de b, los 2 de c y los 15 de a, en total 19 bytes, como hay que reservar la memoría en bloques de 4 bytes... ocupa 20 bytes.char c[2];
char b[2];
strcpy(b,"AAAAABCD--------------AAAA");
printf("Contenido de b -> %s\n",b);
printf("Contenido de a -> %s\n",a);
Pero según entiendo a cualqueircosa, la memoría se reserva por cada variable en bloques de 4 bytes entonces se almacenarian 4 bytes de b, 4 bytes de c y 16 bytes de a, en total 24 bytazos.
Yo opto más por la versión de cualquiercosa. ¿Cual es la correcta? Si es que he interpretado alguna bien ...
Con lo de las palabras, word y demases cito:
Citar
A nivel de harware, hablamos de "palabras" (o words) para referirnos a la unidad básica o la cantidad de bytes con que el procesador "se sienta más cómodo"
Vamos que en un procesador de 32 bits las palabras son de 4 bytes.Citar
Por regla general, también se habla de "word" o "palabra" como equivalente a 2 bytes.
vaya por dios, asi que "word" se usa para definir 2 y 4 bytes, que caos !!El tipo WORD de windows es de 2 bytes
Código:
#include<stdio.h>
#include<windows.h>
int main(){
WORD w;
printf("%d", sizeof(w));
return 0;
}
2 , windows si que sabe.#include<windows.h>
int main(){
WORD w;
printf("%d", sizeof(w));
return 0;
}
Para mi que antes estaban acostumbrados a usar indistintamente el termino palabra, "word" para referirse tanto a posiciones de memoria (en los tiempos de procesadores de 16 bits) como al tipo de datos word, tmb de 2 bytes. Pero entonces vieneron los malvados procesadores de 32 bits dividiendo el termino palabra en 2, el tipo de datos word de 2 bytes, y el termino word referido a posiciones de memoría, que ocupaba 4 bytes (en las cpus de 32).
Espero no haber liado mas el lío existente.
Muchas gracias Anon tu explicación es magnifica.
Una última cosa, como decía Ertai, cuidado con los punteros, son un peligro para la raza humana:
Código:
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
gcc da un aviso, punteros incompatibles, menos mal que lo interpreta como si hubiesemos puesto:char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
Código:
(char *)ret = buffer1 + 12;
Como si ret fuera un puntero de tipo char, pero quizás algún novato se le ocurre cambiar el código por esto:Código:
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1;
ret += 12;
(*ret) += 8;
}
Y se vuelve loco preguntándose porque le suma a ret 48 en vez de 12 que es lo que el ha puesto.char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1;
ret += 12;
(*ret) += 8;
}
Así que...no cuesta nada definir el puntero como char y evitar lios con punteros
Código:
char *ret;
Valla parrafada mas absurda he escrito











Autor


En línea





