Open main menu

CDOT Wiki β

Changes

SPO600 64-bit Assembly Language Lab

534 bytes added, 08:39, 11 November 2021
no edit summary
`-- Makefile
Throughout this lab, take advantage of1. Review, build, and run the x86_64 assembly language programs. Take a look at the code using <code>objdump -d '''objectfile'''</code> and compare it to the source code. Notice the absence of other code (compared to the C ''hello'' binary, which has a lot of extra code). 2. 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.  ''[[make and Makefiles|make]]'' whenever possible.
=== Resources ===
=== Group Lab Tasks ===
<!-- {{Admon/tip|Shortcut|To save lab time '''your group can decide''' to do steps 1-2 as individual homework after the lab.}} 1. Review, build, and run the x86_64 assembly language programs. Take a look at the code using <code>objdump -d '''objectfile'''</code> and compare it to the source code. Notice the absence of other code (compared to the C binary, which had a lot of extra code). 2. 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.
31. 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.
42. Here is a basic loop in AArch64 assembler - this loops from 0 to 9, using r19 as the index (loop control) counter:
.text
{{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>.}}
53. Repeat the previous step 6 for x86_64.
For reference, here is the loop code in x86_64 assembler:
_start:
mov $min,%r15 /* loop index */
loop:
syscall
64. 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.}}
75. Repeat the previous step 8 for x86_64. 
=== Optional Investigation (Recommended) ===
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.
 
3. Review, build, and run the x86_64 assembly language programs. Take a look at the code using <code>objdump -d '''objectfile'''</code> and compare it to the source code. Notice the absence of other code (compared to the C binary, which had a lot of extra code).
 
4. Build and run the three assembly language 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.