1,885
edits
Changes
no edit summary
[[Category:SPO600 Labs]][[Category:Assembly Language]]
{{Admon/lab|Purpose of this Lab|In this lab, you will experiment with assembler on the x86_64 and aarch64 platforms.}}
{{Admon/tip|SPO600 Servers|Perform this lab on [[SPO600 Servers]] (you may use your own x86_64 system systems if desired, along with they are of the AArch64 serverright architecture and appropriately configured).}}
== Lab 5 4 ==
=== 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]]
=== Group Lab Tasks 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.
.text
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>.}}
For reference, here is the loop code in x86_64 assembler:
_start:
mov $min,%r15 /* loop index */
loop:
syscall
{{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.}}
=== 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 ===