Skip to content

Instantly share code, notes, and snippets.

@mathewmariani
Last active February 18, 2024 17:59
Show Gist options
  • Save mathewmariani/91f471422c4ac0b5ee37 to your computer and use it in GitHub Desktop.
Save mathewmariani/91f471422c4ac0b5ee37 to your computer and use it in GitHub Desktop.
https://github.com/mathewmariani/MARIE-Examples. Please feel free to email me if you have any questions.
ORG 0
LOAD X / LOAD X into AC
ADD Y / ADD Y to AC
STORE Z / STORE AC in Z
LOAD Z / LOAD Z into AC
OUTPUT / OUTPUT AC
X, DEC 1 / variable declaration
Y, DEC 2 / variable declaration
Z, DEC 0 / variable declaration
ORG 0
Cond, LOAD COUNT / LOAD count into AC
SUBT ARRAY / SUBTRACT array[0] from AC
SKIPCOND 000 / Skipcond 000 if AC < 0
JUMP End / JUMP to End
Loop, LOAD COUNT / LOAD Count into AC
ADD ONE / ADD ONE to AC
STORE COUNT / STORE AC into COUNT
LOADI INDEX / LOAD MEM[index] into AC
OUTPUT / OUTPUT value at index
LOAD INDEX
ADD ONE
STORE INDEX
JUMP Cond / JUMP to Cond
End, LOAD START / LOAD start into AC
STORE INDEX / STORE AC into index
HALT / HALT process
INDEX, HEX 013 / Our current memory location
START, HEX 013 / The memory location of our first value (in hex)
ARRAY, DEC 5 / The first index of our array (used for size)
DEC 0 / index 0
DEC 2 / index 1
DEC 4 / index 2
DEC 8 / index 3
DEC 16 / index 4
COUNT, DEC 0
/ constant values
ZERO, DEC 0
ONE, DEC 1
TWO, DEC 2
THREE, DEC 3
FOUR, DEC 4
FIVE, DEC 5
SIX, DEC 6
SEVEN, DEC 7
EIGHT, DEC 8
NINE, DEC 9
TEN, DEC 10
ORG 0
Cond, LOAD COUNT / Load count into AC
SUBT TEN / Remove 10 from count
SKIPCOND 000 / Skipcond 000 if AC < 0
JUMP End / End Loop
Loop, LOAD COUNT / Load count into AC
ADD ONE / Increment Count by 1
STORE COUNT / Store AC in count
JNS Fibb
JUMP Cond / Check loop conditions
Fibb, HEX 000 / Store value for JNS
CLEAR / AC = 0
/ Fi = F1 + F2
ADD F1 / AC + F1
ADD F2 / AC + F2
STORE Fi / Fi = AC
/ F1 = F2
LOAD F2 / AC = F2
STORE F1 / F1 = AC
/ F2 = Fi
LOAD Fi / AC = Fi
STORE F2 / F2 = AC
/ Quick Output
LOAD Fi / AC = FI
OUTPUT / Output AC
JUMPI Fibb
End, HALT / Halt process
/ variables
COUNT, DEC 0 / count for loop
Fi, DEC 0
F1, DEC 0
F2, DEC 1
/ constant values
ZERO, DEC 0
ONE, DEC 1
TWO, DEC 2
THREE, DEC 3
FOUR, DEC 4
FIVE, DEC 5
SIX, DEC 6
SEVEN, DEC 7
EIGHT, DEC 8
NINE, DEC 9
TEN, DEC 10
/ This program presents a simple add(a, b) function.
/ #L8-9 Sets the argument `add_a` for the add function.
/ #L10-11 Sets the argument `add_b` for the add function.
/ #L12 Calls the add function using JNS which stores the current PC to be used as a callback
/ #L21 Indirectly jumps back to where the function was called from.
ORG 0
LOAD X
STORE add_a
LOAD Y
STORE add_b
JNS add
OUTPUT
HALT
add_a, DEC 0
add_b, DEC 0
add, HEX 0
LOAD add_a
ADD add_b
JUMPI add
/ variables
X, DEC 1
Y, DEC 2
ORG 0 / implemented using "do while" loop
WHILE, LOAD STR_BASE / load str_base into ac
ADD ITR / add index to str_base
STORE INDEX / store (str_base + index) into ac
CLEAR / set ac to zero
ADDI INDEX / get the value at ADDR
SKIPCOND 400 / SKIP if ADDR = 0 (or null char)
JUMP DO / jump to DO
JUMP END / JUMP to END
DO, OUTPUT / output value at ADDR
LOAD ITR / load iterator into ac
ADD ONE / increment iterator by one
STORE ITR / store ac in iterator
JUMP WHILE / jump to while
END, HALT
ONE, DEC 1
ITR, DEC 0
INDEX, HEX 0
STR_BASE, HEX 12 / memory location of str
STR, HEX 48 / H
HEX 65 / E
HEX 6C / L
HEX 6C / L
HEX 6F / O
HEX D / carriage return
HEX 57 / W
HEX 6F / O
HEX 72 / R
HEX 6C / L
HEX 64 / D
HEX 0 / NULL char
/ #L10 Is beginning of an if control block, where an the value of an expression is determined.
/ In this case were comparing `EXP` to 0.
/ #L14 Is the body of the if statement, we output `IVALUE` and `JUMP` to `end`.
/ We `JUMP` to avoid running code from `else`.
/ #L18 Is the body of the else statement, we output `EVALUE` and continue running the program.
/ Unlike the body of the if statment we don't need to `JUMP`; instead we can continue.
/ #L11 If `EXP` is not 0 then then SKIPCOND will not skip over #L12 forcing a `JUMP`.
ORG 0
if, LOAD EXP / LOAD EXP into AC
SKIPCOND 400 / SKIPCOND 400 (if AC = 0)
JUMP else / JUMP to `else`
LOAD IVALUE / LOAD IVALUE into AC
OUTPUT / OUTPUT value IVALUE
JUMP end / JUMP to `end`
else, LOAD EVALUE / LOAD IVALUE into AC
OUTPUT / OUTPUT value IVALUE
end, HALT / HALT
/ variables
EXP, DEC 1
IVALUE, DEC 2
EVALUE, DEC 3
ORG 0 / implemented using a "for" loop
Cond, LOAD COUNT / LOAD count into AC
SUBT TEN / SUBTRACT 10 from AC
SKIPCOND 000 / Skipcond 000 if AC < 0
JUMP End / JUMP to End
Loop, LOAD COUNT / LOAD Count into AC
ADD ONE / ADD ONE to AC
STORE COUNT / STORE AC into COUNT
LOAD COUNT / LOAD count into AC
OUTPUT / OUTPUT AC
JUMP Cond / JUMP to Cond
End, HALT / HALT process
COUNT, DEC 0
/ constant values
ZERO, DEC 0
ONE, DEC 1
TWO, DEC 2
THREE, DEC 3
FOUR, DEC 4
FIVE, DEC 5
SIX, DEC 6
SEVEN, DEC 7
EIGHT, DEC 8
NINE, DEC 9
TEN, DEC 10
ORG 0
LOAD X / LOAD X into AC
SUBT Y / SUBTRACT Y from AC
STORE Z / STORE AC in Z
LOADZ / LOAD Z into AC
OUTPUT / OUTPUT AC
X, DEC 2 / variable declaration
Y, DEC 1 / variable declaration
Z, DEC 0 / variable declaration
/ This program presents a simple tolower(ptr) function.
/ #L8-9 Sets the argument `str_ptr` for the tolower function.
/ #L10 Calls the tolower function.
/ #L27 Adds the offset between upper and lower case letters on ascii table.
/ 0x41 ('A') 0x61 ('a') --> 0x20
ORG 0
LOAD str_ptr
STORE tolower_ptr
JNS tolower
HALT
tolower_itr, DEC 0
tolower_ptr, HEX 0
tolower_idx, HEX 0
tolower_offset, HEX 20
tolower, HEX 0
tolower_while, LOAD tolower_ptr
ADD tolower_itr
STORE tolower_idx
CLEAR
ADDI tolower_idx
SKIPCOND 400
JUMP tolower_do
JUMPI tolower
tolower_do, ADD tolower_offset
OUTPUT
LOAD tolower_itr
ADD ONE
STORE tolower_itr
JUMP tolower_while
str_ptr, HEX 18 / memory location of str
str, HEX 48 / H
HEX 45 / E
HEX 4C / L
HEX 4C / L
HEX 4F / O
HEX D / carriage return
HEX 57 / W
HEX 4F / O
HEX 52 / R
HEX 4C / L
HEX 44 / D
HEX 0 / NULL char
/ constants
ONE, DEC 1
ORG 0 / implemented using a "for" loop
INPUT / INPUT into AC
STORE MAX / STORE AC into MAX
Cond, LOAD COUNT / LOAD count into AC
SUBT USR / SUBT MAX from AC
SKIPCOND 000 / Skipcond 000 if AC < 0
JUMP End / JUMP to End
Loop, LOAD COUNT / LOAD Count into AC
ADD ONE / ADD ONE to AC
STORE COUNT / STORE AC into COUNT
LOAD COUNT / LOAD count into AC
OUTPUT / OUTPUT AC
JUMP Cond / JUMP to Cond
End, HALT / HALT process
/ variables
COUNT, DEC 0
MAX, DEC 0
/ constants
ZERO, DEC 0
ONE, DEC 1
TWO, DEC 2
THREE, DEC 3
FOUR, DEC 4
FIVE, DEC 5
SIX, DEC 6
SEVEN, DEC 7
EIGHT, DEC 8
NINE, DEC 9
TEN, DEC 10
@utsav-rex
Copy link

Can you please help me with this Marie program. Please it's urgent!

Write a MARIE program to allow the user to input 8 integers (positive, negative, or zero) and then find the smallest and the largest and print each of these out.

As an example, if the user enters the following decimal numbers as input (one after the other)

23, -6, 78, 0, 36, 3, -250, –5

the program would output the following values as the maximum and minimum, respectively:

78
-250

Assume that the user will always provide valid numbers as input; that is, do not worry about dealing with invalid input data.

CSU IT FUNDAMENTALS?

@chilledHamza
Copy link

Can you please help me with this Marie program. Please it's urgent!

Write a MARIE program to allow the user to input 8 integers (positive, negative, or zero) and then find the smallest and the largest and print each of these out.

As an example, if the user enters the following decimal numbers as input (one after the other)

23, -6, 78, 0, 36, 3, -250, –5

the program would output the following values as the maximum and minimum, respectively:

78
-250

Assume that the user will always provide valid numbers as input; that is, do not worry about dealing with invalid input data.

same problem

I have the solution, let me know if you still need it.

@thongminhtran
Copy link

Hello, I really need your help now because I really don't know how to write the MARIE code.
Using the Marie Simulator found on the web site, you will create a small assembly language Marie program. The program is a VERY simple addition tool. Basically, your program will issue a prompt (">"), then accept a single digit integer from the user. (Hit the ENTER key to actually enter the value). It will then echo that integer to the screen, print a "+” symbol, then wait for a second digit. It will then echo this digit to the screen, followed by the "=" symbol and then the result of the addition. There is no error checking, so all numbers entered should be a single digit, and the result must also be a single digit. So 1+3=4 is okay, but 7+9=16 is not (i.e., your program is not expected to be able to handle the second case properly). When the calculation is finished, you must tell the program whether to continue or not. If you enter a "!", the program will print "BYE" to the screen and halt. If you simply hit the ENTER key instead, it will loop and provide a new prompt. Note that IO is quite limited on Marie so you can't do anything fancy. You should select the "no linefeed" option in the Output Window - everything will be printed on one line. A sample output for a two iteration loop would be something like this: > 3+2=5>1+2=3BYE You will hand in your source file with your submission. It should be called adder.mas. The tutor will assemble and run your source code.  

Can you please help me the code for question above? I can etransfer for you if need. I really need the code. Thank you so much

@mathewmariani
Copy link
Author

Please feel free to email me if you have any questions.

@codingShark12
Copy link

Hi can someone pls tell me the code for checking for palindrome using MARIE code ? The palindrome needs to be checked for the user input which I managed to create . So basically what I want to do is check for palindrome in the input I enter and if it is a palindrome output 1 . PLS PLS reply to this

@codingShark12
Copy link

Please feel free to email me if you have any questions.

where can I find your email ?

@mathewmariani
Copy link
Author

where can I find your email ?

It can be found on my GitHub

@areaknight99
Copy link

Hi, can someone help me with this question. I don't get how you can input in operations like "+, -, *" and use to get the sum of the numbers you already inputted.
Here are the questions:

  1. Using the INPUT instruction wait for the user to enter an integer number.
    a. Be sure the dropdown for the Input field says Decimal
  2. Using the INPUT instruction wait for the user to enter a second integer number.
    a. Be sure the dropdown for the Input field says Decimal
  3. Using the INPUT instruction wait for the user to enter the character +, - or *.
    a. Be sure the dropdown for the Input field says ASCII. Then type the symbol for the operation you want, i.e. “+”, “-“, etc.
  4. Perform the desired addition, subtraction or multiplication operation.
  5. Store the result in a variable in memory.
  6. Display the result via the OUTPUT instruction.

Thank you!

@mathewmariani
Copy link
Author

@areaknight99 Please read the other comments. I do not answer questions here but you can email me.

@sandeep0570
Copy link

Write a MARIE program that outputs "YES" on the display when A>B and prints "NO" otherwise. For comparisons, the program must not use SKIPCOND 400 or SKIPCOND 800; it will use SKIPCOND 000 only

@niazattari
Copy link

Dear help me...
Code not working properly
/ *****
/ This is starting code for Project 2
/ Remove this header and identify your project name and your name.
/
/ *****

ORG		100		/ Start the program at location 100 hexadecimal

/ -----
/ Input characters, transform, and store in memory until '.' is input
/ -----
Load Start / Initialize character pointer to start of block
Store Ptr
GetVal, Input /Take the input value
Subt ChPe / subroutine '.' (2E)
Skipcond 800 / AC will be 00, if the input is '.'
/jump Print we're done entering, now go print
input / get next array element

/>>>>> Add code to accomplish the input and output phases. <<<<<

/>>>>> Here's an example of how subroutine ROT13 is called. <<<<<
/>>>>> We'll just transform 'A' in this example then halt. Load ChA / Put 'A' in AC
Store InVal / Store value to be transformed into InVal
Jns ROT13 / Jump to the ROT13 subroutine
/ Upon return, the transformed character is in AC
storeI Ptr / store in arr[index]
load Ptr / Ptr++
add Incr
store Ptr
load Index / Index++
add Incr
store Index
jump GetVal / return to loop tes
Halt
Print, load Arr / copy array address
load Arr
store Ptr
clear / Index = 0
store Index
PrtVal, loadI Ptr / get/print next element from arr[index]
output
load Ptr / Ptr++
add Incr
store Ptr
load Index / Index++
add Incr
store Index
Jump PrtVal / return to loop test

/ -----
/ Rotate-13 subroutine: Apply ROT13 to input character in location InVal and return in AC
/ -----

/>>>>> WARNING: This subroutine almost works. You need to fix a bug.

ROT13, HEX 0
Load InVal / Get character
Add Val13 / Add 13
Store Hold / Save it
Subt ChZ / Check if modulo adjust is needed (past 'Z')
Skipcond 800 / No adjust needed if past 'Z'
Jump NoAdj
Add ChA / Add 'A' back to difference to perform modulo
Jump Done / Result is in AC

NoAdj, Load Hold / No adjust needed, get result

Done, Jump ROT13 / Return with result in AC

/ -----
/ Constants (the program should not write to these locations)
/ -----
ChA, HEX 0041 / Constant value 'A' for modulo adjust in subroutine
ChZ, HEX 005A / Constant value 'Z' for modulo check in subroutine
ChPe, HEX 2E / Constant period character that marks end of input
Val13, DEC 13 / Constant rotate value of 13 for subroutine
One, HEX 1 / Constant value 1
Start, HEX 200 / Constant address for start of character block

/ -----
/ Data area (these locations are for reading and writing)
/ -----
InVal, HEX 0 / subroutine for subroutine input value
Hold, HEX 0 / Reserved for temporary variable for subroutine
Ptr, HEX 0 / Reserved for character pointer
Index, hex 0 / current array index
Element, hex 0 / value of current array element
Incr, hex 1 / for ++
Arr, hex 28 / address for start of the array storage

@kim01289
Copy link

kim01289 commented Jul 7, 2022

@mathewmariani Please check my email!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment