Hi

I have developed a new version of the gnu assembler for riscv machines.

Abstract:
———

The GNU assembler (gas) is centered on flexibility and portability. These two 
objectives have quite a cost in program readability, code size  and execution 
time. 

I have developed a « tiny » version of the GNU assembler focusing on simplicity 
and speed.

I have picked up from the several hundreds of megabytes of binutils just the 
routines that are needed to a functional assembler, for the use case of 
compiler generated assembler text for a single machine. That meant:

1) There is no linker code in this assembler. An assembler doesn’t need any 
linker code. It is an assembler, period.
2) There are no macros, no preprocessing, nothing that makes an assembler 
easier to use for a human developer. This is NOT a replacement of gas, that is 
obviously still available everywhere. If you want to develop in assembler use 
gas, not this tiny assembler.
3) Since there isn’t a human user, all the sophisticated error handling is not 
necessary. Messages are in English ONLY and if you do not know that language 
just do not make any mistakes!
4) All the vectorization for separating the front end and the backend are 
eliminated. There is no indirection through function tables the functions in 
the backend are called directly. This has the advantage that when you see a 
function call like statement like foo(42); it means that you are calling the « 
foo » function, not a macro that is expanded into something else then renamed 
to yet another name.
5) The BFD library has been disabled. Only some procedures of that library are 
in the code. The same for libierty, that has almost vanished.
6) The code has been cleaned up from all cruft like this:
          /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
         * flavoured AS.  The following bizarre behaviour is to be
         * compatible with above.  I guess they tried to take up to 8
         * bytes from a 4-byte expression and they forgot to sign
         * extend.  */
#define BSD_FILL_SIZE_CROCK_4 (4)

So, we are still in 2023 keeping bug compatibility with an  assembler for a 
machine that ceased production in 2000?

In a similar vein, all code that referenced the Motorola 68000 (an even older 
machine) the Z80, the SUN SPARC, etc is gone. This assembler will only produce 
64 bits ELF code and compile for a 64 bit risk CPU.

Availability:
$ git clone https://github.com/jacob-navia/tiny-asm

Building the tiny assembler:
$ gcc -o asm asm.c

There is no Makefile

In some machines, the obstack  library is not a part of the libc. (Not linux, 
Apple, for instance). For those machines obtsack.c is provided in the 
distribution and the compilation command should be:
$ gcc -o asm asm.c obstack.c

star64:~/riscv-asm$ objdump -h asm | grep text
 11 .text         0002e53e  0000000000028060  0000000000028060  00028060  2**2

Just 189 758 bytes. The gnu assembler is:
star64:~/riscv-asm$ objdump -h ../binutils-gdb/gas/as-new | grep text
 11 .text         000d8d10  00000000000465a0  00000000000465a0  000465a0  2**2
888 080 bytes.

Further work:
The idea is to replace the system assembler in gcc and replaced with a linked 
assembler that speeds gcc: instead of writing an assembler file you just pass a 
pointer to the text buffer in memory.
But that is still much further down the road.

Enjoy!

jacob



Reply via email to