diff --git a/src/parser.c b/src/parser.c index 1bcf31e..192278e 100644 --- a/src/parser.c +++ b/src/parser.c @@ -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.");