Forum: Mikrocontroller und Digitale Elektronik ELM-CHAN, ASM-Wurzel, Fragen zur Nutzung


von Wurzelchen (Gast)


Lesenswert?

Hallo zusammen,

ELM-CHAN (http://elm-chan.org/docs/avrlib/sqrt32.S) hat eine AVR-ASM 
Routine zur Wurzel-Berechnung auf seiner Site.
Diese ist vorgesehen zum Einbau in AVR-GCC Projekte.

Ich möche die Routine jedoch in einem reinen ASM-Projekt nutzen und bin 
leider
nicht der Gcc-Notation/Var-Übergabe vertraut.

Könnt Ihr mir hierbei helfen, das wäre nett:

1) In welche Register lege ich denn nun den Eingangswert (uint32_t n)?
2) Und wo liegt am Ende das Ergebnis?
3) Was bedeuten die "seltsamen" Sprungmarken 2f/3f/1b, der Assembler 
würde darüber ja stolpern.
1
;----------------------------------:
2
; 32bit integer squareroot
3
;----------------------------------;
4
;   uint16_t isqrt32 (uint32_t n);
5
;
6
; Return Value:
7
;   Squareroot of n.
8
;
9
; Size  = 53 words
10
; Clock = 532..548 cycles
11
; Stack = 0 byte
12
13
.global isqrt32
14
.func isqrt32
15
16
isqrt32:
17
        clr     r0
18
        clr     r18
19
        clr     r19
20
        clr     r20
21
        ldi     r21, 1
22
        clr     r27
23
        clr     r30
24
        clr     r31
25
        ldi     r26, 16
26
1:      lsl     r22
27
        rol     r23
28
        rol     r24
29
        rol     r25
30
        rol     r0
31
        rol     r18
32
        rol     r19
33
        rol     r20
34
        lsl     r22
35
        rol     r23
36
        rol     r24
37
        rol     r25
38
        rol     r0
39
        rol     r18
40
        rol     r19
41
        rol     r20
42
        brpl    2f          ???????
43
        add     r0, r21
44
        adc     r18, r27
45
        adc     r19, r30
46
        adc     r20, r31
47
        rjmp    3f          ???????
48
2:      sub     r0, r21
49
        sbc     r18, r27
50
        sbc     r19, r30
51
        sbc     r20, r31
52
3:      lsl     r21
53
        rol     r27
54
        rol     r30
55
        andi    r21, 0b11111000
56
        ori     r21, 0b00000101
57
        sbrc    r20, 7
58
        subi    r21, 2
59
        dec     r26
60
        brne    1b         ???????
61
        lsr     r30
62
        ror     r27
63
        ror     r21
64
        lsr     r30
65
        ror     r27
66
        ror     r21
67
        mov     r24, r21
68
        mov     r25, r27
69
        ret
70
.endfunc

von Alberto (Gast)


Lesenswert?

avr-gcc Registerverwendung ist hier erklärt: 
https://gcc.gnu.org/wiki/avr-gcc#Register_Layout

Wenn du die Funktion so anpasst, dass die calling convention eingehalten 
wird und du keine call-saved Register veränderst, dann kannst du die 
Funktion einfach aus C heraus aufrufen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Hier ist (fast) der gleiche Code mit universellen Registernamen. Da
steht auch die Funktion der einzelnen Register mit dabei:

  http://elm-chan.org/docs/avrlib/sqrt32.txt

von Mario M. (thelonging)


Lesenswert?

Wurzelchen schrieb:
> Was bedeuten die "seltsamen" Sprungmarken 2f/3f/1b

Das sind lokale Labels und f/b ist die Richtung (forward/backward).
https://ftp.gnu.org/old-gnu/Manuals/gas-2.9.1/html_chapter/as_5.html

von S. Landolt (Gast)


Lesenswert?

an Wurzelchen:
Falls Interesse besteht: ich hatte mal aus dem Internet (weiß nicht mehr 
woher genau) eine Routine nach Ruud van Gessel kopiert und für mich 
angepasst; benötigt ca. 300 Takte. Könnte ich ausgraben und hier 
vorstellen.

von Wurzelchen (Gast)


Lesenswert?

S. Landolt schrieb:
> Könnte ich ausgraben und hier vorstellen.

Natürlich gerne!
Auf jeden Fall schonmal vielen Dank für alle Antworten,
das hilft mir weiter!

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Sollte selbsterklärend sein (die Anwendung, nicht der Inhalt), sonst 
eben nachfragen.

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:

> Falls Interesse besteht: ich hatte mal aus dem Internet (weiß nicht mehr
> woher genau) eine Routine nach Ruud van Gessel kopiert

Ja, das Internet ist doch ein wenig vergesslich. Ich habe mich auch 
schonmal bei Ruuds Code als Ausgangspunkt einer eigenen Entwicklung 
bedient. Aber die Quelle dafür, die ich damals verwendet hatte, 
existiert heute nicht mehr.

Möglicherweise ist sie noch über irgendwelche Internet-Archive 
verfügbar, deswegen poste ich trotz der definitiven Nichtverfügbarkeit 
noch mal den Link, den ich damals verwendet hatte:

http://members.chello.nl/j.beentjes3/Ruud/sqrt32avr.htm

Übrigens ist genau diese Routine (bzw. deren Umsetzung in der runtime 
des avr-gcc) eine SEHR schönes Beispiel dafür, wie suboptimal Compiler 
sein können (bzw. sein müssen)...

von noreply@noreply.com (Gast)


Lesenswert?


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.