diff --git a/src/encode.c b/src/encode.c index 13fdf17..46b84c2 100644 --- a/src/encode.c +++ b/src/encode.c @@ -175,13 +175,15 @@ word encodeSingleDataTransfer(a64inst_instruction inst) { return wrd; } -word encodeLoadLiteral(a64inst_instruction cI) { +word encodeLoadLiteral(a64inst_instruction cI, int arrIndex, symbol_table *st) { word wrd = 0; a64inst_SingleTransferData data = cI.data.SingleTransferData; setBits(&wrd, 24, 32, 0x18); setBits(&wrd, 30, 31, data.regType); - setBits(&wrd, 5, 24, data.processOpData.loadLiteralData.offset); + char *label = data.processOpData.loadLiteralData.label; + int offset = getLabelOffset(st, label, arrIndex, 19); + setBits(&wrd, 5, 24, offset); setBits(&wrd, 0, 5, data.target); return wrd; @@ -206,7 +208,7 @@ word *encode(a64inst_instruction insts[], int instCount, symbol_table* st) { index++; break; case a64inst_LOADLITERAL: - arr[index] = encodeLoadLiteral(inst); + arr[index] = encodeLoadLiteral(inst, index, st); index++; break; case a64inst_DIRECTIVE: diff --git a/src/parser.c b/src/parser.c index 08d85fc..4cb939c 100644 --- a/src/parser.c +++ b/src/parser.c @@ -275,7 +275,7 @@ void calculateAddressFormat(a64inst_instruction *instr, char *tokens[], int tok 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] == ']') { + } else if(unsplitString[strlen(unsplitString)-1] == ']' && operandCount == 2) { // POST_INDEXED instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED; instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(tokens[3]); @@ -311,7 +311,7 @@ void parseSingleTransfer(a64inst_instruction *instr, char *opcode, char *tokens[ int offset = getOperandNumber(tokens[1]); instr->data.SingleTransferData.processOpData.loadLiteralData.offset = offset; } else { - instr->data.SingleTransferData.processOpData.loadLiteralData.label = tokens[1]; + instr->data.SingleTransferData.processOpData.loadLiteralData.label = tokens[2]; //offset is literal, use symbol table and calculate difference } break;