fix classification logic for str/ldr
This commit is contained in:
parent
3104da7f30
commit
f5d35ce246
19
src/parser.c
19
src/parser.c
@ -13,7 +13,7 @@ void parse_instruction(char asmLine[], a64inst_instruction *instr);
|
|||||||
static char *duplicateString(char *str);
|
static char *duplicateString(char *str);
|
||||||
void parseSingleTransfer(a64inst_instruction *instr, char *opcode, char *operandList[], int numOperands);
|
void parseSingleTransfer(a64inst_instruction *instr, char *opcode, char *operandList[], int numOperands);
|
||||||
void parseBranch(a64inst_instruction *instr, char* opcode, char *operandList[]);
|
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 parseDPImmediate(a64inst_instruction *inst, char *tokens[], int tokensCount);
|
||||||
void parseDPRegister(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:
|
case a64inst_SINGLETRANSFER:
|
||||||
parseSingleTransfer(instr, opcode, tokens, tokensCount);
|
parseSingleTransfer(instr, opcode, tokens, tokensCount);
|
||||||
calcluateAddressFormat(instr, tokens, tokensCount);
|
calculateAddressFormat(instr, tokens, tokensCount);
|
||||||
break;
|
break;
|
||||||
case a64inst_LOADLITERAL:
|
case a64inst_LOADLITERAL:
|
||||||
parseSingleTransfer(instr, opcode, tokens, tokensCount);
|
parseSingleTransfer(instr, opcode, tokens, tokensCount);
|
||||||
@ -183,30 +183,31 @@ 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] == '[');
|
assert(*tokens[2] == '[');
|
||||||
|
|
||||||
int operandCount = 0;
|
int operandCount = 0;
|
||||||
|
char unsplitString[strlen(tokens[2])];
|
||||||
|
strcpy(unsplitString, tokens[2]);
|
||||||
char **operands = tokeniseOperands(tokens[2], &operandCount);
|
char **operands = tokeniseOperands(tokens[2], &operandCount);
|
||||||
|
|
||||||
int baseRegister = getOperandNumber(operands[0]);
|
int baseRegister = getOperandNumber(operands[0]);
|
||||||
|
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.base = baseRegister;
|
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.addressingMode = a64inst_PRE_INDEXED;
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(operands[1]);
|
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)
|
} else if( (isOperandRegister(*operands[0]) == 1)
|
||||||
&& (isOperandRegister(*operands[1]) == 1)){
|
&& (isOperandRegister(*operands[1]) == 1)){
|
||||||
//register
|
//register
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET;
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = getOperandNumber(operands[1]);
|
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 {
|
} else {
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user