I had been playing about with assembler after many years of missing it and decided to try and find an IDE that works with using a C/C++ project with assembler code.
Well, I found one.
Eclipse Oxygen (may work with earlier versions too)
- Create a new C project. You can do this with C++ projects too if you remember to use extern “C”.
You will get a default project file like this:
/* ============================================================================ Name : testasm.c Author : WLGfx Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style ============================================================================ */ #include#include int main(void) { puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ return EXIT_SUCCESS; }
2. Set up NASM for 64 bit using Project->Properties->Settings->GCC Assembler
Change ‘as’ to ‘nasm’. That is only if you already have installed NASM.
3. Set NASM to build for 64 bit.
From the screenshot showing the change from ‘as’ to ‘nasm’, now click on ‘General’ just under ‘GCC Assembler’. Now in the ‘Assembler flags’ you just add ‘-f elf64’ and click ‘Apply’. That’s the assembler setup to use the intel syntax in Eclipse.
4. Create a new file called ‘test.asm’ and copy the code below into it. If you’re in the C/C++ perspective view in eclipse you have to go round the houses to create an empty file. ie. File->New->Other->General->File and finally you are there.
EDIT: Actually, if you right click on the ‘src’ folder then you can add a blank file from there.
You now have an assembler file, empty, but it’s there.
Don’t worry at this point about things getting complicated, because Eclipse still handles the build and linking of these assembler files automatically.
Copy this code into that empty file:
; random number generator to be used in crypto transmission ; of sensitive data over the internet ; WLGfx 2017-Nov-19 section .text global _testmain:function extern printf srand: mov [seed],rax ; set random seed ret arand: mov rax,[seed] ; get seed mov rbx,qword 0x023defca321acfed add rax,rbx ; add 64 bit value rol rax,19 ; rotate bits mov rbx,qword 0xbead6789 add rax,rbx ; another add imul rax,qword 0x1234567c ; a multiple this time mov rbx,rax ; copy into rbx xor rax,qword 0x5ecdab73 ; flip some bits rol rax,48 ; rotate bits again mov rcx,rax ; copy to rcx and rax,0x3 ; mask and test with 0 jnz .notz ; 25% chance of other ops mov rax,rbx add rcx,rax mov rbx,qword 0x87650027 imul rax,rbx jmp .cont .notz mov rax,rcx ; back into rax .cont mov [seed],rax ; store into seed and rax,0xff ; return byte value only ret _testmain: mov rax,9 ; set seed call srand mov dword[lc],10 ; set loop counter .loop call arand ; get random byte push rbp ; stack frame mov rsi,rax ; random number mov rdi,pf_msg ; format string xor rax,rax ; 0 call printf ; call printf pop rbp ; stack frame sub dword[lc],1 ; dec loop counter jnz .loop ret section .data seed dq 0,0,0,0 ; random seed value 64 bit lc dd 10 ; loop counter pf_msg db "Number: 0x%02x",10,0
In the above code I’ve declared and external function as you can see. Fortunately the underscore is still seen from C so the function name stays the same as you will see. I’m using the underscores as a note to myself that I am calling an assembler function. In future I will use a double underscore so that it doesn’t pollute other names withing the C/C++ libraries and headers.
5. Change your C file to this:
#include#include _testmain(); int main(void) { puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ _testmain(); return EXIT_SUCCESS; }
6. Build and Run and you get the output (if you’re on 64 bit)
!!!Hello World!!! Number: 0xe0 Number: 0x5b Number: 0xca Number: 0x7c Number: 0xfc Number: 0x2d Number: 0x79 Number: 0xa5 Number: 0x62 Number: 0x7f
7. Enjoy because I am now…