Šta je novo?

zadatak iz asemblera

rasprodaja

Slavan
Učlanjen(a)
03.08.2005
Poruke
5
Poena
301
Ima li neko voljan da mi napise program u asembleru?

Zadatak je jednostavan za ljude koji razumeju i znaju asembler, ali ja ga bas ne kontam, pa zato pitam, mozda ima neko ko zna ... Problem je sledeci:

Napisati program koji ima rekurzivnu proceduru za izracunavanje x^n koja koristi uzastopno kvadratiranje. Brojevi se ucitavaju sa osnovom 2, a rezultat se ispisuje u osnovi 18.

pozdrav
 
Poslednja izmena:
evo ovako..
trebalo bi da ima glavnu proceduru start

start: call input2 ; procedura koja ti u eax vraca broj koji se unosi
push eax ; cuvanje n-a na steku
call input2
push eax ; cuvanje x-a na steku
call calc_xn ; pozivanje procedure koja racuna x^n
; rezultat racunanja vraca u akumulator
call display18 ; procedura koja ispisuje eax u sistemu 18
mov ah,4ch
int 21h ; dosova rutina za terminate programa
; kraj glavnog programa

calc_xn: push ebp
mov ebp , esp ; standardan prolog moze i samo instrukcija enter
push edx
mov ecx , [ebp + 12] ; uzimanje parametra n sa steka
or ecx , ecx ; priprema testiranja na nulu
cmove eax , 1 ; ako je nula onda se u eax stavlja jedan
je end_calc_xn ; skace se na kraj procedure

dec ecx ; umanjujemo ecx (n) za 1
mov edx , [ebp+8]; smestamo x u edx
push ecx ; saljemo parametar n
push edx ; saljemo x na stek

call calc_xn ; rekurzivno pozivanje rezultat u eax
mul edx ; mnozimo eax sa edx -> edx:eax.
; ( rez = rez * calc_xn(a,n-1) )
; pretpostavljamo da je edx 0

end_calc_xn :
pop edx
pop ebp
ret 8 ; restauracija steka zbog prosledjenih
;parametara

e sad ovo gore mozda radi a mozda i ne radi... posto nemam komp ne mogu da ti kazem sa sigurnoscu ali nesto slicno onome gore bi trebalo da se uradi..
e sad procedure input2 i display18 ne mogu da ti uradim ali mogu da ti kazem kako bi trebalo...
trebadi dosov prekid za uzimanje karaktera sa tastature.. moze i biosov mislim da je kod tipa
mov ax , 0
int 16h i rezultat je u dl ili tako nesto.. ( zaboravio sam)...
u sustini uzmes ascii kod sa tastature, oduzmes mu 48 i dobijes broj 0-9 ( ako je legalno uneto)...
pre toga si odredio registar za rezultat...
sada skukcesivno citas broj (0 ili 1) dodajes ga na rezultat i rezultat shiftujes za 1 mesto uklevo sa shl ecx , 1 ( ako je ecx odabran)...

ispisivanje radis tako sto sukcesivno delis eax ( gde je rezultat racunanja ) sa 18 , ostatak stavljas na stek i pamtis broj cifara a onda u jednoj petlji (koliko ima cifara ) skidas sa steka i prenosis proceduri koja treba da ispise cifru u osnovi 18... znaci 0-9 , a,b,c,d,e,f,g,h ili sl..

p.s.
ovo sto sam napisao gore u opste nije efikasno... u sustini parametar x se ne menja tako da bi procedure trebalo da se prenosi samo n a x da se cuva kao globalna promenljiva ali ovako bi dobio da ga kompajliras u c-u...

nisam puno pomogao ali mozda iskoristis nesto od ovog...
pozdrav
 
Poslednja izmena:
Vrh Dno