Simplest (ARM64) Assembly Program that Runs without an error

In order for a program to run successfully, it needs two things: an entry symbol, and a return code that represents that success. The following program provides those two things.

.global _start
 
_start:     
            MOV     X0, #0
            MOV     X8, #93
            SVC     0

Compile it using the simple Makefile from the previous article.

The symbol _start is a special symbol expected by the linker. If you try to rename like this…….

.global _ADAM
 
_ADAM:     
            MOV     X0, #0
            MOV     X8, #93
            SVC     0

…you get the following error:

$ make other
as -o other.o other.s
ld -o other other.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078

Which will still compile and run.

If you leave off the three assembly instructions at the end, you do not return 0 indicating the program success.

.global _start
 
_start:

That gives you this error:

]$ ./bad_return -bash: ./bad_return: cannot execute binary file: Exec format error

To be honest, there are no instruction in the code, and I think that is a different problem. If we skip executing the function to send the return code:

.global _start
 
_start:     
            MOV     X0, #0
            MOV     X8, #93

That gives this error when run:

$ ./bad_return 
Illegal instruction (core dumped)

3 thoughts on “Simplest (ARM64) Assembly Program that Runs without an error

  1. Hi Adam,

    I’ve stumbled across your interesting series about assembly programming and I wanted to do first steps in assembly programming.

    But when I try to assemble the first program first.s

    .global _start

    _start:
    MOV X0, #0
    MOV X8, #93
    SVC 0

    according to your Makefile, I get the following error message

    as -o first.o first.s
    first.s: Assembler messages:
    first.s:4: Error: expecting operand after ‘,’; got nothing
    first.s:5: Error: expecting operand after ‘,’; got nothing
    first.s:6: Error: no such instruction: `svc 0′

    What should I do?

  2. I am working on AARCH64…also known as ARM64. It is a different set of instructions than on x86_64. When I compile on my Dell Laptop, I get the same error as you see.

  3. You have two choices. You can try to get the AARCH code I have shown above working, or you can switch to something based on x86_64. If you want to do AARCH64, either cross compile and run an emulator, or get a Raspberri Pi.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.