Chenxiao Ma | December 27, 2016
I was trying to build a compiler as a course project in a Compiler Technology course. I decided to use x86 as my destination code architecture. However there are 2 more steps to take before the x86 code can be executed. Here is a what I have tried and I hope it will help you.
The assembly code has to be "assembled" first, with a program called assembler.
The assembler will produce a program called object file. Each source assembly
file will be assembled to an object file.
All the object files are then "linked" by a program called linker.
lld
might be used on macOS and mingw
is used on Windows.
There are many assemblers available, including GAS
, NASM
and MASM
.
GAS
is used by GNU GCC
,
NASM
is cross-platform and MASM
is exclusive to Windows.
I am using a Mac so I have no choice but to use NASM
.
Then because of the requirements of the assignment,
I have to migrate it to Windows too.
First I will talk about how I set up NASM
and got Xcode to run
and debug my assembly code.
Then I will talk about how to set up NASM
on Windows
and use it to assemble x86 code to object files on Windows.
In the end I will also tell you
how to use mingw
to make executable files on Windows.
First we install NASM
with Homebrew
$ brew install nasm
Then go to Build Rules in the Project Settings in Xcode, click the plus button, and set the rules as below
/usr/local/bin/nasm -f macho ${INPUT_FILE_PATH} -o ${SCRIPT_OUTPUT_FILE_0}
Then we write a really simple program.
In test.asm
we declare an assembly function,
which simply returns an integer 2017
.
In main.cpp
we declare the main
function, call test
and print out the return value.
; test.asm global _test section .text _test: mov dword eax, 2017 ret
// main.cpp #include extern "C" int test(); int main(int, const char**) { int out = test(); std::cout << out; return 0; }
Now we are all set.
If you want to run it, just hit command + R
.
If you want to debug it, you can set a breakpoint
and use control + F7
to jump into the assembly function.
NASM
can be downloaded from its official website.
I didn't use the installer and just used the executable in the zip file.
Move the executable to the same folder as your assembly file
and type the following command into cmd
.
cd C:\\Assembly nasm -f win32 test.asm -o test.o g++ -c main.cpp mingw32-g++ test.o main.o a.exe
Now if you see 2017 printed on the command line, you have succeeded!