spo600:64_bit_assembly_language_lab
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
spo600:64_bit_assembly_language_lab [2024/02/02 15:07] – created chris | spo600:64_bit_assembly_language_lab [2024/04/16 18:10] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | # |
- | + | ||
- | In this lab, you will experiment with assembler on the x86_64 and aarch64 platforms. | + | |
- | + | ||
- | Perform this lab on [[SPO600 Servers]] (you may use your own systems if they are of the right architecture and appropriately configured). | + | |
- | + | ||
- | ===== Lab 3 ===== | + | |
- | + | ||
- | ==== Code Examples | + | |
- | + | ||
- | The code examples for this lab are available in the file ''/ | + | |
- | + | ||
- | Unpacking the archive in your home directory will produce the following directory structure: | + | |
- | + | ||
- | < | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | Throughout this lab, take advantage of //[[make and Makefiles|make]]// | + | |
- | + | ||
- | ==== Resources | + | |
- | * [[Assembler Basics]] (includes instructions on how to use the GNU Assembler) | + | |
- | * [[Syscalls]] | + | |
- | * [[x86_64 Register and Instruction Quick Start]] | + | |
- | * [[aarch64 Register and Instruction Quick Start]] | + | |
- | + | ||
- | ==== Optional Investigation | + | |
- | + | ||
- | 1. Build and run the three C versions of the program for x86_64 and aarch64, using '' | + | |
- | + | ||
- | 2. Use the '' | + | |
- | + | ||
- | 3. Review, build, and run the x86_64 assembly language programs using '' | + | |
- | + | ||
- | 4. Build and run the assembly language version of the program for aarch64 using '' | + | |
- | + | ||
- | ==== Lab Tasks ==== | + | |
- | + | ||
- | **Note:** The answers to the first three steps below were given during the lecture. | + | |
- | + | ||
- | 1. Review, build, and run the aarch64 assembly language programs. Take a look at the code using '' | + | |
- | + | ||
- | 2. Here is a basic loop in AArch64 assembler - this loops from 0 to 9, using r19 as the index (loop control) counter: | + | |
- | + | ||
- | < | + | |
- | | + | |
- | | + | |
- | min = 0 /* starting value for the loop index; **note that this is a symbol (constant)**, | + | |
- | max = 10 /* loop exits when the index hits this number (loop condition is i<max) */ | + | |
- | | + | |
- | | + | |
- | | + | |
- | /* **... body of the loop ... do something useful here ...** */ | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | This code doesn' | + | |
- | + | ||
- | < | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | Then modify the message so that it includes the loop index values, showing each digit from 0 to 9 like this: | + | |
- | + | ||
- | < | + | |
- | Loop: 0 | + | |
- | Loop: 1 | + | |
- | Loop: 2 | + | |
- | Loop: 3 | + | |
- | Loop: 4 | + | |
- | Loop: 5 | + | |
- | Loop: 6 | + | |
- | Loop: 7 | + | |
- | Loop: 8 | + | |
- | Loop: 9</ | + | |
- | + | ||
- | Character conversion: In order to print the loop index value, you will need to convert from an integer to digit character. In ASCII/ | + | |
- | + | ||
- | For reference, here is a [[6502 Counting Loop Example|6502 implementation of this loop]]. | + | |
- | + | ||
- | 3. Repeat the previous step for x86_64. | + | |
- | + | ||
- | For reference, here is the loop code in x86_64 assembler: | + | |
- | + | ||
- | < | + | |
- | | + | |
- | | + | |
- | min = 0 /* starting value for the loop index; **note that this is a symbol (constant)**, | + | |
- | max = 10 /* loop exits when the index hits this number (loop condition is i<max) */ | + | |
- | | + | |
- | | + | |
- | | + | |
- | /* **... body of the loop ... do something useful here ...** */ | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | 4. Extend the AArch64 code to loop from 00-30, printing each value as a 2-digit decimal number. | + | |
- | + | ||
- | 2-Digit Conversion Tip: You will need to take the loop index and convert it to a 2-digit decimal number by dividing by 10. Read the description of the division instruction carefully. On x86_64, you need to set up specific registers before performing a division. On AArch64, you will need to use a second instruction to find the remainder after a division. | + | |
- | + | ||
- | 5. Change the code as needed to suppress the leading zero (printing 0-30 instead of 00-30). | + | |
- | + | ||
- | 5. Repeat the previous two steps for x86_64. | + | |
- | + | ||
- | ==== Deliverables | + | |
- | + | ||
- | 1. Complete the lab section, above. | + | |
- | + | ||
- | 2. Blog about the programs you've written. Describe the experience of writing and debugging in assembler, as compared to writing in other languages. Contrast x86_64 and aarch64 assembler, your experience with each, and your opinions of each. Include links to the source code for each of your assembler programs. | + | |
- | + | ||
- | ==== Optional Challenge | + | |
- | + | ||
- | Write a program in aarch64 assembly language to print the times tables from 1-12 ("1 x 1 = 1" through "12 x 12 = 144"). Add a spacer between each table, and use a function/ | + | |
- | + | ||
- | The output could look something like this: | + | |
- | + | ||
- | < | + | |
- | 1 x 1 = 1 | + | |
- | 2 x 1 = 2 | + | |
- | 3 x 1 = 3 | + | |
- | 4 x 1 = 4 | + | |
- | 5 x 1 = 5 | + | |
- | 6 x 1 = 6 | + | |
- | 7 x 1 = 7 | + | |
- | 8 x 1 = 8 | + | |
- | 9 x 1 = 9 | + | |
- | 10 x 1 = 10 | + | |
- | 11 x 1 = 11 | + | |
- | 12 x 1 = 12 | + | |
- | | + | |
- | 1 x 2 = 2 | + | |
- | 2 x 2 = 4 | + | |
- | 3 x 2 = 6 | + | |
- | 4 x 2 = 8 | + | |
- | 5 x 2 = 10 | + | |
- | ** //...lines snipped for space...// ** | + | |
- | 11 x 12 = 132 | + | |
- | | + | |
- | 1 x 12 = 12 | + | |
- | 2 x 12 = 24 | + | |
- | 3 x 12 = 36 | + | |
- | 4 x 12 = 48 | + | |
- | 5 x 12 = 60 | + | |
- | 6 x 12 = 72 | + | |
- | 7 x 12 = 84 | + | |
- | 8 x 12 = 96 | + | |
- | 9 x 12 = 108 | + | |
- | 10 x 12 = 120 | + | |
- | 11 x 12 = 132 | + | |
- | 12 x 12 = 144</ | + |
spo600/64_bit_assembly_language_lab.1706886454.txt.gz · Last modified: 2024/04/16 18:10 (external edit)