summaryrefslogtreecommitdiff
path: root/module/language/assembly.scm
diff options
context:
space:
mode:
Diffstat (limited to 'module/language/assembly.scm')
-rw-r--r--module/language/assembly.scm17
1 files changed, 17 insertions, 0 deletions
diff --git a/module/language/assembly.scm b/module/language/assembly.scm
index 734deb580..fbe3a7153 100644
--- a/module/language/assembly.scm
+++ b/module/language/assembly.scm
@@ -22,7 +22,9 @@
(define-module (language assembly)
#:use-module (system base pmatch)
#:use-module (system vm instruction)
+ #:use-module ((srfi srfi-1) #:select (fold))
#:export (byte-length
+ addr+ align-program
assembly-pack assembly-unpack
object->assembly assembly->object))
@@ -54,6 +56,21 @@
(+ 1 (instruction-length inst)))
(else (error "unknown instruction" assembly))))
+
+(define *program-alignment* 8)
+
+(define (addr+ addr code)
+ (fold (lambda (x len) (+ (byte-length x) len))
+ addr
+ code))
+
+(define (align-program prog addr)
+ `(,@(make-list (modulo (- *program-alignment*
+ (modulo addr *program-alignment*))
+ *program-alignment*)
+ '(nop))
+ ,prog))
+
;;;
;;; Code compress/decompression
;;;