#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 0x804a018,
mostre o que esse programa irá imprimir quando executado,
explicando como você chegou aos valores exibidos.
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 no IA-32.
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 (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?