summaryrefslogtreecommitdiffstatshomepage
path: root/examples/asmsum.py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-04-13 00:30:32 +0100
committerDamien George <damien.p.george@gmail.com>2014-04-13 00:30:32 +0100
commit8721087661ea607ea68d45b4e518e53607cadbd3 (patch)
tree721324e1334330e2c865c2928348f80e4372989f /examples/asmsum.py
parent82c7b1b1d5c8ce0467bd580a86d20c645cec17df (diff)
downloadmicropython-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.py57
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)