1,885
edits
Changes
→References
[[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|Australia and RedSPO600 Servers|Perform this lab on <code>australia.proximity.on.ca</code> [[SPO600 Servers]] (for you may use your own x86_64) and red (for aarch64system if desired, accessed via port 2222 on <code>iraq.proximity.on.ca</code>along with the AArch64 server).}}
== Lab 3 ==
<!--
-->
=== Code Examples ===
The code examples for this lab are available at this link: http:in the file //england.proximity.on.ca/spo600public/spo600-lab3assembler-lab-examples.tgz Please download this archive to your accounts on Australia and Red, and unpack the archive on both systems. Do all of the work for the x86_64 architecture on Australia, [[SPO600 Servers|Aarchie and all of the work on the aarch64 architecture on Red.Xerxes]]
Unpacking the archive in your home directory will produce the following directory structure:
| `-- Makefile
`-- c # Portable C versions
|-- hello2.c # write() version |-- hello3.c # syscall () wrapper version |-- hello.c # printf () version
`-- Makefile
Throughout this lab, take advantage of ''[[make and Makefiles|make]]'' whenever possible.
=== References Resources ===
* [[Assembler Basics]]
*[[Syscalls]]* [[x86_64 Register and Instruction Quick Start]]** [[aarch64 Register and Instruction Quick Start]]
=== Group Lab Tasks ===
1. Build and run the three C versions of the program for x86_64. Take a look at the differences in the code.
2. Review, build, 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 run take a look at the x86_64 assembly language programscode. Make sure you understand Notice the total amount of code.
4. Build and run the three C versions of the program for aarch64. 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. 5. Review, build, and run the aarch64 assembly language programs. Make sure you understand Take a look at the code using <code>objdump -d '''objectfile'''</code> and compare it to the source code.
6. Here is a basic loop in x86_64 assembler - this loops from 0 to 9, using r15 as the index (loop control) counter:
.globl _start
start = 0 /* starting value for the loop index ; '''note that this is a symbol (constant)''', not a variable */
max = 10 /* loop exits when the index hits this number (loop condition is i<max) */
loop:
/* '''... body of the loop ... do something useful here ... ''' */
inc %r15 /* increment index */
syscall
Loop: 0
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-99598859-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>.}}
7. Repeat step 6 for aarch64.