Você está na página 1de 2

Instituto Superior de Engenharia de Lisboa

Programação II
2014/15 – 1.º semestre letivo
Segunda Série de Exercícios
Entregue o código realizado devidamente indentado e comentado. Contacte o docente se tiver
dúvidas. Não é necessário relatório. Encoraja-se a discussão de problemas e soluções com
colegas de outros grupos, mas recorda-se que a partilha direta de soluções leva, no mínimo, à
anulação das entregas de todos os envolvidos.

1. Escreva, em assembly IA-32, a função swap_endian, destinada a converter a


representação de variáveis de little-endian para big-endian ou em sentido inverso,
tomando como referência o código seguinte. Os parâmetros indicam o endereço e a
dimensão da variável a converter.

void swap_endian( void * addr, int size ){


char * p1 = (char*)addr, * p2;
for( p2 = p1 + size -1; p1 < p2 ; ++p1, --p2 ){
char aux = *p1;
*p1 = *p2;
*p2 = aux;
}
}
Escreva um programa de teste que permita demonstrar o funcionamento com variáveis de
diversas dimensões.

2. Escreva, em assembly IA-32, a função bit_scan_forward especificada na primeira


série de exercícios, tomando como referência o código seguinte. Defina o símbolo
BITMAP_SIZE com o valor 5, correspondendo a um bit-map com 160 bits. O símbolo
CHAR_BIT representa o número de bits do tipo char e está definido no ficheiro de
sistema limits.h.

int bit_scan_forward( Bitmap data ){


int i, j;
for( i=0; i != BITMAP_SIZE; ++i ){
if( data[i] ){
int j;
for( j=0; ( data[i] & (1<<j) ) == 0; ++j )
;
return i * sizeof *data * CHAR_BIT + j;
}
}
return -1;
}

2.1. Escreva a função, implementando os dois ciclos for do algoritmo proposto.

Página 1 de 2
PG II – 2014/15-1 Segunda Série de Exercícios Página 2 de 2

2.2. Escreva a função, explorando a instrução bsf (bit scan forward), em substituição
do ciclo for interior.
Sugere-se o aproveitamento do programa de teste, realizado no âmbito da primeira série
de exercícios, para testar as novas versões programadas em assembly.

3. Escreva, em assembly IA-32, a função

int selected_copy( void * dst, void * src,


int nel, int esize,
void * sel_info,
int (*select)(void *e, void * info) );

que implementa um ciclo genérico de cópia, para o array com endereço dst, de
elementos selecionados do array com: endereço, src; número de elementos, nel;
dimensão, em bytes, de cada elemento, esize. Retorna o número de elementos
copiados.

A função apontada pelo parâmetro select serve para identificar os elementos a copiar,
recebendo o endereço do elemento a avaliar e a informação complementar obtida a partir
de sel_info; retorna 1 se o elemento for selecionado, 0 no caso contrário.

Escreva um programa de teste com diversos cenários, considerando, pelo menos, a


utilização para selecionar os elementos de arrays:

• do tipo int com valor maior que a variável apontada por sel_info;
• do tipo int com valor menor que a variável apontada por sel_info;
• com um tipo struct em que um determinado campo tem o valor 0;
• com o mesmo tipo struct em que outro campo tem valor maior que a variável
apontada por sel_info.

4. Escreva, em assembly IA-32, a função

int call_printf(const char * fmt, int data[], int nelem);

que executa a função printf, passando-lhe a string de formato fmt e, na lista de


parâmetros variável, os primeiros nelem elementos do array data. Deve retornar o
valor de retorno produzido pela função printf.

Escreva um programa de teste com diversas invocações da função, usando número de


elementos diferente.

2014.11.21

Você também pode gostar