[MAL]-Faculteit (Binair shiften)

Pagina: 1
Acties:
  • 145 views sinds 30-01-2008
  • Reageer

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 31-01 09:31
We hebben als opdracht het maken van een faculteit-functie (in MAL (micro assembly language)).
Dit moet mbv het shiften van de bits gebeuren.

Er is dus alleen maar een shift naar rechts (1; >> 1) en naar links (8; << 8).
We weten niet hoe we moeten beginnen, dus zou iemand ons even in de goede richting kunnen duwen?

Alvast bedankt :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet het faculteit even vergeten en gewoon een vermenigvuldig-functie bouwen.
Hoe vermenigvuldigde je ook alweer op de basisschool?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 31-01 09:31
.oisyn schreef op vrijdag 13 oktober 2006 @ 12:28:
Je moet het faculteit even vergeten en gewoon een vermenigvuldig-functie bouwen.
Hoe vermenigvuldigde je ook alweer op de basisschool?
Het vermenigvuldigen snappen we, maar dit moeten we nu toepassen mbv shiften (8 naar links of 1 naar rechts (evt 2 naar links, vermenigvuldigen met 2)), maar we hebben geen idee hoe we dit doen :'(

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je leest ook niet he? :). Kijk, ik ga het niet uitkauwen, het is vrij simpel en je vroeg ook om een duw in de goede richting.

Hoe vermenigvuldigde je ook alweer op de basisschool?

Nou, zo:
code:
1
2
3
4
5
6
7
  123
   45
------- *
  615
 4920 
------- +
 5535


En dan nu in binaire notatie.

[ Voor 94% gewijzigd door .oisyn op 13-10-2006 12:34 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 31-01 09:31
Het vermenigvuldigen is niet moeilijk..

Ik kijk naar het onderste getal, begint met een 1 (van rechts naar links), dat 'gewoon' keer het getal daarboven (= 0010).
Dan de volgende bit in het onderste getal, ook een 1. Maar omdat er al een bit is gebruikt, eerst een 0 in het antwoord. Dan weer het bovenste getal, levert: 0100.
Dit bij elkaar optellen levert het antwoord (0110).

0010
0011
------- X
0010
0100
-------+
0110 (= 6).


Edit: Zoals gezegd, dít snappen we wel :)
Maar wat we niet snappen is hoe we dit werkend krijgen met het shiften (aangezien je alleen maar 8 naar links of 1 naar rechts kan...).

[ Voor 13% gewijzigd door aaajeetee op 13-10-2006 12:35 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

En je snapt nu niet waar de shift van pas komt :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 31-01 09:31
.oisyn schreef op vrijdag 13 oktober 2006 @ 12:35:
En je snapt nu niet waar de shift van pas komt :?
Dat is het onderste getal (in dit geval) naar links shiften, zo vaak je het bovenste getal naar rechts kunt shiften...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is dan het probleem, want blijkbaar snap je het helemaal :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 31-01 09:31
.oisyn schreef op vrijdag 13 oktober 2006 @ 12:38:
Wat is dan het probleem, want blijkbaar snap je het helemaal :)
Oh.. snap ik t? :p

Maar we kunnen alleen maar 8 naar links shiften.. dus als dat andere getal 3x naar rechts geshift kan worden, kunnen we niet 3x naar links shiften...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

je kan toch een enkele shiftleft 8 doen, en dan 5x een shiftright 1? Als je iig genoeg ruimte hebt in je register :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 31-01 09:31
We hebben nu dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fac0    MAR = SP = SP + 1
fac1    PC = PC + 1; fetch
fac2    MDR = TOS = MBR
fac3    H = 1
fac4    OPC = 0
fac5    Z = H = TOS = TOS - H; if(Z) goto fac9; else goto fac6
fac6    Z = H >> 1; if (Z) goto fac5; else goto fac7
fac7    OPC = OPC + 1
fac8    H = 1; goto fac5
fac9    H = 1
fac10   Z = OPC = OPC - H; if(Z) goto fac14; else goto fac11
fac11   H = MDR
fac12   MDR = MDR + H; goto fac9
fac14   MDR = TOS = MDR; wr; goto Main1

Dit werkt voor FAC 3 en FAC 2, maar bij het outputten van FAC 4 krijgen we een leuk '@'. Is er bekend welk decimaal getal dit is?

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 02-02 15:33
Een @ is in principe het decimale getal 64 :)

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 31-01 09:31
.Peter schreef op vrijdag 13 oktober 2006 @ 13:53:
Een @ is in principe het decimale getal 64 :)
Oh.. crap :p

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 31-01 09:31
Waar gaan we de fout in :'(

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 07:44
Kun je ook zeggen hoe het zou moeten werken? Want ik kan hier niet echt wijs uit worden en aangezien er helemaal geen commentaar in staat (MAL kent // als commentaar) is het nogal onduidelijk wat de functie is van elke instructie en waarvoor de registers H en OPC hier gebruikt worden.

Als ik het goed begrijp bevind de operand voor de functie FAC zich in het programmageheugen en wordt het resultaat van FAC op de stack gedumpt.

Wat me wel opvalt is dat fac14 (waar is fac13 ;)) wat eenvoudiger kan.
code:
1
fac14    MDR = TOS = MDR; wr; goto Main1
Waarom zou je MDR in zichzelf laten schrijven? TOS = MDR is wel genoeg, zou ik zeggen.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett

Pagina: 1