fix classification logic for str/ldr
This commit is contained in:
parent
3104da7f30
commit
f5d35ce246
23
src/parser.c
23
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){
|
||||
|
||||
Loading…
Reference in New Issue
Block a user