| |
|
|
p.specht
| Das folgende Prog für X4-ASM erstellt das Spatprodukt zweier Vektoren bis zur Dimension 500 x 500. Es handelt sich um eine Demonstration ohne jedwede Gewähr!
Formel: c_i,j = a_i X (b_j)'
WindowTitle "Spatprodukt zweier Randwert-Vektoren auf eine Matrix, mit X4-ASM"
WindowStyle 24:Cls:set("AsmMode",0)
'--------------------------
Var Asize& = 20
Var Bsize& = 4' ... Beispiele
'{--------------------------
print "\n Spatprodukt zweier Randwert-Vektoren | . __ mit den Dimensionen ";
print format$("#,##0",Asize&);" und ";format$("#,##0",Bsize&)
declare i&,j&,err&,tmp&,tm&
tmp&=&gettickcount
declare a![Asize&-1],b![Bsize&-1],c![Asize&-1,Bsize&-1]
tmp&=&gettickcount-tmp&
Print "\n Vektoren und Spat deklariert in ";tmp&;" ms."
'}
'{
print "\n Werte zugewiesen in ... ";:Randomize
tmp&=&gettickcount
a![]=&index+1' rnd() ' 2e10
b![]=10*&index'rnd(100) ' rnd() ' -1.1e10
tmp&=&gettickcount-tmp&
print tmp&; " ms."
'}
'{asmSPATPRODfloat
ASM "aSPATPRODf",5'addr(a![0]),sizeof(a![]),addr(b![0]),sizeof(b![]),addr(c![0,0])
'Irrtümer abfangen
mov edi,par2:cmp edi,501:jge err1
mov edi,par4:cmp edi,501:jge err1
'Init
mov eax,par1'vec->a_ram
mov ebx,par3'vec->b_ram
mov ecx,par5'vec->c_ram
mov edx,0'i->a
mov esi,0'j->b
FINIT
MAINLOOP:
FLD qword ptr [eax]
FLD qword ptr [ebx]
FMUL
FSTP qword ptr [ecx]
'nextrow:
inc edx
cmp edx,par2'if row = size_a
je prepnextcol
add eax,8
add ecx,8
jmp MAINLOOP
prepnextcol:
inc esi'nextcol
cmp esi,par4'if col=size_b
je noerr'then ende
mov edx,0
mov eax,par1'else resetvec_a
add ebx,8'next vec_b
add ecx,8'incr vec_c
jmp MAINLOOP
'Fehlertabelle
err1:
mov eax,$FFFFFFFF
jmp fertig
noerr:
mov eax,0
fertig:
ENDASM
tm&=&gettickcount
err&=aSPATPRODf( addr(a![0]),sizeof(a![]), addr(b![0]),sizeof(b![]), addr(c![0,0]) )
tm&=&gettickcount-tm&
'}
'{ Ausgabeteil
if err&
font 2:print "\n *** Error ";err&;": Vektor zu groß! ***":font 0
else
set("decimals",14):set("numwidth",18)
font 2:print "\n\n Ergebnis errechnet in ";tm&;" ms."
waitinput 5000
print "\n Spatmatrix:\n":font 0
whileloop 0,Asize&-1:i&=&Loop
whileloop 0,Bsize&-1:j&=&Loop
print c![i&,j&],
endwhile:print
endwhile:print "\n---":beep
endif
waitinput
end
'}
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 26.05.2021 ▲ |
|
|
|