1,885
edits
Changes
no edit summary
=== Code Examples ===
The code examples for this lab are available in the file <code>/public/spo600-assembler-lab-examples.tgz</code> on each of the [[SPO600 Servers]].
Unpacking the archive in your home directory will produce the following directory structure:
spo600
Throughout this lab, take advantage of ''[[make and Makefiles|make]]'' whenever possible.
=== 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 <code>make</code>. Take a look at the differences in the code.
2. Use the <code>objdump -d</code> command to dump (print) the object code (machine code) and disassemble it into assembler for each of the binaries. Find the <code><nowiki><main></nowiki></code> section and take a look at the code. Also notice the total amount of code.
3. Review, build, and run the x86_64 assembly language programs using <code>make</code>, taking note of the commands that are executed to assemble and link the code. Take a look at the code using <code>objdump -d '''objectfile'''</code> and compare it to the source code. Notice the absence of other code (compared to the C binary, which had a lot of extra code).
4. Build and run the assembly language version of the program for aarch64 using <code>make</code>, taking note of the commands that are executed to assemble and link the code. Verify that you can disassemble the object code in the ELF binary using <code>objdump -d ''objectfile''</code> and take a look at the code.
=== Lab Tasks ===
<!-- {{Admon/tip|ShortcutAnswers in the Video!|To save lab time '''your group can decide''' The answers to do the first three steps 1below are contained in the associated [https://web.microsoftstream.com/video/8c3c1353-2 as individual homework after the lab5729-4217-b1ba-371410f14ad4 lecture video.]}} -->
1. Review, build, and run the aarch64 assembly language programs. Take a look at the code using <code>objdump -d '''objectfile'''</code> and compare it to the source code.
min = 0 /* starting value for the loop index; '''note that this is a symbol (constant)''', not a variable */
max = 30 10 /* loop exits when the index hits this number (loop condition is i<max) */
_start:
{{Admon/tip|Character conversion|In order to print the loop index value, you will need to convert from an integer to digit character. In ASCII/ISO-8859-1/Unicode UTF-8, the digit characters are in the range 48-57 (0x30-0x39). You will also need to assemble the message to be printed for each line - you can do this by writing the digit into the message buffer before outputting it to stdout, which is probably the best approach, or you can perform a sequence of writes for the thee parts of the message ('Loop: ', number, '\n'). You may want to refer to the manpage for <code>ascii</code>.}}
{{Admon/tip|6502 Implementation|For reference, here is a [[6502 Counting Loop Example|6502 implementation of this loop]].}}
3. Repeat the previous step for x86_64.
4. Extend the AArch64 code to loop from 00-30, printing each value as a 2-digit decimal number.
{{Admon/tip|2-Digit Conversion|You will need to take the loop index and convert it to a 2-digit decimal number by dividing by 10. To do this, use Read the description of the <code>div</code> division instructioncarefully. On x86_64, which takes the dividend from rax and the divisor from register supplied as an argumentyou need to set up specific registers before performing a division. The quotient On AArch64, you will be placed in rax and need to use a second instruction to find the remainder will be placed in rdxafter a division.}}
5. Repeat Change the previous step for x86_64code as needed to suppress the leading zero (printing 0-30 instead of 00-30).
=== Deliverables ===
1. Complete the group lab section, above. 2. Extend the assembler programs (both x86_64 and aarch64) to suppress the high digit when it is 0. In other words, the printed values should progress from 0-30 instead of from 00-30. It is OK to output a space in place of the suppressed digit (this will cause the numbers to be aligned vertically in the output).
=== Optional Challenge ===