Home > Enterprise >  LMC program to recognize if a number doesn't evenly divide into another
LMC program to recognize if a number doesn't evenly divide into another

Time:10-31

I am trying to create a program in LMC which checks if a number evenly divides into another one (such as 10/2), with the program below I am able to do divison and halt the program as required

INP 
        STA DIVIDEND
        INP
        STA DIVISOR
LOOP    LDA DIVIDEND
        BRZ END
        SUB DIVISOR
        STA DIVIDEND
        LDA ANSWER
        ADD INC
        STA ANSWER
        BRP LOOP
END     LDA ANSWER
        OUT
        SUB ANSWER
        STA ANSWER
        HLT
DIVIDEND DAT 0
DIVISOR DAT 0
ANSWER  DAT 0
INC     DAT 1

I need to find a way, within the same program, for LMC to recongzie that the numbers that user inputed do NOT evenly divide (such as 10/3) in which case it is to output zero and ask for two new numbers. I have tried doing this with another loop but if seems to always conflict with the loop I have for subtraction. I have tried whatever I could think and don't know how to make LMC fulfill this requiremnet while also retaining the requirement of halting the program when inputs do evenly divide

CodePudding user response:

You'll need to check that the SUB DIVISOR resulted in negative overflow. If that happens you know that the dividend was not an integer multiple of the divisor and can output zero and repeat the program.

Since at that point the answer data might already be non-zero, you should also reset it. This is what you did at the last two instructions just before the HLT, but of course that doesn't serve much purpose when you're going to halt. It is any way good practice do perform such a reset at the start of your program, as the LMC has a user-control to restart the program at any moment, and then you want to be sure you really start with a clean slate.

Here is your updated program. You can run it here:

start    LDA zero # reset
         STA ANSWER
         INP
         STA DIVIDEND
         INP
         STA DIVISOR
LOOP     LDA DIVIDEND
         BRZ END
         SUB DIVISOR
         BRP continue # No negative overflow
         LDA zero # Tell user there is a remainder
         OUT
         BRA start # ... and ask for new inputs
continue STA DIVIDEND
         LDA ANSWER
         ADD INC
         STA ANSWER
         BRA LOOP
END      LDA ANSWER
         OUT
         HLT

DIVIDEND DAT
DIVISOR  DAT
ANSWER   DAT
INC      DAT 1
zero     DAT 0



<script src="https://cdn.jsdelivr.net/gh/trincot/[email protected]/lmc.js"></script>

  • Related