Skip to content

Laboratório 4

Objetivo

Escreva um programa C que leia um número da entrada do usuário em formato hexadecimal ou decimal e o converta em representações binária, decimal e hexadecimal. O programa deve lidar com números positivos e negativos.

Seu programa deve ler uma série de caracteres codificados em formato ASCII da entrada padrão (STDIN). Esses caracteres representarão um número no formato decimal ou hexadecimal. Abaixo, você encontrará as funções necessárias para ler/escrever informações de/para a entrada/saída padrão, juntamente com uma ilustração concisa de como elas podem ser utilizadas:

int read(int __fd, const void *__buf, int __n){
    int ret_val;
  __asm__ __volatile__(
    "mv a0, %1           # file descriptor\n"
    "mv a1, %2           # buffer \n"
    "mv a2, %3           # size \n"
    "li a7, 63           # syscall write code (63) \n"
    "ecall               # invoke syscall \n"
    "mv %0, a0           # move return value to ret_val\n"
    : "=r"(ret_val)  // Output list
    : "r"(__fd), "r"(__buf), "r"(__n)    // Input list
    : "a0", "a1", "a2", "a7"
  );
  return ret_val;
}

void write(int __fd, const void *__buf, int __n)
{
  __asm__ __volatile__(
    "mv a0, %0           # file descriptor\n"
    "mv a1, %1           # buffer \n"
    "mv a2, %2           # size \n"
    "li a7, 64           # syscall write (64) \n"
    "ecall"
    :   // Output list
    :"r"(__fd), "r"(__buf), "r"(__n)    // Input list
    : "a0", "a1", "a2", "a7"
  );
}

void exit(int code)
{
  __asm__ __volatile__(
    "mv a0, %0           # return code\n"
    "li a7, 93           # syscall exit (64) \n"
    "ecall"
    :   // Output list
    :"r"(code)    // Input list
    : "a0", "a7"
  );
}

void _start()
{
  int ret_code = main();
  exit(ret_code);
}

#define STDIN_FD  0
#define STDOUT_FD 1

int main()
{
  char str[20];
  /* Read up to 20 bytes from the standard input into the str buffer */
  int n = read(STDIN_FD, str, 20);
  /* Write n bytes from the str buffer to the standard output */
  write(STDOUT_FD, str, n);
  return 0;
}

Descrição da Entrada do Programa

Um número de 32 bits representado por uma sequência de até 10 caracteres, seguida por um caractere de nova linha ("\n").

  • Se a string representar um número na base hexadecimal, ela começará com os caracteres "0x".
  • Caso contrário, começará com um número de 1 a 9 ou com o sinal de menos (-), indicando que o número a ser lido é negativo.

Nota

O sinal de menos (-) não será utilizado em entradas em representação hexadecimal (por exemplo, -0x12 não é uma entrada válida).

Descrição da Saída do Programa

Depois de ler o número de 32 bits, você deve imprimir as seguintes informações seguidas de caracteres de nova linha:

  • O valor em base binária precedido por “0b”. Se o número for negativo, você deverá exibir o valor na representação em complemento de dois (conforme ilustrado no terceiro exemplo abaixo);
  • O valor em base decimal assumindo que o número de 32 bits está codificado em representação em complemento de dois (neste caso, se o bit mais significativo for 1, o número é negativo);
  • O valor em base decimal, assumindo que o número de 32 bits está codificado em representação não assinada e seu endianness foi trocado;
  • O valor em base hexadecimal precedido de “0x”. Se o número for negativo, você deverá mostrar o valor na representação em complemento de dois (conforme ilustrado no terceiro exemplo abaixo);
  • O valor em base octal precedido de “0o”. Se o número for negativo, você deverá mostrar o valor na representação em complemento de dois (conforme ilustrado no terceiro exemplo abaixo);

Exemplos

Entrada | 545648
--------|---------------|
Saída   | 0b10000101001101110000
        | 545648
        | 1884489728
        | 0x85370
        | 0o2051560


Entrada | 0x545648
--------|---------------|
Saída   | 0b10101000101011001001000
        | 5527112
        | 1213617152
        | 0x545648
        | 0o25053110

Entrada | -545648
--------|---------------|
Saída   | 0b11111111111101111010110010010000
        | -545648
        | 2427254783
        | 0xfff7ac90
        | 0o37775726220

Entrada | 0x80000000
--------|---------------|
Saída   | 0b10000000000000000000000000000000
        | -2147483648
        | 128
        | 0x80000000
        | 0o20000000000

Entrega

Utilize o assistente disponível neste link para avaliar seu código e gerar o relatório de execução. Além disso

  • Renomeie o arquivo de relatório para {SeuRA}_lab4.report antes de submeter no Classroom
  • O arquivo do relatório deve ser submetido até às 23:59 do dia 28/03/20244.