Difference between revisions of "SPO600 64-bit Assembly Language Lab"
Chris Tyler (talk | contribs) |
Chris Tyler (talk | contribs) |
||
Line 1: | Line 1: | ||
[[Category:SPO600 Labs]] | [[Category:SPO600 Labs]] | ||
− | {{Admon/ | + | {{Admon/lab|Purpose of this Lab|In this lab, you will experiment with assembler on the x86_64 and aarch64 platforms.}} |
{{Admon/tip|Ireland|Perform this lab on ireland.proximity.on.ca.}} | {{Admon/tip|Ireland|Perform this lab on ireland.proximity.on.ca.}} | ||
Line 34: | Line 34: | ||
2. Review, build, and run the x86_64 assembler code. Make sure you understand the code. | 2. Review, build, and run the x86_64 assembler code. Make sure you understand the code. | ||
− | 4. Build and run the C versions of the program for aarch64 (note: you may need to <code>make clean</code>). | + | 4. Build and run the C versions of the program for aarch64 (note: you may need to <code>make clean</code>). Verify that you can disassemble the object code in the ELF binary using <code>objdump -d</code> |
5. Review, build, and run the aarch64 assembler code. Make sure you understand the code. | 5. Review, build, and run the aarch64 assembler code. Make sure you understand the code. | ||
Line 47: | Line 47: | ||
_start: | _start: | ||
− | mov $start,%r15 | + | mov $start,%r15 /* loop index */ |
loop: | loop: | ||
/* ... do something useful here ... */ | /* ... do something useful here ... */ | ||
− | inc %r15 /* increment | + | inc %r15 /* increment index */ |
− | cmpq $ | + | cmpq $max,%r15 /* see if we're done */ |
jne loop /* loop if we're not */ | jne loop /* loop if we're not */ | ||
Line 83: | Line 83: | ||
9. Repeat step 8 for aarch64. | 9. Repeat step 8 for aarch64. | ||
− | === | + | === Deliverables === |
1. Complete the group lab section, above. | 1. Complete the group lab section, above. | ||
Line 89: | Line 89: | ||
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. | 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, | + | 3. Blog about the programs you've written. Describe the experience of writing and debugging in assembler, as compared to writing in other languages. Contrast x86_64 and aarch64 assembler, your experience with each, and your opinions of each. Include links to both of your assembler programs. |
Revision as of 17:01, 23 January 2014
Lab 3
Ireland - Configuration
The host Ireland (ireland.proximity.on.ca) has been set up so that you can use it normally as an x86_64 host, or use an emulation environment to build and run aarch64 binaries.
The directory ~/arm64/spo600/examples
, which is also accessible as ~/spo600-examples
, contains these files:
── hello # 'hello world' example programs ├── assembler │ ├── aarch64 # aarch64 assembler version │ │ ├── hello.s │ │ └── Makefile │ └── x86_64 # x86_64 assembler versions │ ├── hello-gas.s # 64-bit instructions with AT&T/gnu assembler syntax (called 'gas', /usr/bin/as) │ ├── hello-nasm.s # 32-bit instructions with Intel/nasm assembler syntax (/usr/bin/nasm) │ └── Makefile └── c ├── hello2.c # C version using the write() syscall wrapper ├── hello.c # C version using printf() └── Makefile
Throughout this lab, take advantage of make whenever possible.
Group Lab Tasks
1. Build and run the C versions of the program for x86_64.
2. Review, build, and run the x86_64 assembler code. Make sure you understand the code.
4. Build and run the C versions of the program for aarch64 (note: you may need to make clean
). Verify that you can disassemble the object code in the ELF binary using objdump -d
5. Review, build, and run the aarch64 assembler code. Make sure you understand the code.
6. Here is a basic loop in x86_64 assembler:
.text .globl _start start = 0 /* starting value for the loop index */ max = 10 /* loop exits when the index hits this number (loop condition is i<max) */ _start: mov $start,%r15 /* loop index */ loop: /* ... do something useful here ... */ inc %r15 /* increment index */ cmpq $max,%r15 /* see if we're done */ jne loop /* loop if we're not */ movq $0,%rdi /* exit status */ movq $60,%rax /* syscall sys_exit */ syscall
Extend this code, combining it with code from the "Hello World" example, so that it prints each digit from 0 to 9 like this:
Loop: 0 Loop: 1 Loop: 2 Loop: 3 Loop: 4 Loop: 5 Loop: 6 Loop: 7 Loop: 8 Loop: 9
7. Repeat step 6 for aarch64.
8. Extend the code to loop from 00-30, printing each value as a 2-digit decimal number.
9. Repeat step 8 for aarch64.
Deliverables
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 and debugging in assembler, as compared to writing in other languages. Contrast x86_64 and aarch64 assembler, your experience with each, and your opinions of each. Include links to both of your assembler programs.