代写assembly | lab作业 | mips – Lab 5: Subroutines

Lab 5: Subroutines

代写assembly | lab作业 | mips – 这是一个关于assembly的题目, 主要考察了关于assembly的内容,是一个比较经典的题目, 是比较典型的assembly/mips等代写方向, 该题目是值得借鉴的lab代写的题目

assembly代写 汇编代写 代写assembly

Due 15 March 2019 11:59 PM

Minimum Submission Requirements

 Your Lab5 folder must contain the following files (note the capitalization
convention):
 Lab5.asm
 Diagram.pdf
 README.txt
 Commit and Push your repository

lab Objective

In this lab, you will learn how to implement subroutines and manage data on the stack.

Lab Preparation

Read chapters 5, 6, 8.1, and 8.2 from Introduction To mips assembly Language Programming.

Description

This program will allow the user to encrypt or decrypt strings using a Caesar Cipher. In order to generate the Caesar Cipher shift value, the user will also enter a key. The program will calculate the checksum of the key, and use that checksum to shift each letter in the string that should encrypted/decrypted. Then, the encrypted and decrypted strings are displayed to the user.

Caesar Cipher

The Caesar Cipher is a simple encryption method in which every letter in the string to be encrypted is shifted some amount to the right or left in the alphabet. For example, if you are using a right shift of 2, and the string you want to encrypt is ABC XYZ, then the encrypted version of that string would be CDE ZAB. Each letter in the original string was shifted two letters to the right, and letters at the end of the alphabet were looped back around to the beginning of the alphabet. For more information about Caesar ciphers, check out the Wikipedia article: https://en.wikipedia.org/wiki/Caesar_cipher

Specification

User Input

The strings that will be given to the user as prompts are contained in the .data segment defined in the Lab5Main.asm file. The addresses of these strings will be part of the arguments to your subroutines. Your code will be responsible for saving the user input in allocated memory. Lab 5 Page 1 of 7 Winter 2019

Allocating Memory (Arrays)

You will need to allocate three chunks of memory (arrays) in the .data section for the user input string to be encrypted or decrypted and resulting string as well as the user input key. These should be able to store a max of 100 characters. You will also need to reserve a byte of memory to keep track of the users choice of E, D, or X.

Checksums

You will be calculating a checksum from the key string given by the user. The checksum is a single value which will be used as the shift value for the Caesar Cipher. In order to calculate the checksum, you will take the users key string, and xor each byte together. For example, if the user inputs test as their key string, you will calculate the checksum as follows: checksum = (t e s t) mod 26 = (0x74 0x65 0x73 0x74 0x0A) % 26 The above example results in a checksum of 22. Therefore, if the user inputs test as the key, you should use a Caesar Cipher right shift of 22 to encrypt the string. Read more about checksums here: https://en.wikipedia.org/wiki/Checksum#Parity_byte_or_parity_word

The Stack

In this lab, you will use the program stack to handle the preservation of certain register values at the start of a subroutine so that they can be restored at the end of a subroutine. The most notable use of this will be preserving the jump and link return address, $ra, so you can navigate out of nested subroutines. In addition, the values in registers $s0 – $s7 must be preserved across subroutine calls.

Subroutines

Lab5.asm will contain the subroutines to display and encrypt or decrypt the string. You must implement all of the subroutines listed, and you may create more of your own subroutines. If you plan on using any of the saved registers, $s0 – $s7, you must save these registers appropriately on the stack (push at the beginning of your subroutine, then pop at the end of the subroutine).

Nested Subroutines

Three of the following subroutines will be called from within another subroutine.

Specifically, compute_checksum , encrypt , and decrypt will be called from inside of
cipher , and check_ascii will be called from inside encrypt and decrypt . In order to

properly execute these nested subroutines, you must use the stack to handle the return address register, $ra. Lab 5 Page 2 of 7 Winter 2019

Subroutines
#——————————————————————–

give_prompt

This function should print the string in $a0 to the user, store the users input in

an array, and return the address of that array in $v0. Use the prompt number in $a

to determine which array to store the users input in. Include error checking for

the first prompt to see if user input E, D, or X if not print error message and ask

again.

arguments: $a0 – address of string prompt to be printed to user

$a1 – prompt number (0, 1, or 2)

note: prompt 0: Do you want to (E)ncrypt, (D)ecrypt, or e(X)it?

prompt 1: What is the key?

prompt 2: What is the string?

return: $v0 – address of the user input string

#——————————————————————– #——————————————————————–

cipher

Calls compute_checksum and encrypt or decrypt depending on if the user input E or

D. The numerical key from compute_checksum is passed into either encrypt or decrypt

note: this should call compute_checksum and then either encrypt or decrypt

arguments: $a0 – address of E or D character

$a1 – address of key string

$a2 – address of user input string

return: $v0 – address of resulting encrypted/decrypted string

#——————————————————————– #——————————————————————–

compute_checksum

Computes the checksum by xoring each character in the key together. Then,

use mod 26 in order to return a value between 0 and 25.

arguments: $a0 – address of key string

return: $v0 – numerical checksum result (value should be between 0 – 25)

#——————————————————————– Lab 5 Page 3 of 7 Winter 2019

#——————————————————————–

encrypt

Uses a Caesar cipher to encrypt a character using the key returned from

compute_checksum. This function should call check_ascii.

arguments: $a0 – character to encrypt

$a1 – checksum result

return: $v0 – encrypted character

#——————————————————————– #——————————————————————–

decrypt

Uses a Caesar cipher to decrypt a character using the key returned from

compute_checksum. This function should call check_ascii.

arguments: $a0 – character to decrypt

$a1 – checksum result

return: $v0 – decrypted character

#——————————————————————– #——————————————————————–

check_ascii

This checks if a character is an uppercase letter, lowercase letter, or

not a letter at all. Returns 0, 1, or -1 for each case, respectively.

arguments: $a0 – character to check

return: $v0 – 0 if uppercase, 1 if lowercase, -1 if not letter

#——————————————————————– #——————————————————————–

print_strings

Determines if user input is the encrypted or decrypted string in order

to print accordingly. Prints encrypted string and decrypted string. See

example output for more detail.

arguments: $a0 – address of user input string to be printed

$a1 – address of resulting encrypted/decrypted string to be printed

$a2 – address of E or D character

return: prints to console

#——————————————————————– Lab 5 Page 4 of 7 Winter 2019

Extra Credit

As extra credit, add a subroutine to print the decrypted string using a rail fence cipher with 3 rails, and the corresponding ciphertext. Call your new rail_fence subroutine from print_strings. The rail fence cipher should ignore punctuation and spacing. See this Wikipedia page for an example https://en.wikipedia.org/wiki/Rail_fence_cipher#Method

Testing

Your program must work properly with the main program provided (on Canvas) Lab5Main.asm.

Output

An example of the expected output is shown below. In this example, the user first encrypts the string Hello World! using the key cmpe12. Then, the user decrypts the string Fcjjm Umpjb! using the same key cmpe12 in order to get back the original string, Hello World!. As shown below, capital letters should remain capitalized when encrypted or decrypted, and non-letter characters should not be encrypted/decrypted. Sample Output Welcome to the Caesar Cipher program! Do you want to (E)ncrypt, (D)ecrypt, or e(X)it? E What is the key? cmpe What is the string? Hello World! Here is the encrypted and decrypted string Fcjjm Umpjb! Hello World! Do you want to (E)ncrypt, (D)ecrypt, or e(X)it? D What is the key? cmpe What is the string? Fcjjm Umpjb! Here is the encrypted and decrypted string Fcjjm Umpjb! Hello World! Do you want to (E)ncrypt, (D)ecrypt, or e(X)it? g Invalid input: Please input E, D, or X. Do you want to (E)ncrypt, (D)ecrypt, or e(X)it? X Goodbye! — program is finished running — Lab 5 Page 5 of 7 Winter 2019

Sample Output With Extra Credit Welcome to the Caesar Cipher program! Do you want to (E)ncrypt, (D)ecrypt, or e(X)it? E What is the key? cmpe What is the string? Hello World! Here is the encrypted and decrypted string Fcjjm Umpjb! Hello World! Extra Credit H… O… L.

. E. L. W. R. D .. L… O… HOLELWRDLO Do you want to (E)ncrypt, (D)ecrypt, or e(X)it? D What is the key? cmpe What is the string? Fcjjm Umpjb! Here is the encrypted and decrypted string Fcjjm Umpjb! Hello World! Extra Credit H… O… L. . E. L. W. R. D .. L… O… HOLELWRDLO Do you want to (E)ncrypt, (D)ecrypt, or e(X)it? g Invalid input: Please input E, D, or X. Do you want to (E)ncrypt, (D)ecrypt, or e(X)it? X Goodbye! — program is finished running —

Files

Diagram.pdf This file will contain a block diagram or flowchart of how the different components of your code work together. Lab5.asm This file contains your implementation of all subroutines. It must assemble on its

own. See the Code Documentation section from previous labs for instructions on proper

code formatting. Pseudocode is not required for this lab, though you may include it Lab 5 Page 6 of 7 Winter 2019

after the header comment. You must include a block comment on register usage as indicated in previous labs. README.txt This file must be a plain text (.txt) file. It should contain your first and last name (as it appears on Canvas) and your CruzID. Your CruzID is your email address before @ucsc.edu. Your answers to the questions should total at least 8 sentences with complete thoughts. Your README should adhere to the following template:


Lab 5: Subroutines CMPE 012 Winter 2019 Last Name, First Name CruzID


What was your design approach? Write the answer here. What did you learn in this lab? Write the answer here. Did you encounter any issues? Were there parts of this lab you found enjoyable? Write the answer here. How would you redesign this lab to make it better? Write the answer here. Did you collaborate with anyone on this lab? Please list who you collaborated with and the nature of your collaboration. Write the answer here. Lab 5 Page 7 of 7 Winter 2019