diff --git a/src/parser.c b/src/parser.c index ba00c26..cbbabd7 100644 --- a/src/parser.c +++ b/src/parser.c @@ -14,6 +14,7 @@ // - count operands and match type/values // - generate final a64inst and return +//calculate offsets from string void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[]){ if(strcmp(operandList[0][strlen(operandList[0])-1], "{") == 0) { //unsigned immediate offset @@ -36,6 +37,14 @@ void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[]){ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *operandList[]){ switch(instr->data.type){ case a64inst_SINGLETRANSFER: + if(strcmp(operandList[0][0], "x")==0){ + //x-register + instr->data.regType = 1; + } else { + instr->data.regType = 0; + } + char *endptr; + instr->processOpData.base = strtol(operandList[0][0]+1, endptr, 2); calcluateAddressFormat(instr, operandList); break; case a64inst_LOADLITERAL: @@ -97,10 +106,11 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ if( *address == '['){ //type is register instr->type = a64inst_SINGLETRANSFER; + instr->data.SingleTransferOpType = a64inst_SINGLE_TRANSFER_SINGLE_DATA_TRANSFER; if(isLoad == 0){ - instr->data.processOpData.singleDataTransferData.transferType = a64inst_LOAD; + instr->data.processOpData.transferType = a64inst_LOAD; } else { - instr->data.processOpData.singleDataTransferData.transferType = a64inst_STORE; + instr->data.processOpData.transferType = a64inst_STORE; } } else { instr->type = a64inst_LOADLITERAL;