PR04 - NEG_NUMBER

PR04 - NEG_NUMBER

por Bruno Carneiro da Cunha -
Número de respostas: 2

Oi povo, estou procurando alguma especificação quanto ao tipo de operando NEG_NUMBER e não estou achando uma definição. O código diz que NEG_NUMBER pode ser negativo, mas parece que não é uma obrigação. Como vou distinguir um BYTE2 de um NEG_NUMBER? Quantos bytes ocupará um NEG_NUMBER? EXISTE VIDA EM OUTROS PLANETAS!!???

Em resposta à Bruno Carneiro da Cunha

Re: PR04 - NEG_NUMBER

por José Coelho de Pina -

Oi Bruno,

Como vou distinguir um BYTE2 de um NEG_NUMBER?

Hmm. pensativo
Acho que não precisa.

A primeira regra é tentar fazer algo simples que funcione e depois ir adicionando os pedaços.

O negócio é o seguinte. No parse():

  1. percorrendo a string s encontramos um operador op (pode ou não haver label antes, uma coisa por vez);
  2. só sabemos que é um operador pois pegamos um string e utilizamos a função

    /*
      Return pointer to operator given its name.
    
      If the operator is in the table, returns NULL.
    */
    const Operator *optable_find(const char *name);

    Não precisamos saber disso, mas essa função está implementada em optable.c e consulta uma sua tabela privada (static) bem legal mostrando a língua

    static const Operator operators[] = 
      {
        { .name = "ADD",  .opcode = ADD,  .opd_types = { REGISTER, REGISTER, IMMEDIATE } },
        { .name = "ADDU", .opcode = ADDU, .opd_types = { REGISTER, REGISTER, IMMEDIATE } },
      [...]
  3. Essa função nos retorna tudo que precisamos saber sobre o operador, inclusive seu código e qual o tipo de seu operandos
  4. continuando a percorrer a nossa string s descobrimos o início de um número (pode ser um blá, $blá, #blá, sei lá o que blá;
  5. podemos agora pedir a ajuda de uma função da biblioteca stdlib como

    TRTOL(3)                                         Linux Programmer's Manual                                         STRTOL(3)
    
    NAME
           strtol, strtoll, strtoq - convert a string to a long integer
    
    SYNOPSIS
           #include <stdlib.h>
    
           long int strtol(const char *nptr, char **endptr, int base);
    
           long long int strtoll(const char *nptr, char **endptr, int base);
  6. uma função como essa tranforma o nossa em um, digamos, long int chamado val
  7. considerando o tipos esperados como argumentos e val devemos saber como proceder.

Não deixem de ler os tópicos iniciados pela Bruna e pela Nathalia:

Ufa!
Acho que por enquanto é só

Em resposta à José Coelho de Pina

Re: PR04 - NEG_NUMBER

por Guilherme Costa Vieira -

Estava refletindo sobre números negativos, e se o cara me der um número negativo em hexadecimal?

Pra ser sincero eu nem sei direito como é hexadecimal negativo. Eu imagino que não se usa o sinal de '-' pois a graça dos números hexadecimais é convertê-los pra binário facilmente, então deve ser relacionado com o complemento de dois.

O que vocês acham?