MSP430 ASM Datenstrukturen

OP #1346825
Lesenswert?

Meister Eder schrieb:
> leider habe ich weder IAR noch MSP430 bisher eingesetzt. Aber die
> wiederholte Nutzung von ORG auf derselben Adresse kann kein mir
> bekannter Assembler durchgehen lassen.

Zu seeligen 8080-Zeiten haben wir das immer so gemacht...

> Gibt es kein .equ, .equiv oder sowas, womit du Adressen neu benamen
> kannst?

Doch, das gibts, aber das ist doch ein Murx.
OP #1346842
Lesenswert?

Wenn dus mit EQU machst, must du die Offsets der Labels absolut angeben.

Wenn man jetzt aus irgendwelchen Gründen die Reihenfolge ändern muß, 
dann stimmt nichts mehr und man muß die Offsets neu ausrechnen.

Wenn man es mit ORG machen könnte, dann müßte man nur die betreffende(n) 
Zeile(n) verschieben und den Rest besorgt der ASM.
OP #1346854
Lesenswert?

Mit Macros kann man sich was basteln, was es tut:

1
STRUCT  MACRO  name
2
LEVEL$  SET  0
3
  ENDM
4

5
ALLOC  MACRO  name, length
6
name:  EQU  LEVEL$
7
LEVEL$  SET  LEVEL$+length
8
  ENDM
9

10
PADDING  MACRO  modul
11
  IF LEVEL$ % modul != 0
12
  LEVEL$:  SET  (LEVEL$ + modul) & ~ (modul - 1)
13
  ENDIF
14
  ENDM
15

16
; PLD_Data
17
  STRUCT PLD_Data
18
  ALLOC  PLD_Timer,            2
19
  ALLOC  PLD_State,            2
20
  ALLOC  PLD_RepCount,         1
21
  ALLOC  PLD_DtFlags,          1
22

23
; PLD_Header
24
  STRUCT PLD_Header
25
  ALLOC  PLD_DataPtr,          2
26
  ALLOC  PLD_DescList,         2
27
  ALLOC  PLD_t1SyncThreshold,  2
28
  ALLOC  PLD_Initializer,      2
29
  ALLOC  PLD_Setup,            2
30
  ALLOC  PLD_InterruptMask,    1
31
  PADDING  2
32
  PLD_HeaderLength:  EQU  LEVEL$

Es werden zwei Strukturen PLD_Data und PLD_Header definiert
#1346859
Lesenswert?

Beim MPASM gibt es die Anweisung udata_ovr, die überlappende 
Datenbereiche zulässt. In der IAR Doku hab ich auf die Schnelle nichts 
vergleichbares finden können(zum 1.mal reingeschaut). Dein Beispiel aus 
dem ersten Post sähe dann so aus:
1
same_var udata_ovr 0x80
2
i1   res 1
3
i2   res 1
4

5
same_var udata_ovr 0x80
6
c1   res 1
7
c2   res 1

Gegenüber deinem Makro sieht das doch richtig übersichtlich aus. Klar, 
hilft hier nix - aber du hast ja schon eine Lösung gefunden.

Grüße,
Edson
OP #1347028
Lesenswert?

Das letzte Beispiel für die Anwendung meiner Macros ist aus dem echten 
Leben.

Mein Beispiel vom Eingangsposting würde damit so aussehen:
1
; Struct I
2
       STRUCT I
3
       ALLOC  I1, 1
4
       ALLOC  I2, 1
5

6
; Struct C
7
       STRUCT C
8
       ALLOC  C1, 1
9
       ALLOC  C2, 1

Ist also auch nicht so viel unbersichtlicher, als die Syntax von MPASM.

Wobei der PADDING-Macro wohl besser so aussehen sollte:
1
PADDING  MACRO  modul
2
  IF LEVEL$ % modul != 0
3
  LEVEL$:  SET  (LEVEL$ + modul - 1) & ~ (modul - 1)
4
  ENDIF
5
  ENDM

modul muß eine 2er-Potenz sein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren