In this week we continue what we started last week, namely to familiarise ourselves with RISC-V assembly.

Task 1. Here are some suggestions for writing programs in the RISC-V assembler language.

  • Cryptography often works by XORing a stream of data with a stream of keys. Assume that the plaintext is at memory region A, and a key (of the same length as the plaintext) is at memory region B. Assume the beginning of the plaintext data (i.e. memory region A) is held in register a0, the length of the data (i.e. plaintext and password) is in register a1 the beginning of the key is in register a2. Write a RISC-V program that creates a stream of data encrypted data at memory region C, where the i-th word of the encrypted data is the XOR of the i-th word of the key with the i-th word of the data. The results (i.e. ciphertext) should be stored in a memory region starting at the address stored in register a3. If you are interested in the cryptographic background of this (not relevant for the course), it might be interesting to learn about the one-time pad and Counter Mode.
  • Write a program that exchanges the content of registers a0 and a1. Can you do this without using a third, temporary register?
  • Write a program that prints out the content of register a0.
  • Write a program that prints out the content of all RISC-V registers.
  • Think of an interesting short program and write it in RISC-V.

Task 2 . Set up the simulator you are using such that you can call it with an a file as argument, and prints out the content of the accumulator a0 upon termination of the input RISC-V code.

Task 3. Here are two little compiled programs. They were compiled using the code generator we discussed in the last few lectures Reverse engineer the programs, i.e. work out the original source programs. The first program is quite similar to the sumto program we analysed in the lecture, the second one is quite well known.

I recommend to look for jump-and-link commands jal because they correspond to recursive calls. Try and see where the activation records are constructed and torn down, that tells you how many arguments the procedure takes, and what kind of arguments are supplied. Where is something pushed on the stack, and what? Where/what is popped off?