fix classification logic for str/ldr

This commit is contained in:
EDiasAlberto 2024-06-13 20:36:00 +01:00
parent 3104da7f30
commit f5d35ce246

View File

@ -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){