
Zur Addressarithmetik:

Wenn der Assembler relocatable code erzeugt ist es natuerlich
einigermassen umoeglich Addressen zu multipliziern und dividieren.
Subtrathieren kann man sie solange die relativen schon definiert
sind. relativ - relativ = absolute

Instruktionen wie

MOV R0, #Addresse / 256

wo Addresse eine relocatale address ist, koennen nicht erzeugt werden,
da der Wert von Address beim Assemblieren unbekannt ist.

Das man doch so einiges machen kann, zeigt folgendes Beispiel:


	.PROC	test

	.ENTRY	start


	.MACRO	LOAD
\load 
	.IF	\load - %2 > 4084.
        MOV	%1,     #((\load - %2 + 8 + 8) / 100) << 8
	ADD	%1, %1, #((\load - %2 + 8 + 8) & 0FF)
	SUB	%1, PC, %1
        LDR	%1, [%1]
	.ELSE
	LDR	%1, %2
	.ENDC
	.ENDM


textaddress:
	.WORD	text
text:
	.STRING	"This is a far away string."
	.ALIGN
	.BLOCK	2000

start:
	LOAD	R0, textaddress
	SWI	OS_Write0
	SWI	OS_NewLine
	SWI	OS_Exit

	.END


Dies ist sogar relocatable code, man kann ihn linken.



