Open main menu

CDOT Wiki β

Changes

SPO600 64-bit Assembly Language Lab

794 bytes added, 15:28, 21 February 2020
no edit summary
=== Group Lab Tasks ===
 
{{Admon/tip|Shortcut|To save lab time '''your group can decide''' to do steps 1-4 as individual homework after the lab.}}
1. Build and run the three C versions of the program for x86_64. Take a look at the differences in the code.
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 min = 0 /* starting value for the loop index; '''note that this is a symbol (constant)''', not a variable */ max = 10 30 /* loop exits when the index hits this number (loop condition is i<max) */
_start:
mov $startx19,%r15 /* loop index */min
loop:
/* '''... body of the loop ... do something useful here ...''' */
inc add %r15 /* increment index */x19, x19, 1 cmp $x19, max,%r15 /* see if we're done */ jne loop /* b.ne loop if we're not */
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. Combine it with code from the "Hello World" example, so that it prints a word each time it loops:
{{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>.}}
7. Repeat step 6 for aarch64x86_64For 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 ===