calculate base register from input

This commit is contained in:
EDiasAlberto 2024-06-09 22:21:30 +01:00
parent 34060c3fad
commit 04dda33987

View File

@ -18,14 +18,21 @@
//calculate offsets from string
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[]){
char *baseRegister = operandList[1];
baseRegister++;
baseRegister++;
char *endptr;
uint8_t base = strtol(baseRegister, endptr, 10);
instr->data.SingleTransferData.processOpData.singleDataTransferData.base = base;
if(strcmp(operandList[2][strlen(operandList[1])-1], "!")==0){
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED;
} else if(strcmp(operandList[1][strlen(operandList[0])-1], "]") == 0) {
//post-indexed
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED;
} else if( (strcmp(operandList[2][strlen(operandList[1])-1], "x") == 0)
|| (strcmp(operandList[2][strlen(operandList[1])-1], "w") == 0)){
} else if( (strcmp(operandList[2][0], "x") == 0)
|| (strcmp(operandList[2][0], "w") == 0)){
//register
instr->data.SingleTransferData.processOpData.singleDataTransferData.processOpData.addressingMode = a64inst_REGISTER_OFFSET;
} else {
@ -43,7 +50,7 @@ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *o
instr->data.SingleTransferData.regType = 0;
}
char *endptr;
instr->data.SingleTransferData.target = strtol(operandList[0][0]+1, endptr, 2);
instr->data.SingleTransferData.target = strtol(operandList[0][0]+1, endptr, 10);
calcluateAddressFormat(instr, operandList);
break;
case a64inst_LOADLITERAL:
@ -60,7 +67,7 @@ void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *oper
break;
case a64inst_REGISTER:
char *endptr;
instr->data.BranchData.processOpData.registerData.src = strtol(operandList[0] + 1, endptr, 2)
instr->data.BranchData.processOpData.registerData.src = strtol(operandList[0] + 1, endptr, 10)
break;
case a64inst_CONDITIONAL:
char* condition = strtok(strdup(opcode), "b.");