From f5d35ce2465f3eacfa287f2418ffdf05a8a54e23 Mon Sep 17 00:00:00 2001 From: EDiasAlberto Date: Thu, 13 Jun 2024 20:36:00 +0100 Subject: [PATCH] fix classification logic for str/ldr --- src/parser.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/parser.c b/src/parser.c index 9c1dacb..5f9f652 100644 --- a/src/parser.c +++ b/src/parser.c @@ -13,7 +13,7 @@ void parse_instruction(char asmLine[], a64inst_instruction *instr); static char *duplicateString(char *str); void parseSingleTransfer(a64inst_instruction *instr, char *opcode, char *operandList[], int numOperands); void parseBranch(a64inst_instruction *instr, char* opcode, char *operandList[]); -void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[], int numOperands); +void calculateAddressFormat(a64inst_instruction *instr, char *operandList[], int numOperands); void parseDPImmediate(a64inst_instruction *inst, char *tokens[], int tokensCount); void parseDPRegister(a64inst_instruction *inst, char *tokens[], int tokensCount); @@ -141,7 +141,7 @@ void parse_instruction(char asmLine[], a64inst_instruction *instr) { case a64inst_SINGLETRANSFER: parseSingleTransfer(instr, opcode, tokens, tokensCount); - calcluateAddressFormat(instr, tokens, tokensCount); + calculateAddressFormat(instr, tokens, tokensCount); break; case a64inst_LOADLITERAL: parseSingleTransfer(instr, opcode, tokens, tokensCount); @@ -183,31 +183,32 @@ int getOperandNumber(char *operand){ } -void calcluateAddressFormat(a64inst_instruction *instr, char *tokens[], int tokenCount) { +void calculateAddressFormat(a64inst_instruction *instr, char *tokens[], int tokenCount) { assert(*tokens[2] == '['); int operandCount = 0; + char unsplitString[strlen(tokens[2])]; + strcpy(unsplitString, tokens[2]); char **operands = tokeniseOperands(tokens[2], &operandCount); int baseRegister = getOperandNumber(operands[0]); instr->data.SingleTransferData.processOpData.singleDataTransferData.base = baseRegister; - if(operands[1][strlen(operands[1])-1] == '!') { + 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(operands[1][strlen(operands[1])-1] == ']') { - // POST_INDEXED - instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED; - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(tokens[3]); - + } 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]); - + } else if(unsplitString[strlen(unsplitString)-1] == ']') { + // POST_INDEXED + instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED; + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(tokens[3]); + } else { instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET; if(operandCount > 1){