asmsum.py 828 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. @micropython.asm_thumb
  2. def asm_sum_words(r0, r1):
  3. # r0 = len
  4. # r1 = ptr
  5. # r2 = sum
  6. # r3 = dummy
  7. mov(r2, 0)
  8. b(loop_entry)
  9. label(loop1)
  10. ldr(r3, [r1, 0])
  11. add(r2, r2, r3)
  12. add(r1, r1, 4)
  13. sub(r0, r0, 1)
  14. label(loop_entry)
  15. cmp(r0, 0)
  16. bgt(loop1)
  17. mov(r0, r2)
  18. @micropython.asm_thumb
  19. def asm_sum_bytes(r0, r1):
  20. # r0 = len
  21. # r1 = ptr
  22. # r2 = sum
  23. # r3 = dummy
  24. mov(r2, 0)
  25. b(loop_entry)
  26. label(loop1)
  27. ldrb(r3, [r1, 0])
  28. add(r2, r2, r3)
  29. add(r1, r1, 1)
  30. sub(r0, r0, 1)
  31. label(loop_entry)
  32. cmp(r0, 0)
  33. bgt(loop1)
  34. mov(r0, r2)
  35. import array
  36. b = array.array('l', (100, 200, 300, 400))
  37. n = asm_sum_words(len(b), b)
  38. print(b, n)
  39. b = array.array('b', (10, 20, 30, 40, 50, 60, 70, 80))
  40. n = asm_sum_bytes(len(b), b)
  41. print(b, n)