Code Heron-Verfahren und 64-Bit Addition

tom1805
Hallo zusammen!
Ich muss nächste Woche ein Übungsblatt abgeben, dafür muss ich zwei PRogramme in Assembler schreiben. Leider habe ich keine Ahnung wie!
Ich dachte vielleicht hat jemand hier schon mal sowas ähnliches gemacht und kann mir mit Code aushelfen. Das wäre wirklich super, alleine krieg ich das nie hin. Zumindest Tipps wären nicht schlecht, und das möglichst schnell!
Hier die aufgaben:

1. Implementieren Sie das Heron-Verfahren zur Bestimmung einer rationalen Näherung der Quadratwurzel einer Zahl in Assembler und beachten Sie, dass die Näherung auf mindestens 10 Stellen genau ist.

2. Entwickeln Sie eine Assembler Funktion, die zwei 64 Bit Worte mit Hilfe eines RCA’s addiert.

Hoffentlich kann mir jemand helfen! Ich denke für Cracks ist das ein Klacks. Schon mal danke im vorraus!

Gruß, Tom
chaoscode
hi.
also, bei deinem heron verfahren aknn ich dir nur wiki empfehlen.
villeicht wirst du selber daraus schlau.
ich hab nämlich keine ahnung von floatingpoint assembler.

des weiteren wäre es hilfreich, wenn man wüsste, was ein RCA ist.
und welche rechnerarchitektur?
ich gehe einfach mal davon aus, dass X86 gemeint ist.
in meinem code gibt es zwar kein RCA, aber ein carry.
evtl hilft es dir.

eax:ebx -> 1 64 bit zahl
ecx:edx-> 2. 64 bit zahl

am ende:
eax:ebx -> ergebnis

start:
add eax,ecx
adc ebx,edx
ende:

edit[24.7 17:53]:
ok.
ich habe das verfahren in c geschrieben.
ich werde den asm output mal anschauen, und dir das ganze schiken.

mfg Dennis

noch ma ein edit:
ich hab den source.
das ganze ist in c geschrieben, aber ich hab den asm source (für x86)
das ganze arbeitet mit floatingpoint unit, und ist nicht im intel, sondern im at&t syntax...
den versteh ich nur schlecht.
(von Idioten für Idioten :devilsmile

aber die funktion heist heron.
es gibt eine main und eine heron.
ich hab gerade keine zeit, aber evtl mach ich noch ne übersetzung(in intel syntax) und von hand optimierung... (obwohl es da nicht viel zum optimieren gibt.)

.file "c:\dennis\projekts\c\test1\main.c"
_$M0:
.file "c:\dennis\projekts\c\test1\main.c"
.text
.text
; 1 double heron(double);
; 2 double main(double a)
.type _main,function
_main:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
pushl %edi
; 3 {
.line 3
; 4 double result;
; 5 int i =9;
.line 5
movl $9,-12(%ebp)
; 6 result = heron((double) i);
.line 6
movl -12(%ebp),%edi
pushl $0
pushl %edi
fildl (%esp)
fstpl (%esp)
call _heron
addl $8,%esp
fstpl -24(%ebp)
fldl -24(%ebp)
fstpl -8(%ebp)
; 7
; 8 return result;
.line 8
fldl -8(%ebp)
_$1:
; 9 }
.line 9
popl %edi
leave
ret
_$3:
.size _main,_$3-_main
.globl _main
; 10
; 11
; 12 double heron(double a)
.type _heron,function
_heron:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
; 13 {
.line 13
; 14 int step;
; 15 double xn = 1;
.line 15
fld1
fstpl -8(%ebp)
; 16 for(step = 0;step < 10;step++)
.line 16
movl $0,-12(%ebp)
_$5:
; 17 {
; 18 xn = (xn+(a/xn))/2;
.line 18
fldl -8(%ebp)
fstpl -24(%ebp)
fldl 8(%ebp)
fdivl -24(%ebp)
faddl -24(%ebp)
fdivl _$9
fstpl -8(%ebp)
_$6:
.line 16
incl -12(%ebp)
cmpl $10,-12(%ebp)
jl _$5
; 19 }
; 20 return xn;
.line 20
fldl -8(%ebp)
_$4:
; 21 }
.line 21
leave
ret
_$11:
.size _heron,_$11-_heron
.globl _heron
.data
.align 4
_$9:
; double 2
.long 0x0,0x40000000



mfg Dennis
den c source:


double main(double a)
{
double result;
int i =9; // eine versuchszahl
result = heron((double) i);

return result;
}


double heron(double a)
{
int step;
double xn = 1;
for(step = 0;step < 10;step++)
{
xn = (xn+(a/xn))/2;
}
return xn;
}

ps:
hab das auch mit 16 ausprobiert...
es geht!