Difference between revisions of "CSC103 Assembly Language Lab 2014"

From dftwiki3
Jump to: navigation, search
(Start)
(Mini Challenge of the Day)
 
(25 intermediate revisions by the same user not shown)
Line 10: Line 10:
 
<center>There is an older version of this lab [[CSC103_Assembly_Language_Lab_(version_2)_2013| here]].</center>
 
<center>There is an older version of this lab [[CSC103_Assembly_Language_Lab_(version_2)_2013| here]].</center>
 
<br />
 
<br />
=Preparation=
+
<br />
 +
__TOC__
 +
<br />
 +
<br />
 +
 
 +
=The Simple Computer Simulator (SCS)=
 +
<br />
 +
As you progress through the lab you will need some more information about the various instructions our SCS supports.  These instructions are documented in this [[Simple Computer Simulator Instruction-Set| page]].
 +
<br />
 
==Start==
 
==Start==
 +
<br />
 
* Point your browser to [http://cs.smith.edu/dftwiki/media/simulator/ the simulator] to start it.
 
* Point your browser to [http://cs.smith.edu/dftwiki/media/simulator/ the simulator] to start it.
 
<br />
 
<br />
Line 17: Line 26:
 
<br />
 
<br />
  
==Editing Program==
+
==Writing the Program==
* Click on the top bar at the top of the simulator applet, which says '''computer'''
+
* Click on the '''Program''' tab at the top of the simulator widget to open up the '''edit window'''.
* In the edit window that opens up, enter this simple program:
+
* Highlight the default program that appears in the window and delete it.
 +
* In the newly erased edit-window, enter this simple program:
  
 +
<code><pre>
 +
LOAD 1
 +
STORE [8]
 +
HALT
 +
</pre></code>
  
* Enter a simple program in the window:
+
You will notice that as you press the ENTER key after each line, the instruction is reformatted and a semicolon appended at the end.  This is the normal of an instruction in assembly language.  The number on the left is the next logical address where the instruction will be stored.  The semicolon is a special marker that allows you to write a comment to give additional information about what you are trying to do.  For example, we could have typed:
  
 
<code><pre>
 
<code><pre>
@0
+
LOAD 1 ; load 1 into the accumulator
        lod-c 1
+
STORE [8]; store the accumulator at Address 8
sto    10
+
HALT ; stop the program
hlt
+
</pre></code>
 +
 
 +
After you press the ENTER key after the last line, you should get this listing in the edit-window (with or without comments, depending on whether you added them to your code):
  
@10 
+
<code><pre>
         0
+
0000:    LOAD 1         ;
 +
0002:    STORE [8]        ;
 +
0004:    HALT            ;
 
</pre></code>
 
</pre></code>
  
==Translating/loading into RAM==
+
Your program has been partly ''assembled''.  This is the term used to describe the translation that takes place when a collection of instructions gets transformed into numbers that will go into the ''memory'' of the computer.  Here the numbers on the left of the colon represent the address in memory where each instruction will be saved.
 +
<br />
 +
 
 +
==Loading the Program into RAM==
 +
<br />
  
* Click on '''translate'''
+
* Click on the '''Computer''' tab.
* Observe that your program has been translated, or ''coded'' into numbersNumbers are the only thing the processor can understand.   
+
* Observe that all the instructions are there, written in purple, but that the actual contents of the memory are numbers.  Each instruction is coded as a number, and each number is stored at an address in memoryThe first instruction is always stored at Address 0The first instruction of the program is '''LOAD 1''', and '''LOAD''' is coded, as '''4''', stored at Address 0, and 1 is coded as... just '''1''', stored at the next address, i.e. Address '''1'''.   The '''STORE''' instruction is stored at Address '''2''', and its argument, '''8''', at Address '''3'''.   The final instruction, '''HALT''' is stored at Address '''4'''.
* If the top right button says '''Integer''', click on it so that it shows '''Instructions'''.  Observe that numbers can mean instructions as well as numbers for the processor.
+
<br />
* Click on the top right button and see how the memory can be seen many different ways. The real contents of the memory is when you ask to see it in '''binary'''. That's what inside the memory of a computer at any given time.  Bits.  But because these bits are used in a ''code'', they can mean different things.
 
  
 
==Execute the Progam==
 
==Execute the Progam==
 +
<br />
 +
 
===Single Stepping===
 
===Single Stepping===
* Click on the button that says "Set PC = 0" to make sure the processor will execute the program starting at 0
+
<br />
* Click on the '''Cycle''' button and observe that the number 1 is going into the '''AC''' register and then into memory, at '''Address 10'''.
+
 
 +
* Click on the button that says "Reset" to make sure the processor will execute the program starting at 0
 +
* Click on the '''Step''' button and observe that the number 1 is going into the '''AC''' accumulator register and then into memory, at '''Address 8'''.
 +
<br />
  
 
===Running the program===
 
===Running the program===
 +
<br />
 +
 
* If you want to run the program full speed rather that executing it a step at a time, the procedure is slightly different.
 
* If you want to run the program full speed rather that executing it a step at a time, the procedure is slightly different.
* First, change the program so that it loads a number different from 1 into AC:
+
* Click on '''Reset'''
 
+
* Change the contents of the AC register by entering some random number in the AC box, say 33.
        lod-c    55
+
* Click '''Run''' instead of '''Cycle'''.   This runs the program.
 
+
* Observe that 33 is overwritten by 1, and then stored at Address 8.
* '''Translate'''
 
* set '''PC = 0'''
 
* Click '''Run''' instead of '''Cycle'''.
 
* This runs the program.
 
* Observe that 55 will be loaded up from memory into AC, and then stored into the variable '''var1''', at Address 10.
 
  
 
<br />
 
<br />
 
::You now know the basics of programming in assembly language.
 
::You now know the basics of programming in assembly language.
 +
<br />
  
 
=Problem 1=
 
=Problem 1=
 +
<br />
  
* Using the steps you have just gone through, write a program that initializes 3 memory locations at 10, 11, and 12 with the value 23.  You should end up with the number 23 in three different memory locations.
+
* Using the steps you have just gone through, write a program that initializes 3 memory locations at 10, 11, and 12 with the value 22.  You should end up with the number 23 in three different memory locations.
 +
<br />
 +
<tanbox>
 +
If you get a message of the form:
 +
::<tt>***address already in use ***0002:    STORE [9]        ;</tt>
 +
it means that you are attempting to put the instruction '''STORE [9]''' at Address 2, but this memory location is already used by another instruction.  Simply remove the '''0002:''' part of your line and you will be fine.
 +
</tanbox>
 +
<br />
  
 
=Problem 2=
 
=Problem 2=
 +
<br />
  
* Something very similar to the previous problem, but instead of storing the same value in all three variables, store 9, 19, 13 (this could be today's date)  at Addresses 10, 11, and 12, respectively.
+
* This problem is very similar to the previous problem, but instead of storing the same value in all three variables, store the numbers 9, 19, 13 at Addresses 20, 21, and 22, respectively.
 +
<br />
  
 
=Problem 3=
 
=Problem 3=
 +
<br />
  
 
* Try this program out:
 
* Try this program out:
  
 
<code><pre>
 
<code><pre>
@0  
+
0:    LOAD  [10]
        lod    10
+
STORE  [11]
sto    11
+
HALT
hlt
+
10: 55
 +
11: 0
  
@10
 
  55
 
  0
 
 
</pre></code>
 
</pre></code>
  
 
* Run it.
 
* Run it.
* Observe the result, and in particular what happens to Memory Location 11.
+
* Observe that when your program has finished running, it will have copied the number 55 from Location 10 to Location 11. Note that this is a copy of operation, and you end up with two locations containing 55.
* Add two new variables to the data section at Addresses 12 and 13.
+
* Modify your program so that it copies the 55 from Address 10 to the locations at Addresses 11, 12, and 13.
* Modify the program so that it copies the contents of Address 10 into the locations at Addresses 11, 12, and 13.
 
 
* Verify that your program works
 
* Verify that your program works
* Modify the number at Address 10 and restart the program.  Does the program put the new value in the other 3 variables?
+
* Put a different number at Address 10, and run your program againVerify that this number is copied 3 times by your program to the three locations, at Addresses 11, 12, and 13.
 +
<br />
  
 
=Problem 4=
 
=Problem 4=
 +
<br />
  
 
* Try this program out:
 
* Try this program out:
  
 
<code><pre>
 
<code><pre>
@0
+
LOAD [8]        ;
        lod    10
+
ADD 1         ;
add-c 1
+
STORE [8]        ;
sto    10
+
HALT            ;
hlt
+
8:    55           ;
 
 
@10
 
    55
 
    66
 
    3
 
 
</pre></code>
 
</pre></code>
  
 
* Run the program
 
* Run the program
* What does it do?  What's the result of the computation?
+
* What does it do? Pay close attention to the number stored at Address 8 in memory. What is the result of the computation?
* Once you've figured it out, modify the program so that Address 10 originally starts with the value 5 in it, and then ends with the value 7.   
+
* Once you've figured it out, modify the program ''slightly'' so that Address 8 originally starts with the value 55 in it, and then ends with the value 57.   
* Verify that your program will add 2 to the variable at Address 10,  whatever its original value.
+
* Play with your program some more and verify that your program will add 2 to the variable at Address 8,  whatever its original value.
  
* Once your programs works, modify the program so that it adds two to all three variables at Addresses 10, 11, and 12.
+
* Once your programs works, modify it some more so that now it adds 2 to the contents of two memory locations, one at Address 20, and one at Address 21.
 +
<br />
  
 
=Problem 5=
 
=Problem 5=
 +
<br />
  
 
* Try this new program out:
 
* Try this new program out:
  
 
<code><pre>
 
<code><pre>
@0
+
0000:   LOAD [10]      ;
      lod   10
+
0002:    ADD 1         ;
add-c 1
+
0004:   STORE [10]      ;
sto   10
+
0006:   JUMP 0          ;
jmp   1
+
0010:    55            ;
 
 
  
@10
 
    55
 
    55
 
 
</pre></code>
 
</pre></code>
  
* Run the program.  Study it.
+
* Make sure Run the program.  Make sure your speed is set to '''Slow'''.  Study the various memory locations.  In particular Address 10.
* Modify it so that as the program runs, the contents of Address 10 increases by 1 every step through the loop, and  the contents of Address 11 decreases by one through the loop.   In other words, when the program starts, Locations 10 and 11 contain 55.  Then, a few cycles later, Location 10 becomes 56 and Location 11 54.  Then a few cycles later,  57, and  53, etc.
+
* Observe that your program '''never''' stops running.  It '''loops''' forever.  We call such a program an '''endless loop'''.
 
+
* Stop your program, and modify it so that the contents of Address 10 increases by 5 every step through the loop.  
 +
<br />
 +
<br />
  
 
{| style="width:100%; background: moccasin"
 
{| style="width:100%; background: moccasin"
 
|-
 
|-
 
|
 
|
 
+
<br />
 
== Mini Challenge of the Day ==
 
== Mini Challenge of the Day ==
 
|}
 
|}
 
[[Image:QuestionMark3.jpg|right|120px]]
 
[[Image:QuestionMark3.jpg|right|120px]]
  
Write a program that contains 4 variables starting at Address 10.  The first 3 are initialized with 10, 20, and 30.  The last one  contains 0.  Let's call the Location 10 '''var1''', Location 11 '''var2''', Location 12 '''var3''', and Location 13 '''sum'''.
+
Try this program out:
 
+
<code><pre>
Your program should computes  3 * var1 + 2 * var2 + var3 and store the result into the variable sum.  In our case, your program will compute 3*10+ 2*20+ 30 = 100 which it will store in '''sum'''.
+
0000:    LOAD [10]
 
+
0002:    ADD [11] 
 
+
0004:    STORE [12]
''Hints'':  If you look closely at the set of instructions for our processor, there is no multiplication instruction...  So your solution has to use another method for computing the value of  3 * '''var1'''...
+
0006:    HALT 
 +
0010:    3
 +
0011:    5
 +
0012:    0
 +
</pre></code>
 +
* Run it
 +
* See what happens with Location 12.   
 +
* Do you see the relationship between the first 3 instructions?  One could translate them in English as follows: "''load the number stored in 10, add it to the number stored in 11, store the result in Location 12.''"  In other words, the program computes ''Location12'' = ''Location10'' + ''Location11'', if we give explicit names to the different memory locations.
 +
* The challenge for you is to use this program as inspiration and write a new program that will compute the following: ''Location20'' = ''Location20'' x 2  + ''Location21''.  Make sure you initialize Locations 20 and 21 with numbers  other than 0.
 +
* ''Hints:'' You do not have to use the multiply operation!
  
  
Line 164: Line 203:
 
<code><pre>
 
<code><pre>
 
; Solution for Problem 1
 
; Solution for Problem 1
; D. Thiebaut
+
  LOAD 22        ; load 22 into the accumulator
start: lod-c 23
+
  STORE [10]      ;
sto 10
+
  STORE [11]      ;
sto 11
+
  STORE [12]      ;
sto 12
+
  HALT            ;
hlt
+
 
  
@10
 
0
 
0
 
0
 
  
 
</pre></code>
 
</pre></code>
Line 181: Line 216:
 
<code><pre>
 
<code><pre>
 
; Solution for Problem 2
 
; Solution for Problem 2
; D. Thiebaut
+
    LOAD 9          ; load 22 into the accumulator
start: lod 10
+
    STORE [20]      ;
sto 11
+
    LOAD 19        ;
sto 12
+
    STORE [21]      ;
sto 13
+
    LOAD 13         ;
hlt
+
    STORE [22]      ;
 
+
    HALT            ;
@10
 
55
 
0
 
0
 
0
 
  
 
</pre></code>
 
</pre></code>
Line 199: Line 229:
 
<code><pre>
 
<code><pre>
 
; Solution for Problem 3
 
; Solution for Problem 3
; D. Thiebaut
+
0000:    LOAD [10]      ;
start: lod   10
+
0002:    STORE [11]      ;
add-c 1
+
0004:    STORE [12]      ;
sto    10
+
0006:    STORE [13]      ;
lod 11
+
0008:    HALT            ;
inc
+
0010:    55            ;
sto 11
 
lod 12
 
add-c 1
 
sto 12
 
hlt
 
  
@10
 
55
 
66
 
3
 
 
</pre></code>
 
</pre></code>
  
 
<font size="+1">P4</font><br />
 
<font size="+1">P4</font><br />
 +
 +
;Part 1
  
 
<code><pre>
 
<code><pre>
start: lod    10
+
LOAD [8]        ;
add-c    2
+
ADD 2         ;
sto    10
+
STORE [8]        ;
        lod   11
+
HALT            ;
        add-c    2
+
8:   55            ;
        sto    11
+
</pre></code>
        lod    12
+
 
        add-c    2
+
;Part 2
        sto    12
 
hlt
 
  
@10
+
<code><pre>
55
+
0000:    LOAD [20]      ;
66
+
0002:    ADD 2          ;
3
+
0004:    STORE [20]      ;
 +
0006:    LOAD [21]      ;
 +
0008:    ADD 2          ;
 +
0010:    STORE [21]      ;
 +
0012:    HALT            ;
 +
0020:    55           ;
 +
0021:    13            ;
 
</pre></code>
 
</pre></code>
  
Line 240: Line 267:
 
<code><pre>
 
<code><pre>
 
; Solution for Problem 5
 
; Solution for Problem 5
; D. Thiebaut
+
0000:    LOAD [10]      ;
; First initialize both variables with 55
+
0002:    ADD 5          ;
 +
0004:    STORE [10]      ;
 +
0006:    JUMP 0          ;
 +
0010:    55           ;
 +
</pre></code>
 +
<br />
  
start: lod-c  55
+
<font size="+1">Challenge </font><br />
sto 15
+
<code><pre>
sto 16
+
; Solution for Challenge
 
 
; now loop and increment var1 and decrement var2
 
; the loop is endless.
 
 
 
loop: lod    15
 
    add-c 1
 
sto    15
 
lod 16
 
dec
 
sto 16
 
jmp loop
 
hlt
 
 
 
@15
 
0
 
0
 
  
 +
0000:    LOAD [10]      ;
 +
0002:    ADD [10]      ;
 +
0004:    ADD [11]      ;
 +
0006:    STORE [12]      ;
 +
0008:    HALT            ;
 +
0009:    HALT            ;
 +
0010:    3            ;
 +
0011:    5            ;
 +
0012:    0            ;
 
</pre></code>
 
</pre></code>
 +
<br />
  
<br />
 
 
<br />
 
<br />
 
<br />
 
<br />

Latest revision as of 14:05, 30 August 2014

--D. Thiebaut (talk) 21:48, 24 August 2014 (EDT)


This lab deals with assembly language and the Simple Computer Simulator (SCS). Work on this lab with a partner. It's easier to figure out some of these questions with another person. This lab uses numbers instead of variables when referring to memory.



There is an older version of this lab here.





The Simple Computer Simulator (SCS)


As you progress through the lab you will need some more information about the various instructions our SCS supports. These instructions are documented in this page.

Start



SimpleComputerSimulator.png


Writing the Program

  • Click on the Program tab at the top of the simulator widget to open up the edit window.
  • Highlight the default program that appears in the window and delete it.
  • In the newly erased edit-window, enter this simple program:
LOAD 1
STORE [8]
HALT

You will notice that as you press the ENTER key after each line, the instruction is reformatted and a semicolon appended at the end. This is the normal of an instruction in assembly language. The number on the left is the next logical address where the instruction will be stored. The semicolon is a special marker that allows you to write a comment to give additional information about what you are trying to do. For example, we could have typed:

LOAD 1  ; load 1 into the accumulator
STORE [8]; store the accumulator at Address 8
HALT ; stop the program

After you press the ENTER key after the last line, you should get this listing in the edit-window (with or without comments, depending on whether you added them to your code):

0000:    LOAD 1          ;
0002:    STORE [8]        ;
0004:    HALT            ;

Your program has been partly assembled. This is the term used to describe the translation that takes place when a collection of instructions gets transformed into numbers that will go into the memory of the computer. Here the numbers on the left of the colon represent the address in memory where each instruction will be saved.

Loading the Program into RAM


  • Click on the Computer tab.
  • Observe that all the instructions are there, written in purple, but that the actual contents of the memory are numbers. Each instruction is coded as a number, and each number is stored at an address in memory. The first instruction is always stored at Address 0. The first instruction of the program is LOAD 1, and LOAD is coded, as 4, stored at Address 0, and 1 is coded as... just 1, stored at the next address, i.e. Address 1. The STORE instruction is stored at Address 2, and its argument, 8, at Address 3. The final instruction, HALT is stored at Address 4.


Execute the Progam


Single Stepping


  • Click on the button that says "Reset" to make sure the processor will execute the program starting at 0
  • Click on the Step button and observe that the number 1 is going into the AC accumulator register and then into memory, at Address 8.


Running the program


  • If you want to run the program full speed rather that executing it a step at a time, the procedure is slightly different.
  • Click on Reset
  • Change the contents of the AC register by entering some random number in the AC box, say 33.
  • Click Run instead of Cycle. This runs the program.
  • Observe that 33 is overwritten by 1, and then stored at Address 8.


You now know the basics of programming in assembly language.


Problem 1


  • Using the steps you have just gone through, write a program that initializes 3 memory locations at 10, 11, and 12 with the value 22. You should end up with the number 23 in three different memory locations.


If you get a message of the form:

***address already in use ***0002: STORE [9]  ;

it means that you are attempting to put the instruction STORE [9] at Address 2, but this memory location is already used by another instruction. Simply remove the 0002: part of your line and you will be fine.


Problem 2


  • This problem is very similar to the previous problem, but instead of storing the same value in all three variables, store the numbers 9, 19, 13 at Addresses 20, 21, and 22, respectively.


Problem 3


  • Try this program out:
0:     LOAD   [10]
	STORE  [11]
	HALT
10: 55
11: 0

  • Run it.
  • Observe that when your program has finished running, it will have copied the number 55 from Location 10 to Location 11. Note that this is a copy of operation, and you end up with two locations containing 55.
  • Modify your program so that it copies the 55 from Address 10 to the locations at Addresses 11, 12, and 13.
  • Verify that your program works
  • Put a different number at Address 10, and run your program again. Verify that this number is copied 3 times by your program to the three locations, at Addresses 11, 12, and 13.


Problem 4


  • Try this program out:
LOAD [8]        ;
ADD 1          ;
STORE [8]        ;
HALT            ;
8:    55            ;
  • Run the program
  • What does it do? Pay close attention to the number stored at Address 8 in memory. What is the result of the computation?
  • Once you've figured it out, modify the program slightly so that Address 8 originally starts with the value 55 in it, and then ends with the value 57.
  • Play with your program some more and verify that your program will add 2 to the variable at Address 8, whatever its original value.
  • Once your programs works, modify it some more so that now it adds 2 to the contents of two memory locations, one at Address 20, and one at Address 21.


Problem 5


  • Try this new program out:
0000:    LOAD [10]       ;
0002:    ADD 1          ;
0004:    STORE [10]       ;
0006:    JUMP 0          ;
0010:    55            ;

  • Make sure Run the program. Make sure your speed is set to Slow. Study the various memory locations. In particular Address 10.
  • Observe that your program never stops running. It loops forever. We call such a program an endless loop.
  • Stop your program, and modify it so that the contents of Address 10 increases by 5 every step through the loop.




Mini Challenge of the Day

QuestionMark3.jpg

Try this program out:

0000:    LOAD [10] 
0002:    ADD [11]  
0004:    STORE [12]
0006:    HALT   
0010:    3 
0011:    5
0012:    0
  • Run it
  • See what happens with Location 12.
  • Do you see the relationship between the first 3 instructions? One could translate them in English as follows: "load the number stored in 10, add it to the number stored in 11, store the result in Location 12." In other words, the program computes Location12 = Location10 + Location11, if we give explicit names to the different memory locations.
  • The challenge for you is to use this program as inspiration and write a new program that will compute the following: Location20 = Location20 x 2 + Location21. Make sure you initialize Locations 20 and 21 with numbers other than 0.
  • Hints: You do not have to use the multiply operation!








THE END!





































Solutions


P1

; Solution for Problem 1
  LOAD 22         ; load 22 into the accumulator
  STORE [10]       ;
  STORE [11]       ;
  STORE [12]       ;
  HALT            ;



P2

; Solution for Problem 2
    LOAD 9          ; load 22 into the accumulator
    STORE [20]       ;
    LOAD 19         ;
    STORE [21]       ;
    LOAD 13         ;
    STORE [22]       ;
    HALT            ;

P3

; Solution for Problem 3
0000:    LOAD [10]       ;
0002:    STORE [11]       ;
0004:    STORE [12]       ;
0006:    STORE [13]       ;
0008:    HALT            ;
0010:    55            ;

P4

Part 1
LOAD [8]        ;
ADD 2          ;
STORE [8]        ;
HALT            ;
8:    55            ;
Part 2
0000:    LOAD [20]       ;
0002:    ADD 2          ;
0004:    STORE [20]       ;
0006:    LOAD [21]       ;
0008:    ADD 2          ;
0010:    STORE [21]       ;
0012:    HALT            ;
0020:    55            ;
0021:    13            ;

P5

; Solution for Problem 5
0000:    LOAD [10]       ;
0002:    ADD 5          ;
0004:    STORE [10]       ;
0006:    JUMP 0          ;
0010:    55            ;


Challenge

; Solution for Challenge

0000:    LOAD [10]       ;
0002:    ADD [10]       ;
0004:    ADD [11]       ;
0006:    STORE [12]       ;
0008:    HALT            ;
0009:    HALT            ;
0010:    3            ;
0011:    5            ;
0012:    0            ;