fix directive value parsing

This commit is contained in:
EDiasAlberto 2024-06-14 16:52:48 +01:00
parent 6aa93c79ae
commit 16e52a9421

View File

@ -88,6 +88,26 @@ int isOperandRegister(char regStartChar) {
return((regStartChar == 'x') || (regStartChar == 'w'));
}
//takes inputted char array and returns the integer of the operand, skipping the first character
//e.g. for a passed "R32", it skips the 'R' and returns 32
int getOperandNumber(char *operand){
char operandCpy[strlen(operand)];
strcpy(operandCpy, operand+1);
char **endptr = NULL;
int number;
if((strncmp(operandCpy, "0x", 2)==0)) {
//hex value
strcpy(operandCpy, operand+3);
number = strtol(operandCpy, endptr, 16);
} else if(operandCpy[0]=='x'){
strcpy(operandCpy, operand+2);
number = strtol(operandCpy, endptr, 16);
} else {
number = strtol(operandCpy, endptr, 10);
}
return number;
}
int classifyDPInst(char *operandList[]){
return(isOperandRegister(operandList[1][0]) &&
isOperandRegister(operandList[2][0]) &&
@ -188,6 +208,7 @@ void parse_instruction(char asmLine[], a64inst_instruction *instr) {
if(strcmp(opcode, ".int") == 0){
// Directive
instr->type = a64inst_DIRECTIVE;
instr->data.DirectiveData.value = getOperandNumber(tokens[1]);
} else if(opcode[strlen(opcode)-1]== ':') {
// Label
@ -230,22 +251,7 @@ void parse_instruction(char asmLine[], a64inst_instruction *instr) {
}
//takes inputted char array and returns the integer of the operand, skipping the first character
//e.g. for a passed "R32", it skips the 'R' and returns 32
int getOperandNumber(char *operand){
char operandCpy[strlen(operand)];
strcpy(operandCpy, operand+1);
char **endptr = NULL;
int number;
if(strncmp(operandCpy, "0x", 2)==0){
//hex value
strcpy(operandCpy, operand+3);
number = strtol(operandCpy, endptr, 16);
} else {
number = strtol(operandCpy, endptr, 10);
}
return number;
}
void calculateAddressFormat(a64inst_instruction *instr, char *tokens[], int tokenCount) {