diff options
author | Damien George <damien.p.george@gmail.com> | 2014-04-13 00:30:32 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-04-13 00:30:32 +0100 |
commit | 8721087661ea607ea68d45b4e518e53607cadbd3 (patch) | |
tree | 721324e1334330e2c865c2928348f80e4372989f /examples/asmsum.py | |
parent | 82c7b1b1d5c8ce0467bd580a86d20c645cec17df (diff) | |
download | micropython-8721087661ea607ea68d45b4e518e53607cadbd3.tar.gz micropython-8721087661ea607ea68d45b4e518e53607cadbd3.zip |
py: Big improvements to inline assembler.
Improved the Thumb assembler back end. Added many more Thumb
instructions to the inline assembler. Improved parsing of assembler
instructions and arguments. Assembler functions can now be passed the
address of any object that supports the buffer protocol (to get the
address of the buffer). Added an example of how to sum numbers from
an array in assembler.
Diffstat (limited to 'examples/asmsum.py')
-rw-r--r-- | examples/asmsum.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/examples/asmsum.py b/examples/asmsum.py new file mode 100644 index 0000000000..07e71c7384 --- /dev/null +++ b/examples/asmsum.py @@ -0,0 +1,57 @@ +@micropython.asm_thumb +def asm_sum_words(r0, r1): + + # r0 = len + # r1 = ptr + # r2 = sum + # r3 = dummy + mov(r2, 0) + + b(loop_entry) + + label(loop1) + ldr(r3, [r1, 0]) + add(r2, r2, r3) + + add(r1, r1, 4) + sub(r0, r0, 1) + + label(loop_entry) + cmp(r0, 0) + bgt(loop1) + + mov(r0, r2) + +@micropython.asm_thumb +def asm_sum_bytes(r0, r1): + + # r0 = len + # r1 = ptr + # r2 = sum + # r3 = dummy + mov(r2, 0) + + b(loop_entry) + + label(loop1) + ldrb(r3, [r1, 0]) + add(r2, r2, r3) + + add(r1, r1, 1) + sub(r0, r0, 1) + + label(loop_entry) + cmp(r0, 0) + bgt(loop1) + + mov(r0, r2) + +import array + +b = array.array('l', (100, 200, 300, 400)) +n = asm_sum_words(len(b), b) +print(b, n) + +b = array.array('b', (10, 20, 30, 40, 50, 60, 70, 80)) +n = asm_sum_bytes(len(b), b) +print(b, n) |