Assembly Language
Revision as of 08:01, 15 July 2014 by Chris Tyler (talk | contribs)
Assembly language is a symbolic representation of machine language. It is therefore architecture-specific.
Each instruction is represented by a short mnemonic word such as "LDR" for Load Register, "MOV" for move, or "MUL" for multiply, followed by (optional) arguments. The addressing mode is implied by the format of the arguments. Different assemblers (compilers for assembly code) use slightly different syntax.
Contents
Examples
x86
Here is a "Hello, World!" program in x86 assembler for a Linux system, using the Nasm syntax:
section .text global _start _start: mov edx,len ; message length (bytes) mov ecx,msg ; message location (memory address) mov ebx,1 ; file descriptor: 1 is stdout mov eax,4 ; kernel syscall number: 4 is sys_write int 0x80 ; invoke syscall mov ebx,0 ; exit status: 0 (good) mov eax,1 ; kernel syscall number: 1 is sys_exit int 0x80 ; invoke syscall section .rodata msg db 'Hello, world!\n' len equ $ - msg
Here is the same program with GNU Assembler (gas/as) syntax:
.text .globl _start _start: mov $len, %edx /* file descriptor: 1 is stdout */ mov $msg, %ecx /* message location (memory address) */ mov $1, %ebx /* message length (bytes) */ mov $4, %eax /* write is syscall #4 */ int $0x80 /* invoke syscall */ mov $0, %ebx /* exit status: 0 (good) */ mov $1, %eax /* kernel syscall number: 1 is sys_exit */ int $0x80 /* invoke syscall */ .data msg: .ascii "Hello, World!\n" len = . - msg
ARM (32-bit)
This is written in GNU Assembler (gas/as) syntax:
.text .globl _start _start: mov %r0, $1 /* file descriptor: 1 is stdout */ ldr %r1, =msg /* message location (memory address) */ ldr %r2, =len /* message length (bytes) */ mov %r7, $4 /* write is syscall #4 */ swi $0 /* invoke syscall */ mov %r0, $0 /* exit status: 0 (good) */ mov %r7, $1 /* kernel syscall number: 1 is sys_exit */ swi $0 /* invoke syscall */ .data msg: .ascii "Hello, world!\n" len = . - msg