Forum: Compiler & IDEs lo8 hi8 verschachteln


von Fallobst (Gast)


Lesenswert?

Hi

Ich schaffe es nicht mein eigenes Programm für avrgas zu übersetzen. 
Kann mir jemand diese Assembler-Zeile übersetzen?
1
sbci ZH, LOW(VRAM_TILES_H+HIGH(-(Scroll2_loop_table)))

Meine Ideeen bisher:
1
sbci ZH, lo8(VRAM_TILES_H+hi8(-(Scroll2_loop_table)))     //hi8 lo8 verschachtelt geht wohl nicht
2
sbci ZH, lo8((VRAM_TILES_H)-(Scroll2_loop_table/256))     // Division kennt er auch nicht

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Was soll's denn werden?

Du kannst nicht beliebig komplizierte Ausdrücke mit lo8, hi8 etc bilden, 
weil es auch entsprechende RELOCs dafür geben muss.

von Fallobst (Gast)


Lesenswert?

Ich möchte zu dem Z-Pointer ein Offsets addieren. Bei ZH zusätzlich eine 
Konstante abziehen. Mit 2 Befehlen wäre es natürlich machbar. 
Andererseits müsste das doch irgendwie gehen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ich versteh immer noch nicht was das werden soll. Im lo-Teil wird ein 
hi-Teil subtrahiert? Und das wird vom hi-Teil der Adresse subtrahiert?

Konfus...

von Fallobst (Gast)


Lesenswert?

1
sbci ZH, hi8(((VRAM_TILES_H)*256)-(Scroll2_loop_table))

Das hier kann er schon vollständig parsen, allerdings ist der Ausdruck 
immer noch zu komplex.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Dar rumwirbeln mit diesen Ausdrücken bringt doch nix.

Becshreib mal was du machen willst und was die Objecte sind.

Oder schreib's in C auf wenns C kannst.

von Fallobst (Gast)


Lesenswert?

Das was ich in Assembler gemacht habe ist eine einfache 
Flash-Optimierung.

Der Z-Pointer soll auf eine Tabelle zeigen. Dazu muss ein 8bit Offset 
addiert werden.

Einfachste Möglichkeit:
1
ldi ZL, lo8(table)
2
ldi ZH, hi8(table)
3
add ZL, lo8(offset)
4
adc ZH, hi8(offset)

Wenn man jetzt jedoch einer der beiden Schritte in einem Befehl (movw) 
machen kann spart man ein Befehl. Das geht in meinem Fall, obwohl es nur 
ein 8bit Offset ist. Das Register darüber enthält nämlich einen 
konstanten Wert. Dieser muss dann aber wieder abgezogen werden.
1
ldi r21, VRAM_TILES_H
2
[...]
3
movw ZL, r20  //r20 = offset register
4
subi ZL, lo8(-(table))
5
sbci ZH, hi8(((VRAM_TILES_H)*256)-(Scroll2_loop_table))  //Um die Zeile geht es

Ich hoffe du kannst damit etwas anfangen. Das wäre in C schwer 
darzustellen gewesen.

Hier geht es zwar nur um ein Word, allerdings stört es mich, dass es 
nicht möglich scheint einen halbkomplexen Ausdruck mit avrgas zu 
verwenden.

von amateur (Gast)


Lesenswert?

@Johann
Für mich sieht das stark nach Assembler aus und nicht nach "C".

Auch wenn ich keine Ahnung habe was "Fallobst" bezweckt.

@Fallobst
Um den Nebel zu lüften: Sende doch mal die Referenzen im Code.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mit ist schon klar daß es um Assembler geht.  Es ging nur um eine 
Formulierung in C.

Warum lädst du r21 mit VRAM_TILES_H wenn es später wieder abgezogen 
werden soll?

Ergo: Einfach den hi-Teil von offset wie 0 behandeln:
1
__zero_reg__ = 1
2
3
#define ZL 30
4
#define ZH 31
5
6
.section .progmem.data,"a",@progbits
7
8
.type table, @object
9
table:
10
    .byte 1, 2, 3, 4
11
12
.text
13
14
f1:
15
    mov ZL, r20
16
    clr ZH
17
    subi    ZL, lo8(-(table))
18
    sbci    ZH, hi8(-(table))
19
    
20
f2:
21
    ldi     ZL, lo8 (table)
22
    ldi     ZH, hi8 (table)
23
    add     ZL, r20
24
    adc     ZH, __zero_reg__

Bei f2 braucht man ein Register das 0 enthält wie zB R1 gemäß avr-gcc 
ABI.

von Fallobst (Gast)


Lesenswert?

Das man das so machen kann ist mir klar. In meiner ursprünglichen 
Implementierung habe ich jedoch durch den movw Befehl ein Word Flash 
gespart. Wenn ich keine Möglichkeit finde, werde ich ein Befehl 
hinzufügen müssen.

von Fallobst (Gast)


Lesenswert?

Johann L. schrieb:
> Warum lädst du r21 mit VRAM_TILES_H wenn es später wieder abgezogen
> werden soll?

Das wird worher im Programm geladen, weil es für eine Multiplikation 
gebraucht wird.

von Fallobst (Gast)


Lesenswert?

1
sbci ZH, lo8(-(Scroll2_loop_table-VRAM_TILES_H*256))
Das funktioniert. Aber eigentlich bin ich von den Fähigkeitend des 
avrgas entäuscht.

von Fallobst (Gast)


Lesenswert?

Es muss natürlich hi8 heißen:
1
sbci ZH, lo8(-(Scroll2_loop_table-VRAM_TILES_H*256))

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Na dann nimm einen anderen Assembler wenn avr-as nicht genug bietet.

von Oliver (Gast)


Lesenswert?

Fallobst schrieb:
> In meiner ursprünglichen
> Implementierung habe ich jedoch durch den movw Befehl ein Word Flash
> gespart.

Dazu fällt mir nur das hier ein:

>"Assembler ist eine Methode, Programme die zu langsam laufen so
>umzuschreiben, dass sie überhaupt nicht mehr laufen" ;-)

(Eclipse, C, Laufzeitanalyse
Kurzanleitung von Boris Budweg)

In diesem Sinne...

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.