#include <stdio.h>
void dump(void *p, int n) {
unsigned char *p1 = (unsigned char *)p;
while (n--) {
printf("%p - %02x\n",p1,*p1);
p1++;
}
}
struct X {
double d;
float f;
short s;
} x = {-4.5, 9.75, -11};
int main(void) {
dump(&x, sizeof(x));
return 0;
}
Considerando que x seja alocado na
posição de memória 0x601040,
mostre o que esse programa irá imprimir quando executado.
Coloque PP nas posições correspondentes a padding.
Suponha que a máquina
de execução é little-endian e que as convenções
de alinhamento são as do Linux em plataforma x86-64.
Execute o programa e confira suas respostas.
foo abaixo em assembly
e escreva uma função main em C para testá-la.
Lembre de testar diferentes valores de entrada!
double foo (double a, int b) {
return a * (-b);
}
pack abaixo, e escreva uma
função main em C para testá-la (note que a função foo,
chamada por pack, já foi testada no exercício anterior!).
Para o teste de pack utilize uma lista de estruturas com pelo menos
três elementos.
struct X {
int vi;
double vd;
struct X *next;
};
double pack (struct X *px) {
double acc = 0;
while (px != NULL) {
acc += foo(px->vd, px->vi);
px = px->next;
}
return acc;
}
pack1 abaixo, e escreva uma
função main em C para testá-la. A função foo,
chamada por pack1, é a mesma do exercício 1.
struct X1 {
int vi;
float vf;
};
double pack1 (struct X1 *px, int n) {
double acc = 0;
int i;
for (i=0;i<n;i++)
acc += foo(px[i].vf, px[i].vi);
return acc;
}
arq1.c abaixo:
#include <string.h>
#include <stdlib.h>
extern int i;
char *buff = NULL;
static int k = 0;
int f(char *p);
int g(char *s1, char *s2) {
int a = strlen(s1);
int b = strlen(s2);
buff = (char *) malloc(a + b + 1);
strcat(strcpy(buff,s1), s2);
k += a + b + i;
return f(buff);
}
Liste todos os símbolos exportados e importados
pelo módulo objeto arq1.o, ou seja,
o que seria listado na saída do programa nm como
D ou B (símbolos da área de dados exportados),
T (símbolos da área de texto/código exportados)
e U (símbolos indefinidos/importados).
Para conferir sua resposta, gere o arquivo objeto arq1.o
compilando arq1.c com o comando
gcc -c arq1.c
e execute o programa nm para inspecionar a tabela de símbolos de
arq1.o.
Liste os símbolos exportados (definidos) por este módulo
e os símbolos importados por ele (referências externas).
Considere agora o módulo abaixo:
#include <stdio.h>
int g(char *s1, char *s2);
int i = 0;
int k = 0;
char s1[] = "ola";
char s2[] = " mundo";
int f(char *p) {
... /* algum código */
}
int main() {
int j;
...
j = g(s1, s2);
printf("%d",k);
...
}
Se esse módulo fosse "ligado" com o módulo anterior para compor um executável,
qual seria o resultado da chamada a printf?