MHB Implement MIMA Function EQL adr - Wondering

  • Thread starter Thread starter mathmari
  • Start date Start date
  • Tags Tags
    Function
AI Thread Summary
The discussion revolves around implementing a MIMA program to represent the value $2^{23}-24=8,388,584$ in memory using MIMA commands. Participants explore how to correctly represent this number in two's complement and discuss the steps needed to compute and store the value. The proposed approach includes initializing memory, using loops to compute powers of two, and handling subtraction through bitwise operations. There is also a focus on optimizing the implementation and ensuring the logic aligns with MIMA's command structure. The conversation emphasizes the importance of memory management and the correct use of commands to achieve the desired outcome.
mathmari
Gold Member
MHB
Messages
4,984
Reaction score
7
Hey! :o

We have that MIMA (Neumann MInimal MAchine) has the following commands:
Code:
LCD const   :  Load constant 
LDV adr      :  Load value from address 
LDIV adr     :  Load value indirect from address 
STV adr      :  Set value at address 
STIV adr     :  Set value indirect at address

View attachment 6290

Code:
NOT            :   Inverse of the constant-bits   
RAR            :   Rotate accumulator right

View attachment 6291

Code:
ADD adr      :   Addition 
AND adr      :   bitwise AND 
OR  adr       :   bitwise OR 
XOR adr      :   bitwise exclusive OR

View attachment 6292

Code:
JMP  adr      :   Jump 
JMN adr       :   Jump if negative
I want to write a MIMA program that takes the value $2^{23}-24=8.388.584$ to the memory $y$.
We have to take attention at the number of the bits, that we need for the representation of the number in two's complement.

How do exactly do we make the representation? (Wondering)

The other part is the following, or not?
Code:
LDC  const 
STIV  y
Then I want to implement the Mima-command EQL adr (equal?) with the other Mima-commands.

We have that for that command it holds the following: $$\text{Accu} \leftarrow \left\{\begin{matrix}
-1 , &\text{ Accu }=M(adr)\\
0 , &\text{otherwise}
\end{matrix}\right.$$

I have done the following:
My idea is to compute -M(adr) and then to add it to Accu, and then to check if it i <0.
And then to compute the inverse of the result and check if it is <0.
Is it correct? (Wondering)

Code:
LCD const 
LDV adr 
NOT 
STV adr 
ADD adr 
STV adr 
JMN x 
LDC -1 
JMP z 
x: LCD 0 
z: NOT 
   JMN m 
   LDC -1 
   JMP n 
   m: LCD 0 
   n: STV adr

Is the implementation correct? Could I improve something? (Wondering)
 

Attachments

  • mima.PNG
    mima.PNG
    7.4 KB · Views: 111
  • not.PNG
    not.PNG
    4.4 KB · Views: 112
  • arith.PNG
    arith.PNG
    6.6 KB · Views: 122
Last edited by a moderator:
Technology news on Phys.org
We have also the following information about the bits:
Address: 20 Bit and Values: 24 Bit
 
About the representation of the number in two's complement, I have done the following:

We have that $2^{n+1}=2\cdot 2^n=2^n+2^n$.

So, $$2^1=2^0+2^0=1+1 \\ 2^2=2^1+2^1=(1+1)+(1+1) \\ 2^3=2^2+2^2=[(1+1)+(1+1)]+[(1+1)+(1+1)] \\ \text{etc} $$

And we have that $24=2^3\cdot 3=2^3+2^3+2^3$.

We initialize the memory cell $y$ with $1$ and we repeat $23$ times to add the value of $y$ by itself and the result we put it at $y$.

Then we have to subtract three times $2^3$.

How do we do this? Do we have to compute again the $2^3$'s, then compute the inverse and add it to the value that is at $y$ ?

But where do we do these operations? To calculate $2^3$ as above, we have to save the results at each step, or not? But where? Do we consider an other memory cell, say $a$, for that? (Wondering)

Let $x$ be the memory cell where the representation of $23$ in two's complement is, and let $z$ be the memory cell where the representation of $3$ in two's complement is.

I wrote the following code (about the part of $2^3$ I computed it in the way we compute $2^{23}$ and I subtracted it three times from $y$):

Code:
            LCD 1 
            STV y 
while1:     LDC 0 
            NOT 
            ADD x 
            STV x 
            JMN end1 
            LDV y 
            ADD y 
            STV y 
           JMP while1 
end1:       LDC 1 
            STV a 
while2:     LDC 0 
            NOT 
            ADD z 
            STV  z
            JMN end2 
            LDV a 
            ADD a 
            STV a 
            JMP while2 
end2:       LDV a 
            NOT 
            ADD y 
            LDV a 
            NOT 
            ADD y 
            LDV a 
            NOT 
            ADD y 
            HALT
Is this correct? (Wondering)
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...

Similar threads

Replies
2
Views
1K
Replies
6
Views
6K
Replies
3
Views
2K
Replies
5
Views
2K
Replies
13
Views
3K
Back
Top