Assembly alert! I promised to talk more about the compiler, but before it, more assembly. It is for a good reason, though. I was surprised to see my professor doing the “hello world” in assembly! Not only on x86_64 but also in the ARMv8 – different source code. He coded just like C or C++, saved, compiled and run it. The output was exactly like any other language. Nobody knew, but he was doing the Lab 5! I wish I were recording it.
Our goal in this class was to compare the compiler output with the hand-crafted assembly. As expected, the compiler produced non-optimal executables even when we played with some fine-tuning options that I mentioned in the last post.
How to compile an assembly code? Here are the commands:
- Using GNU Assembler
> as -g -o test.o test.s
> ld -o test test.o
- Using NASM Assembler
> nasm -g -f elf64 -o test.o test.s
> ld -o test test.o
- Using GCC
> gcc -g -o test.o test.S
How to get the assembly code from an executable?
> objdump -d test
Using those tools, we played on both architectures, and the compiler didn’t get any closer than our hand-crafted script. However, I don’t believe that we should start using low-level languages for everything. There are drawbacks to doing so. The major one is the fact that assembly is hardware-oriented. This means that it needs to be rewritten on different platforms. Comparing it with C or C++, you just need to code once and compile it multiple times (one for each platform). So, unless it is a requirement, I would take it as a last resource to improve the performance.
If you want to know more about the used scripts and the assembly language, here are some resources:
https://wiki.cdot.senecacollege.ca/wiki/Assembler_Basics
https://wiki.cdot.senecacollege.ca/wiki/SPO600_64-bit_Assembler_Lab
See you!
Comments
Post a Comment