fix ldr parsing

This commit is contained in:
EDiasAlberto 2024-06-14 20:45:07 +01:00
parent 19b98a3c51
commit 3838227a09
2 changed files with 7 additions and 5 deletions

View File

@ -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:

View File

@ -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;