diff --git a/src/parser.c b/src/parser.c index daa2519..2ffc104 100644 --- a/src/parser.c +++ b/src/parser.c @@ -269,30 +269,29 @@ void calculateAddressFormat(a64inst_instruction *instr, char *tokens[], int tok instr->data.SingleTransferData.processOpData.singleDataTransferData.base = baseRegister; - if(unsplitString[strlen(unsplitString)-1] == '!') { - instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED; - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(operands[1]); - - } else if(operandCount==2) { - if((isOperandRegister(*operands[0]) == 1) - && (isOperandRegister(*operands[1]) == 1)){ - //register - instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET; - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = getOperandNumber(operands[1]); - } - } else if(unsplitString[strlen(unsplitString)-1] == ']') { - // POST_INDEXED + if (tokenCount >= 4) { instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED; instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(tokens[3]); - } else { + } else if(unsplitString[strlen(unsplitString)-1] == '!') { + instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED; + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(operands[1]); + + } else if (operandCount == 1 || (!isOperandRegister(*operands[1]))) { instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET; if(operandCount > 1){ int offset = getOperandNumber(operands[1]); instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8; //NEED TO SCALE IMMEDIATE VALUE BASED ON REGISTER TYPE IN ASSEMBLER } - } + } else { + if((isOperandRegister(*operands[0]) == 1) + && (isOperandRegister(*operands[1]) == 1)){ + //register + instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET; + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = getOperandNumber(operands[1]); + } + } } static int parseRegisterType(char *operand) {