From ee01f1a7f1e10be78bcceb4f0f42aa352a6a588f Mon Sep 17 00:00:00 2001 From: Jacques Comeaux Date: Sat, 24 Aug 2024 01:14:04 -0500 Subject: Add parsers for basic instruction types --- newasm/regregreg.s | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 newasm/regregreg.s (limited to 'newasm/regregreg.s') diff --git a/newasm/regregreg.s b/newasm/regregreg.s new file mode 100644 index 0000000..a8be6ee --- /dev/null +++ b/newasm/regregreg.s @@ -0,0 +1,44 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.type regregreg, %function +.global regregreg + +// R1 instruction under construction +// R2 output buffer +// R4 input buffer + +regregreg:PUSH {LR} + + // TODO loop it + BL register // parse a register + BNE exit // exit if failure + CMP R2, 7 // check that it's R0-R7 + BHI bad_reg + ORRS R1, R2 // fill in Rd + + BL whitespace // mandatory whitespace + BNE exit // exit if failure + + BL register // parse a register + BNE exit + CMP R2, 7 // check that it's R0-R7 + BHI bad_reg + LSLS R2, 3 // shift by 3 + ORRS R1, R2 // fill in Rn + + BL whitespace // mandatory whitespace + BNE exit // exit if failure + + BL register // parse a register + BNE exit + CMP R2, 7 // check that it's R0-R7 + BHI bad_reg + LSLS R2, 6 // shift by 6 + ORRS R1, R2 // fill in Rm + + MOVS R0, 0 // return code 0 (success) +exit: POP {PC} +bad_reg: MOVS R0, 8 // return code 8 (invalid register for this register position) + POP {PC} -- cgit v1.2.3