|
[ g1l3 @ 28.02.2008. 21:24 ] @
| pozz svima...moj prvi post...ugl..prosle nedelje sam dobio predmet arhitektura racunara..i naravno radi se u asemleru...dobili smo zadatak za domaci...da se napravi program za faktorijel..ali da se mnozenje napravi pomocu sabiranja...ugl algoritam za sabiranje znam..ali nikako da nekako to implemetiram u kod od faktorijela...pa bi molio bilo kakvu pomocu
Code:
.section .data
.section .text
.globl main
main:
movl $1, %eax #i pomocna
movl $1, %ebx #s pomocna
movl $5, %ecx #faktorijel od ovoga broja...i mislim da bi on ujedno morao da sluzi za neko ponavljanje tamo dole..ali nikako da skontam
movl $0, %edx #d pomocna pomocu koju vrsim mnozenje pomocu sabiranja
uslov :
cmpl %ecx, %eax
ja kraj
mnozenje : # mozda je i bespotrebno ovo ali sam bio nemocan
cmpl $0, %ecx
je kraj
add %eax, %edx #dodao sam eax na edx
inc %eax #povecao sam eax za 1
dec %ecx #dekrementovao sam ecx za 1
jmp uslov
kraj : nop
prilocno sam siguran da nesto ne valja u delu mnozenje...ugl nesto ne radi...i treba dodat..al pojma nemam sta..dovde sam stigao..pa ako bi mogla neka pomoc bio bih zahvalan..ugl sintaksa je at&t...hvala svima unapred |
[ L710 @ 06.03.2008. 15:57 ] @
druze ja sam takodje skoro imao domaci iz asm i uradio sam na mnogo komplikovaniji nacin od tvog.
Tvoj program koliko sam ja uspeo da skontam ne radi uopste faktorijal nego dodavanje %eax na rezultat. Znaci ti radis operaciju + umesto operacije *
Code:
#Program racuna faktorijal od datog broja(7)
#Autor: Forbidden (forbidden.isgreat.org)
.section .data
.section .text
.globl main
main:
movl $7,%eax #faktorijal
movl %eax,%ebx #faktorijal i pomocni broj (x-1)
movl $0,%ecx #dodeljivanje vrednosti 0 rezultatu
movl %eax,%edx #faktorijal = pomocna vrednost
pocetak:
movl %ecx,%edx #rezultat = pomocni rezultat
cmpl $0,%eax #ako je faktorijal 0 onda skoci na kraj
jb kraj
cmpl $1,%ebx #ako je pomocni broj faktorijala(x-1) manji od 1 onda skoci na medju_petlju
jbe medju_petlja
addl %eax,%ecx #dodavanje pocetnog broja na rezultat
decl %ebx #umanjivanje ebx za 1
jmp pocetak #opet sve iz pocetka
medjupetlja:
subl $2,%eax #od faktorijala se oduzimaju 2 broja ciji sam rezultat dobio i smestio u %ecx
pred_petlja:
cmpl $0,%eax #ukoliko je faktorijal 0 onda skoci na kraj
jbe kraj
movl %edx,%ecx #davanje vrednosti iz pomocnog rezultata u pravi rezultat
movl %eax,%ebx #davanje vrednosti faktorijalu kao pomocnom broju
decl %eax #umanjenje faktorijala za 1
petlja:
cmpl $1,%ebx #ukoliko je ebx manje ili jednako od 1 onda izvrsi pred_petlju
jbe pred_petlja
addl %ecx,%edx #dodaj rezultat na pomocni rezultat
decl %ebx #umanji pomocni broj
jmp petlja
kraj:
nop
E sad objasnjenje...
Isao sam ovom logikom. Faktorijal od broja 6 je 720, a to znaci da je 6 * 5 * 4 * 3 * 2 * 1 = 720. Napisao sam program koji prvo pomnozi X sa X-1 (u ovom slucaju 6*5) i njihov rezultat zapise u registru %ecx. Nakon toga prebaci tu vrednost u registar %edx i onda mnozi sa taj rezultat sa x-2 i tako ide u krug.
Nadam se da ces ukapirati. Pozdrav
[Ovu poruku je menjao L710 dana 07.03.2008. u 00:43 GMT+1]
[ g1l3 @ 08.03.2008. 10:05 ] @
e napokon da neko odg... ma tako sam i ja nesto kontao..ali nikako nisam uspeo da realizujem to ... thx again ;)
[ jonathan @ 08.03.2008. 11:16 ] @
Joooj... pisao sam to pre 20 i nešto godina za 8-bitni SC61860 (Sharp PC-1245), jer nije imao faktorijel u kalkulatorskim funkcijama, a BASIC mu je bio sporiji od konkurentskog TI-55-II :) Ako nekoga kojim pukim slučajem to zanima, mislim da bih čak i mogao da nađem listing...
p0z, Alek
[ L710 @ 10.03.2008. 23:38 ] @
ma np...znam kako je budjav osecaj kada imas zelju da uradis domaci, a ne znas na koji nacin ;)
pozz
[ EArthquake @ 20.03.2008. 08:55 ] @
evo i moja verzija :) moze jos malo da se smajni ...
Code: #racunanje faktorijela , pocetna vr eax registra
.section .data
.section .text
.globl main
main:
movl $4, %eax #promeniti 4 za drugi faktorijel ...
movl %eax, %ebx
decl %ebx # ebx za 1 manji od eax
fact:
xorl %edx, %edx #postavlja edx na NULL
movl %ebx, %ecx
cmpl $1, %ebx
je kraj
mnozi:
addl %eax, %edx
decl %ebx
cmpl $0, %ebx
jne mnozi
decl %ecx
movl %ecx, %ebx
movl %edx, %eax
jmp fact
kraj: nop
cini mi se da vam je novi domaci ovo isto samo rekurzivno :)
jonathan: pozdrav ...
[ lord_NIKON @ 21.03.2008. 20:11 ] @
Citat: EArthquake: evo i moja verzija :) moze jos malo da se smajni ...
Code: #racunanje faktorijela , pocetna vr eax registra
.section .data
.section .text
.globl main
main:
movl $4, êx #promeniti 4 za drugi faktorijel ...
movl êx, ëx
decl ëx # ebx za 1 manji od eax
fact:
xorl íx, íx #postavlja edx na NULL
movl ëx, ìx
cmpl $1, ëx
je kraj
mnozi:
addl êx, íx
decl ëx
cmpl $0, ëx
jne mnozi
decl ìx
movl ìx, ëx
movl íx, êx
jmp fact
kraj: nop
cini mi se da vam je novi domaci ovo isto samo rekurzivno :)
jonathan: pozdrav ...
naravno sve to u dvostrukoj preciznosti :)
[ FooLControL @ 25.04.2008. 13:49 ] @
Da ne otvaram novu temu...Postavicu jedan program koji isto racuna faktorijel samo pomocu rekurzije.Ne kontam bas kako on radi.malo me buni kako izgleda stek tokom izvrsavanja potprograma posto potprogram poziva samog sebe.
Code:
.section .data
a: .long 4
.section .text
.globl main
faktorijel:
push %ebp
movl %esp,%ebp
movl 8(%ebp),%ebx
andl %ebx,%ebx
jz fakt_nula
push %ebx
decl %ebx
push %ebx
call faktorijel
add $4,%esp
pop %ebx
mull %ebx
jmp fakt_kraj
fakt_nula:
movl $1,%eax
fakt_kraj:
movl %ebp,%esp
pop %ebp
ret
main:
push a
call faktorijel
addl $4,%esp
kraj:
nop
Hvala unapred za bilo kakvu pomoc?
[ EArthquake @ 26.04.2008. 15:08 ] @
pa vrlo je jednostavno
pri svakom pozivu potrpograma stvara se novi frejm
Code: push %ebp
movl %esp,%ebp
movl 8(%ebp),%ebx
i uzima se vrednost sa steka , smesta u ebx i radi posao dok ne doddje do nule ...
stek izgleda potpuno isto kao kad bi pozvao mnogo pouta zaredom potprogram
rekurzije su mocna stvar , ali ponekad , za razliku od iterativnih verzija algoritama, umeju da budu nerazumljive
[ FooLControL @ 27.04.2008. 13:22 ] @
Hvala na pomoci,dosta je pomogla...A da ne znas mozda kako kada kompajliram program pa kad ga pokrenem u ddd da mogu da pratim i rad potprograma.Mislim da vidim kako rade reg,stek itd u potprogramu.Da ne bude samo ono u main programu push a,call potprogram i odmah izbaci rez...Nadam se da si skontao sta sam hteo da pitam?
[ EArthquake @ 27.04.2008. 18:17 ] @
mislim da znam sta te muci , probaj da singlestepujes program
nisam trenutno priu svom racurau da bih video tacno ali mislim da je u ddd to dugme stepi
posto kad kazes next ili step on ide liniju po liniju a kada naidje na potprogram , kroz njega prodje i ne vrati ti kontrolu dok se ne vrati iz potprograma
ono sto sigurno radi jeste da u onom cmd prozoru ukucavas stepi dok ne dodjes do potprograma
a mozes i da stavis breakpoint na pocetak potprograma pa ce ti n a tom mestu vratiti kontrolu
[ Buffy @ 29.04.2008. 12:13 ] @
Potpuno se slazem sa EArthquake-om ;)
Veliki pozdrav za Cou!
[ FooLControL @ 29.04.2008. 16:30 ] @
I ja se slazem :)
Sve radi kako treba,nisam znao za ovaj stepi dosta je pomoglo,ja sam isao stalno sa next!!!
[ L710 @ 23.05.2008. 01:16 ] @
ljudi jek moze neko objasniti kako se radi sabiranje binarnih brojeva uz pomoc logickih operacija and,xor i or i uz pomoc pomeranja?
[ Stojan Trifunovic @ 23.05.2008. 06:49 ] @
Pa nije bas da se tu vrsi sabiranje. Mislim da svi assembleri (bar svi
sa kojima sam se ja do sada sretao) imaju svoje instrukcije sabiranja
i oduzimanja, a da se jedino razlikuju u na primer prekoracenju (Carry
flagom) ili konverzijom u druge formate brojeva (BCD).
Samim tim neprakticno je koristiti logicke instrukcije umesto
(vec postojecih) aritmetickih.
Logicke instrukcije se mogu koristiti (i koriste se) prilikom tezih
matematickih operacija (mnozenje, deljenje, kvadratni koren, sinus...)
za assemblere kod kojih te operacije nisu hardverski podrzane.
Pretpostavljam da Vas interesuju funkcije i upotreba osnovnih logickih
operacija, odnosno bulova algebra. Mislim da su najbolje objasnjene
na sledecem sajtu:
http://www.ibiblio.org/obp/electricCircuits/Digital/index.html
A ukoliko Vas interesuje cisto hipoteticka upotreba logickih
instrukcija u cilju sabiranja, moguce je i to uraditi, medjutim onda
ce Vam biti potrebno i dosta testiranja rezultata (pre svega zbog
detekcije prekoracenja).
[ EArthquake @ 23.05.2008. 19:16 ] @
pa u sustini , implementacije svih instrukcija u procesorima se svode na kombinacije logickih kola
a iz bulovih algebri imas da uspomoc samo NILI ili NI mozes da opises bilo sta , samo je naravno komplikovano
kao sto je receno u prethodnom postu
http://www.play-hookey.com/digital/adder.html
[ L710 @ 24.05.2008. 00:12 ] @
e ljudi hvala na tako brzim odgovorima i na linkovima, ali mene bas zanima sabiranje pomocu logickih funkcija i pomeranja...tacnije sabiranje gde su 2 razlicita clana (1 i 0) vrsim pomocu xor, gde su 2 clana ista preko and-a.. Ali tu nastaje problem, kako da definisem da se carry poveca za 1 prilikom sabiranja 1 i 1. To me najvise zanima?
Ali i to sto kazete, zasto bih izmisljao toplu vodu, kada vec postoji.
[ Stojan Trifunovic @ 24.05.2008. 09:56 ] @
Aha, znaci tim principom. Nije toliko tesko. Dovoljno je nakon AND
operacije detektovati da li je rezultat 0 ili 1, i na osnovu toga
izazvati prekoracenje ili ne.
Evo primera za cetvorobitne vrednosti
0101 i
1001
Da bi se shvatio naredni postupak, bitno je utvrditi kada dolazi do
prekoracenja. Ukoliko je rezultat XOR jednak 1, onda su odgovarajuci
bitovi svakako razliciti, pa SIGURNO nema prekoracenja. Medjutim, ako
je rezultat 0, moguce su dve situacije. U prvoj su sabirci 0 i 0 i
tada nema prekoracenja, a u drugoj su sabirci 1 i 1, i tada ima
prekoracenja. Prekoracenje se testira preko AND nad sabircima.
Rezultat AND operacije bice 1 (ima prekoracenja) samo ako su oba
sabirka na logickoj 1.
Algoritam bi otprilike mogao izgledati ovako:
1. Odredite proizvoljnu adresu u kojoj cete cuvati SADASNJI i NAREDNI
flag prekoracenja, i inicijalizujte ih (obrisite).
2. Kopirajte oba sabirka u privremene adrese
3. Maskirajte sve bitove osim LSB (npr. sa AND 0001) u oba privremena
sabirka
4. Izvrsite XOR. Moguca su dva rezultata (0000 i 0001).
5. Ako je rezultat 0001 sabirci su razliciti pa prekoracenje
jednostavno nije moguce. Nastavite od koraka 9.
6. Sabirci su isti. Sada izvrsite AND nad kopijama. Moguca su dva
rezultata (0000 i 0001)
7. Ako je rezultat 0000 nema prekoracenja, pa nastavite od ...
8. Setujte NAREDNI flag prekoracenja u unapred odredjenoj adresi.
9. Sada je jedan sabirak REZULTAT prethodnog sabiranja (0000 ili
0001), a drugi SADASNJI flag prekoracenja (0 ili 1, tacnije 0000 ili
0001).
10. XOR nad novim sabircima, opet sa rezultatom 0000 ili 0001. Ako je
0001, nema prekoracenja, pa nastavi od koraka 12.
11. AND nad novim sabircima, opet sa rezultatom 0000 ili 0001. Ako je
0001 setuj NAREDNI flag prekoracenja.
12. Stanje NAREDNOG flaga prekoracenja prevedi u SADASNJI flag
prekoracenja, i obrisi NAREDNI flag prekoracenja.
13. U ovom trenutku imate i rezultat sabiranja (u LSB) i flag
prekoracenja (u SADASNJI). Snimite taj rezultat.
14. Da bi se sabrali naredni bitovi (bit1 i bit1), potrebno je
ORIGINALNE sabirke rotirati udesno, tako da oba bita1 dodju na mesto
LSB. Tako bi originalne vrednosti sabirka
0101 i
1001
postale
x010 i
x100
15. Ponovite postupak iz pocetka (od tacke 2).
Pod tackama 13 i 14 dodatni registri morali bi brinuti o prekoracenju
maksimalnog broja bitova (8 za osmobitne sabirke), kao i o smestanju
bitova rezultata na prava mesta, a to se opet lako moze uraditi
odgovarajucim rotacijama.
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.
|