Assembly Language
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 use slightly different syntax.
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
Notice that the order of the arguments in some lines is reversed between the two assemblers, and the prefixes to symbols and values also change.
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
Conclusion
⚠️ Assembler Basics Blog Post: Link
Links
🖇 Follow me on GitHub
🖇 Follow me on Twitter
_p.s This post was made for my Software Portability and Optimization class.
Top comments (0)