Am învățat un pic de asamblare(assembly) pentru examenul de la facultate(restanță din anul 1). Este distractiv, dar am petrecut aproape o zi, încercând să găsească un ghid online modern pentru a rula asamblar x86-64 pe OS X. Nu am putut găsi într-adevăr ceva care nu implică utilizări complicate ale GCC. Sincer, fără google și stack overflow, probabil că nu mi-as fi dat seama. În acest articol se găsește un ghid rapid cu ce am învățat din alte referințe.

Actualizare NASM

NASM este comanda pe care o veți utiliza pentru a asambla codul de asamblare. Versiunea implicită pe calculatorul era învechită, cu ajutorul unui pachet manager precum homebrew, am instalat programul cu o versiune mai nouă.

$ brew install nasm

* Dacă rezultă o eroare legată de permisiuni, rulați sub contul de admin($ sudo brew install nasm)

$ NASM -v 
NASM version 2.12.01 compiled on Mar 23 2016
$ NASM -hf 
... 
 macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
 macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
 dbg Trace of all info passed to output stage
...

Un exemplu de fișier de assembly

Crează acest fișier de asamblare într-un fișier hello_world.asm  într – un director nou:

%define SYSCALL_WRITE 0x2000004
%define SYSCALL_EXIT 0x2000001

section .text

global start
start:
 mov rdi, 1
 mov rsi, str
 mov rdx, strlen
 mov rax, SYSCALL_WRITE

 syscall

 mov rax, SYSCALL_EXIT
 mov rdi, 0
 syscall

section .data
str: db `Hello, assembly! \n`,10,0 ; google backticks
strlen equ $ - str

Acest cod va printa hello, world, apoi programul se va termina.

Cum folosim NASM și ld

Pentru a asambla codul, executați:

$ NASM -f macho64 hello_world.o hello_world.asm -o
după care: 
$ ld hello_world.o hello_world -o
și rulați folosind comanda: 
$ ./hello_world

Mai mult…

Pentru a lucra mai rapid aveți aici un script bash destul de inteligent.

Crează un fișier folosind codul de mai jos. De exemplu „compile” sau „compile.sh”

#!/bin/bash
numArg=$#
clear
if [ $numArg -ne 2 ]; then
	echo "You entered too many or too little arguments when expected 2"
	echo "you supplied only $numArg"
	echo "Usage: compile <input.asm> <program_name>"
	exit
else
	echo "Compiling asm using NASM"
	input=$1
	output=$2
	inter=$2.o
	nasm -f macho64 -o $inter $input
	# nasm -f macho64 -o hello_world.o hello_world.asm
	# nasm -f elf$bits -o $inter $input
	ret=$?
	if [ $ret != 0 ] ; then
		echo "NASM compile failed!"
		exit
	else
		echo "Compiling using ld for final binary"
		ld $inter -o $output
		# ld hello_world.o -o hello_world
		# gcc -m$bits -o $output $inter
		ret=$?
		if [ $ret != 0 ] ; then
			echo "There was a problem with linking!"
			exit
		else
			rm $inter
			echo "Compile finished!"
		fi
		echo "Running..."
		echo
		./$output
	fi
fi

Pentru a rula fisier-ul trebuie un nivel de acces mai mare.

$ chmod 755 compile

# ultima comandă
$ ./compile hello_world.asm hello_world

Rezultat

assembly

Sper că va fi de folos și pentru alții. Poți arăta susținerea printr-un comentariu, like sau share.