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
Sper că va fi de folos și pentru alții. Poți arăta susținerea printr-un comentariu, like sau share.