
Zitat von
robotxy
So! Ich habe jetzt mal mit Stopuhr gestoppt(AVR Resetet und gleichzeitig Uhr gestartet)
Für 10 Millionen Multiplikationen hat er 41,31 Sekunden gebraucht.
Dieser Assemblerschnippsel benötigtmit halbwegs realistischen Bedingungen ca: 9,4 sek (so um die 150 Mio Takte).
Anzeige wenn fertig mittels LED an PIN PD0
Halbwegs realistisch heisst:
Ich hole mir die 2 Faktoren aus dem Speicher und das 16 Bit ergebniss wandert auch dort hin.
Das Halbwegs kommt übrigens daher, das 10 Mio Multiplikationen doch schon leicht übertrieben sind. Denn:
1. alleine für die Faktoren würde man so ca: 19 MB Ram benötigen.
2. nur für die Ergebnisse ebenfalls.
Also, wenn man mit dem Mega mal ebend 38 MB externen RAM angesteuert bekommt ist das sicherlich kein Problem.
Code:
;
; Definitionsfile
.include "m32def.inc"
;
; Registeraliase
.def temp = r16
.def fak1 = r17
.def fak2 = r18
.def count1 = r20
.def count2 = r21
.def count3 = r22
.cseg
.org 0x00
;
; ISR Vektoren
jmp isr_reset ; Reset
.org 0x2A
;
; HW Initialisierung
isr_reset:
ldi temp, high(RAMEND) ; Stackpointer
out SPH, temp
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, 0xFF ; alle ungenutzten Ports -> Eingang + Pullup
out PORTA, temp
out PORTB, temp
out PORTC, temp
out PORTD, temp
ldi temp, 1 ; Pin D0 -> Ausgang +H
out DDRD, temp
;
; Definierte Werte schaffen
ldi ZH, high(SRAM_START)
ldi ZL, low(SRAM_START)
ldi temp, 2
st Z, temp
ldi temp, 5
std Z+1, temp
; Main Loop
loop_init:
ldi count3, 0x98
ldi count2, 0x96
ldi count1, 0x7F
loop:
ld fak1, Z
ldd fak2, Z+1
mul fak1, fak2
std Z+2, r0
std Z+3, r1
subi count1, 1
sbci count2, 0
sbci count3, 0
brne loop
cbi PORTD, 0
break
jmp loop_init
Grüße,
da Hanni.
Lesezeichen