lo8 hi8 verschachteln

Gast #3069950
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
Gast #3070064
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.
Gast #3070065
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.
Persönliche Seite #3070106
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.
Gast #3070119
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.
Gast #3070427
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

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