CS 270
|
R0/R1
and results will be returned in register(s). You may find that you do not
have enough registers to keep all of your values in registers. In this case,
you can create labels to hold them.
IMPORTANT:
The following list is the set of subroutines you must implement.
Part A:
For testing purposes, it's useful to read and understand what each
Test_
subroutine does in the reserved section. For
example, the Test_pack
subroutine loads the values of the
Value1
and Value2
labels into R0
and
R1
respectively. Then, it calls your pack
subroutine.
When your subroutine returns, it stores the value of R0
into the
Result
label. This tells you that to test your pack
subroutine, you must enter the parameters in Value1
and
Value2
, and then check the result in the Result
label.
pack(b1, b0)
- Pack (combine) the lower 8 bits of R0
and the lower 8 bits of R1
and pack them into a single
16 bit quantity in R0
. The lower 8 bits of R0
will be in the upper 8 bits of the result. Here is a visual example:
unpack(b)
- Unpack the 16 bits in R0
into
registers R0/R1
such that the upper 8 bits of R0
are stored in the lower 8 bits of R0
and the lower 8 bits
of R0
are stored in the lower 8 bits of R1
. The
rest of R0
and R1
needs to be padded with 0's.
Here is a visual example:
printCC()
- Print the word NEGATIVE, ZERO, POSITIVE
depending on the value in register R0
. At exit, register
R0
must contain the original value. Each
word is followed by a newline. Do not depend on the condition code
being set to the correct value on entry. The test of
strcmp()
uses this subroutine. Notice that we have provided you
with labels referring to the strings that you need to print (StringNEG,
StringZERO, and StringPOS). The PUTS trap can be used to print a string value
stored in memory to the LC3 console. PUTS prints the string beginning at the memory
location contained in R0.IMPORTANT: after your subroutine completes, control
must return to the corresponding Test_
subroutine in the reserved
section. For example, when your printCC
subroutine gets to the
RET
, the program needs to return to right after
JSR printCC
in the Test_printCC
subroutine. Otherwise,
it means that you are not handling R7
correctly. This applies to
both part A and part B.
Part B:
strlen(s)
- On entry R0
contains the
address of a valid (null terminated) C string. On exit, R0
contains the length. Note that the null terminator is not counted in the
length.strcpy(dest, src)
- On entry R0
contains
a pointer to the start of the destination string
(dest
), and R1
contains a pointer to the start of the
null-terminated source string (src
). On exit, the source string
has been copied to the destination string (including the null terminator)
and R0
contains a pointer to the start of the destination
string.strcat(dest, src)
- On entry R0
contains
a pointer to the start of the destination string (dest
), and R1
contains a pointer to the start of the source string (src
).
On exit, the source string has been appended to the end of the destination string
and R0
contains a pointer to the start of the destination string. For example,
if "cdf" is to be appended to "abc", the destination string becomes "abccdf" and
R0
is a pointer to the "a". The destination string must be null terminated.strcmp(s1, s2)
- On entry R0
contains
a pointer to the start of a string (s1
), and R1
contains
a pointer to the start of another string (s2
). On exit R0
contains a negative number if s1 < s2
, zero if s1 == s2
and a positive number if s1 > s2
, based on the lexicographic
ordering using ASCII values: e.g., Z is less than a. In lexicographic ordering,
we traverse the strings from left to right until the first difference is found.
The differring characters tell us which string is greater. For example, abc < abde
because the first difference is c vs. d and c < d. If we get to the end of both
strings and no difference is found, the strings are equal. Experiment with the
strcmp
C function to see what should happen when one string is the
prefix of another (for example, abc vs. abcd).
Do not assume the strings have the same length (or even that the length is
greater than 0).
Enter
key. As with any
project, incremental development will improve your efficiency.
You might first write pseudo-code in a C or Java syntax to understand the algorithum for a subroutine. If your pseudo code uses variables, you may want to use labels for these variables. Create them before the start of the subroutine (not inside the subroutine). Although using labels may make your code a little longer, it is likely that you will get correct results more quickly if you use them. When you need a value, simply load it from the memory. When you update the value, write it back to memory. This is the load/store model.
When you write the LC-3 code for a subroutine, you may find it helpful if you
add comments in each subroutine that explain how you are allocating the registers.
For example, you might write ; R4 holds the count
.
Testing/debugging each individual subroutines follows a pattern:
lc3as
.Option
to the index of the routine you wish
to test. You may want to change the .FILL
value so that
you do not need to continually reset it as you write, and debug your
subroutine.Continue
the simulator/debugger. If you have set a breakpoint,
it will stop when your program reaches that line. Use Step/Next
to watch your code execute and examine registers and memory locations for
correctness. You will want to use Next
so that you do NOT
step into traps like GETS or PUTS
. You may step
into them, but you will find them very tedious to step through.
You may want to call one subroutine from another, or add subroutines to
accomplish specific tasks. Recall that calling a subroutine from another
subroutine requires careful handling of the return address (R7
),
and that registers from the calling routine may be overwritten.
Important: After your
subroutine completes, control must return to the corresponding
Test_
subroutine in the reserved section. For example, when your
printCC
subroutine gets to the RET
, the program needs
to return to right after JSR printCC
in the Test_printCC
subroutine. Otherwise, it means that you are not handling R7
correctly.
string.asm
using the Checkin tab of the
course website.