1,885
edits
Changes
no edit summary
[[Category:SPO600-futureLabs]]{{Chris Tyler Draft}}
{{Admon/note|Purpose of this Lab|In this lab, you will experiment with assembler on the x86_64 and aarch64 platforms.}}
│ │ └── Makefile
│ └── x86_64 # x86_64 assembler versions
│ ├── hello-gas.s # 64-bit instructions for assembley with the AT&T/gnu assembler syntax (called 'gas', /usr/bin/as) │ ├── hello-nasm.s # 32-bit instructions for assembley with the Intel/nasm assembler syntax (/usr/bin/nasm)
│ └── Makefile
└── c
Throughout this lab, take advantage of ''[[make and Makefiles|make]]'' whenever possible.
=== Group Lab Tasks ===
1. Build and run the C versions of the program for x86_64. Use objdump to disassemble and review the [[Machine Language|machine code]] in the binaries - make sure you understand it. Save the binaries for later review.
2. Review, build, and run the x86_64 assembler code. Use objdump to disassemble and review the [[Machine Language|machine code]] in the binaries - make Make sure you understand itthe code.
4. Build and run the C versions of the program for aarch64 (note: you may need to <code>make clean</code>).
5. Review, build, and run the aarch64 assembler code. Use objdump to disassemble and review the machine code in the binaries, and make Make sure you understand itthe code.
6. Here is a basic loop in x86_64 assembler:
Loop: 9
{{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-9959-1/Unicode UTF-8, the digit characters are in the range 48-57 (0x30-0x39). You will also need to assemble the message that is output on to be printed for each line - you can do this by writing the digit into the message buffer before outputting it to stdout, or you can perform a sequence of writes for the various portions of the message.}}
7. PrintRepeat step 6 for aarch64. 8. Extend the 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 the <code>div</code> instruction, which takes the dividend from rax and the divisor from register supplied as an argument. The quotient will be placed in rax and the remainder will be placed in rdx.}} 9. Repeat step 8 for aarch64. === Deliverable === 1. Complete the group lab section, above. 2. Extend the assembler programs (both x86_64 and aarch64) to suppress the high digits when they are 0. In other words, the printed values should progress from 0-30 instead of from 00-30. 3. Blog about the programs you've written. Describe the experience of writing in assembler, as compared to writing in other languages. Contrast x86_64 and aarch64 assembler, and your experience with each.