CS520
Spring 2018
Program 3
Due 12noon, Wednesday March 7


Note that the midterm will be on March 7, the same day that this assignment is due, so you should make every possible effort to complete this assignment early.

Write a disassembler for the RISC-V machine language.

The RISC-V machine code will be in a 64-bit, little-endian ELF file.

Your disassembler only needs to handle the RISC-V RV-32I base instruction set. The RDCYCLEH, RDTIMEH and RDINSTRETH instructions are not used in 64-bit mode, so your disassembler does not need to handle them. You also do not need to handle the W instructions (ADDIW, SLLIW, SRLIW, etc.), which are RV64I-only instructions.

Your program should take a single command-line argument, the name of the ELF file to be disassembled. It should write its output to stdout.

Each instruction should be displayed on its own line, with no leading spaces. Each instruction should be displayed using the exact format used on the one-page RISC-V RV-32I document linked above, with one exception: print the opcode in lowercase. (The format to be followed is listed on the far right-hand side of the one-page document.) Note that there is a single space separating the opcode from the operands, and there are no spaces following the commas separating the operands. Also, please do not print any blank lines, any header lines, or anything else. We plan to use automated output file checking (the diff or cmp commands), so be sure to follow this specification exactly. And please raise questions if you do not think these directions are specific enough.

The immediate constant values should be displayed in decimal, and the value displayed should be the value intended, not the value of the bits in the immediate constant field. For example, the immediate constant value in the SB-type instructions is shifted left 1 position (multiplied by 2) to get its intended value. Immediate constants are signed values.

Register numbers should be displayed in decimal with a lowercase "x" prepended.

The shamt (shift amount) field should be displayed in decimal and is unsigned. (Be sure you understand that in 64-bit mode, the shamt field is 6 bits, extending across bits 20-25.)

If your program encounters an instruction it cannot handle then it should print "unknown" on its output line and go on to the next instruction. You should make your program robust so that it can handle errors such as:

You do not need to error check the "pred" or "succ" fields of the FENCE instruction.

Put your source code in a single file called "disRISCV.c".

In the ~cs520/public/prog3 directory there are ELF files containing RISC-V machine code. This directory also contains some "dump" files that contain the expected output for the corresponding ELF files, as well as the assembly language files used to create the ELF files. (Note that the disassembler will not re-create the assembly language exactly.)

The RISC-V assembler is available on agate as ~cs520/bin/asRISCV. Run it with the "--help" flag to learn more about using it. Basically you need to give it a file to be assembled, which should use the ".s" extension, and you should use the "-o" flag to set the output file name.

Your program will be graded primarily by testing it for correct functionality:

Leave the Lab 5 and Lab 6 output to stderr on for your Program 3 submission. But be sure that this output goes to stderr and that the disassembled instruction output goes to stdout.

In addition, remember, you may lose points if your program is not properly structured or adequately documented. Coding guidelines are given on the course overview webpage. I also want to see that you applied the principles of problem decomposition, incremental development and incremental testing. Leave your debugging output in your code, but disabled, when you do your final assignment submission.

Your programs will be graded using agate.cs.unh.edu so be sure to test in that environment. Your programs will be compiled using these gcc flags: -g -Wall -std=c99.

Your programs should be submitted for grading from agate.cs.unh.edu. To turn in this assignment, type:
~cs520/bin/submit prog3 disRISCV.c

Submissions can be checked by typing:
~cs520/bin/scheck prog3

This assignment is due at 12noon on Wednesday March 7. The standard late policy concerning late submissions will be in effect. See the course overview webpage.

Remember: as always you are expected to do your own work on this assignment. Copying code from another student or from sites on the internet is explicitly forbidden!


Last modified on February 27, 2018.

Comments and questions should be directed to pjh@cs.unh.edu