--- tags: computer-arch --- # Quiz 2 of Computer Architecture (2024 Fall) :::info :information_source: General Information * You are allowed to read **[lecture materials](https://wiki.csie.ncku.edu.tw/arch/schedule)** and run RISC-V code inside the [Ripes simulator](https://github.com/mortbopet/Ripes). > That is, an open book exam. * We are using the honor system during this quiz, and would like you to accept the following: 1. You will not share the quiz with anyone. 2. You will not discuss the material on the quiz with anyone until after solutions are released. * Download the PDF document at the bottom of this page, which contains the problem set for Quiz 2. You will be prompted to enter a password. Ensure that you have read the notice at the end of this page. * Each answer has 4 points. * You must answer in valid numeric representation and/or English alphabet except your formal name. * Always provide your answer in the shortest form. For example, use `ptr->member` instead of `(*ptr).member`. * Assume that each C program already includes the headers `<stdint.h>`, `<stdbool.h>`, `<stddef.h>`, `<stdlib.h>`, and `<stdio.h>`. * The C standard referenced in this quiz is C99, officially known as ISO/IEC 9899:2018. * Message **[the instructor via Facebook](https://www.facebook.com/JservFans)** if you found something wrong. * :timer_clock: 10:30 ~ 11:59AM on Oct 1, 2024 * Submit via [Google Form](https://docs.google.com/forms/d/e/1FAIpQLSdZuV4FOUZlr-C56VJzFoVHzJl0-UGKuyqfeK2IXLblqOqfIg/viewform). ::: **[Problem set for Quiz 2](https://drive.google.com/file/d/1vxYn88mm0P5A3Pq4X8PT4B-DK2Szq5uS/view?usp=sharing)** $\to$ The password for the PDF document is the answer to the question below. Imagine you are playing the [Bulls and Cows](https://en.wikipedia.org/wiki/Bulls_and_cows) game, where "A" indicates a digit is in the correct position and "B" signifies a digit is present but in the wrong position. For example, if your secret number is `4545` and your opponent guesses `5122`, the response would be `0A1B`. This means that no digits are correctly placed and one digit is correct but misplaced. Then, we can construct a hexadecimal integer literal based on the answer, `0x0A1B`. As you continue playing the Bulls and Cows game, **pay close attention to the secret number provided by the instructor**. For example, if your opponent guesses 1224, you should retain the hexadecimal integer literal derived from a response of `?A?B`. In the context of RISC-V assembly, assume that register x10 holds the value constructed from the Bulls and Cows game, which includes the secret number provided by the instructor and the opponent's guess of `1224`. What will be the value in register x12 after executing the following instructions? ```c slli x12, x10, 0x12 srli x12, x12, 0x6 and x12, x12, x10 ``` Enter the password in all lowercase when inputting it into the PDF document. The value must be represented as a hexadecimal integer literal, starting with `0x` and always in its shortest form. That is, use `0x42` rather than `0x0042`. > Hint: The password is 6 characters long. ## Errata For clarity, the C program referenced in Problem C is reproduced below: ```c static void print_move(int disk, char from, char to) { printf("Move Disk %d from '%c' to '%c'\n", disk, from, to); } int main() { int n_disks = 3; /* Number of disks */ int total_moves = (1 << n_disks) - 1; const char pegs[3] = {'A', 'B', 'C'}; /* Peg labels */ int pos[n_disks]; /* Disk positions: 0-A, 1-B, 2-C */ /* Initialize all disks to peg A */ for (int i = 0; i < n_disks; i++) pos[i] = 0; /* Set direction based on parity of number of disks */ int direction = (n_disks & 1) ? -1 /* counter-clockwise */ : 1; /* clockwise */ /* Predefined packed mapping arrays */ const uint8_t peg_map[3] = { #C01, /* Peg A: {CCW -> C (2), CW -> B (1)} */ #C02, /* Peg B: {CCW -> A (0), CW -> C (2)} */ #C03 /* Peg C: {CCW -> B (1), CW -> A (0)} */ }; /* Calculate direction index: -1 -> 0 (CCW), 1 ->1 (CW) */ int direction_index = (direction + 1) / 2; for (int n_moves = 1; n_moves <= total_moves; n_moves++) { int curr_gray = n_moves ^ (n_moves >> 1); int prev_gray = (n_moves - 1) ^ ((n_moves - 1) >> 1); int changed_bit = curr_gray ^ prev_gray; /* Identify the disk to move (0-indexed) */ int disk = __builtin_popcount(#C04); /* Current peg of the disk */ int curr_peg = pos[disk]; int new_peg; if (disk == 0) { /* Calculate shift: direction_index=0 (CCW) -> shift2, * direction_index=1 (CW) -> shift0 */ int shift = (1 - direction_index) << 1; new_peg = (peg_map[curr_peg] >> shift) & C05; } else { bool found_new_peg = false; for (int p = 0; p < 3 && !found_new_peg; p++) { if (p == curr_peg) continue; bool has_smaller = false; for (int d = 0; d < disk; d++) { if (pos[d] == p) { has_smaller = true; break; } } if (!has_smaller) { new_peg = p; found_new_peg = true; } } } print_move(disk + 1, pegs[curr_peg], pegs[new_peg]); pos[disk] = new_peg; } return 0; } ```