Olá! Eu e meu grupo estamos com algumas dúvidas em relação ao projeto:
>> Tipos:
Na hora de checar se os tipos dos operandos que estamos criando são válidos, estávamos fazendo o seguinte:
1) Encontra o operador op correspondente na tabela optable
2) Checa se operand[i]->type == op->opd_types[i]
Porém, no caso em que o operando pode ter múltiplos tipos, como para um IS, isso parece não funcionar:
{ .name = "IS", .opcode = IS, .opd_types = { REGISTER | TETRABYTE | NEG_NUMBER, OP_NONE, OP_NONE }
Na tabela temos que o primeiro operand para o operador IS pode ser um REGISTER, um TETRABYTE ou um NEG_NUMBER, e quando fazemos opd_types[0] temos 0x68 (que a soma desses valores: REGISTER = 0x20, TETRABYTE = 0x08 e NEG_NUMBER = 0x40)
Porém, os únicos tipos de operandos que podemos criar nessa fase são REGISTER, LABEL, STRING e NUMBER_TYPE (usando as funções em asmtypes.h), então nesse caso teríamos um operand de tipo REGISTER, isso é, operand->type = 0x32 != 0x104 que falharia a comparação acima, fazendo com que o operando seja considerado inválido, quando isso não deveria acontecer.
O mesmo ocorre com um operador que exige um BYTE específico, sendo que só podemos mandar NUMBER_TYPE definido como:
#define NUMBER_TYPE (BYTE1 | BYTE2 | BYTE3 | TETRABYTE | NEG_NUMBER)
E se checamos o tipo de um operando NUMBER_TYPE obtemos o valor 0x65, que é a soma dos valores de BYTE1, BYTE2, etc definidos acima.
A soma dos valores deveria acontecer? Ou existe algum outro jeito de testar a validade dos tipos de cada operando?
>> Sobre as chamadas de sistema:
{ .name = "INT", .opcode = INT, .opd_types = { BYTE3, OP_NONE, OP_NONE } },
O primeiro operando das instruções definidas por INT #num seriam teoricamente do tipo NUMBER_TYPE (que engloba BYTE3), portanto criados pela função operand_create_number, que recebe um octa, que no caso é um long long.
Como converteríamos um valor '#num' para um long long? Pegamos apenas a parte numérica e ignoramos o '#'? Mas nesse caso qual seria a diferença entre um "INT #80" e um "INT 80"? A segunda instrução não deveria causar um erro?
Também tem o caso das instruções de depuração INT #DBYYZZ e INT #ADYYZZ, onde YY e ZZ são registradores. Como converter esses valores pra long long?
>> Sobre labels e a tabela de símbolos:
1) No caso de labels que aparecem como operandos, deveríamos apenas checar se elas são válidas? (não começa com número, apenas caracteres alfanuméricos + '_', etc) ou também checar se elas estão na tabela de símbolos e levantar algum erro do tipo "label não definida"?
2) No caso de labels que aparecem como labels mesmo (antes de um operador), deveríamos guardar o valor da linha na tabela para usarmos no caso de um JMP? Se sim, como diferenciar o EntryData que é um operando (caso 1) de um EntryData que é um inteiro? (caso 2)
Obrigada!