1,885
edits
Changes
→Group Lab Tasks
[[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_ServersSPO600 Servers]] (you may use your own x86_64 system if desired, along with the AArch64 server).}}
== Lab 3 5 ==<!--
=== Code Examples ===
The code examples for this lab are available at either of these links:* Outside Seneca: http:in the file <code>//england.cdot.systems/spo600public/spo600-assembler-lab-examples.tgz* Inside Seneca: http://england.internal.cdot.systems/spo600/spo600-assembler-lab-examples.tgz Please download this archive to your accounts on the x86_64 and AArch64 systems (<code>wget</code> is a good way to do this), and unpack on the archive on both systems[[SPO600 Servers]].
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 ===
{{Admon/tip|Shortcut|To save lab time '''your group can decide''' to do steps 1. Build and run the two C versions of the program for x86_64. Take a look at the differences in -4 as individual homework after the codelab.}}
5. 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. 6. Here is a basic loop in x86_64 AArch64 assembler - this loops from 0 to 9, using r15 r19 as the index (loop control) counter:
.text
.globl _start
_start:
mov $startx19,%r15 /* loop index */min
loop:
mov $x0, 0,%rdi /* exit status -> 0 */ mov $60x8,%rax 93 /* exit is syscall sys_exit #93 */ svc 0 /* invoke syscall*/ This code doesn't actually do anything while looping, because the body of the loop is empty. On an AArch64 machine, combine this code with code from the "Hello World" assembley-language example, so that it prints a word each time it loops: Loop Loop Loop Loop Loop Loop Loop Loop Loop Loop
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 aarch64x86_64. For reference, here is the loop code in x86_64 assembler: .text .globl _start min = 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) */ _start: mov $min,%r15 /* loop index */ loop: /* '''... body of the loop ... do something useful here ...''' */ inc %r15 /* increment index */ cmp $max,%r15 /* see if we're done */ jne loop /* loop if we're not */ mov $0,%rdi /* exit status */ mov $60,%rax /* syscall sys_exit */ syscall
8. 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 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 aarch64x86_64.
=== Deliverables ===