HN.zip

Writing Portable ARM64 Assembly (2023)

51 points by luu - 21 comments
t-3 [3 hidden]5 mins ago
> You will also need to be aware of minor differences between the Darwin ABI and other platform ABIs. A notable example is that the x18 register is reserved by the Darwin ABI and is explicitly zeroed on context switches in some cases. This register is also reserved on Android, but not on GNU/Linux or Alpine.

x18 is "the platform register", reserved for the OS. The ISA manual says not to touch it unless you know what you're doing. Also, I don't know but I could believe that android and non-googly linux use different ABIs (but probably not because everyone uses pretty much the same ABI on aarch64 from what I've seen), but surely Alpine is linux and has the same ABI as other linuxes.

steve1977 [3 hidden]5 mins ago
> It just requires being aware of a few differences between the Mach-O and ELF ABIs, as well as knowing what Apple-specific syntax extensions to avoid.

And completely ignoring PE and Windows on ARM.

makerofthings [3 hidden]5 mins ago
I have been very successfully ignoring Windows on Arm since it first appeared :)
steve1977 [3 hidden]5 mins ago
I understand the sentiment ;) But IMHO the title of the article is still a bit misleading or incomplete.
commandlinefan [3 hidden]5 mins ago
I mean, so has Microsoft, so...
steve1977 [3 hidden]5 mins ago
I like to complain about Microsoft as much as anyone, but this is simply not true. At least not since the "second coming of Windows on ARM".
crest [3 hidden]5 mins ago
How is this code portable to other platforms if it assumes that clang implies macOS?
pjmlp [3 hidden]5 mins ago
Assembly was never portable, or do you think 6502 on Apple would work out of the box in a Gameboy or C64?
tieze [3 hidden]5 mins ago
Would be tricky to have your 6502 code running on a Game Boy as it has a Z80/8080.
whobre [3 hidden]5 mins ago
In 1981, one could write a z80 assembly program for cp/m and it would run on thousands of different computer models.
pjmlp [3 hidden]5 mins ago
As someone that was alive back then already, only if you never touched the hardware directly outside the CPU.

Even the PC clones didn't had something like portable Assembly if you ventured outside 0x10h and 0x21h interrupts.

MomsAVoxell [3 hidden]5 mins ago
I did it many times on CP/M and also DOS.

Never ‘touching the hardware’ was attainable for a great deal many assembly programs.

You could do a lot with 0x10h and 0x21h on DOS.

pjmlp [3 hidden]5 mins ago
Yes, not much for games though.
whobre [3 hidden]5 mins ago
Right. I am saying there is a difference between portable and non portable assembly code. If you interacted with the machine via call 05h interface, it was portable. If you accessed computer’s video memory buffer directly it wasn’t.
MomsAVoxell [3 hidden]5 mins ago
Good portable assembly would stub the system stuff off, anyway, and once that was done for the cpu class in focus, it was very possible to have a thin HAL and write portable code. A great deal many successful products of the era were written in pure assembly this way.

In any case, you could also get high performance multiplatform video/io assembly libraries on the market, soon enough, back in the day .. it begat a lot of Delphi units too, I seem to recall ..

steve1977 [3 hidden]5 mins ago
of different CP/M computer models though, no?
foldr [3 hidden]5 mins ago
The article is perfectly clear:

> The good news is that it is very easy to write assembly which targets Apple’s computers as well as the other 64-bit ARM devices running operating systems other than Darwin.

pjmlp [3 hidden]5 mins ago
As long as nothing outside the CPU itself gets used.
foldr [3 hidden]5 mins ago
Obviously. Who could possibly be writing ARM assembly code who is not also aware that system calls, etc. will vary across platforms?

Sometimes you do seem to make negative comments just for the sake of it.

pjmlp [3 hidden]5 mins ago
So it isn't portable after all...
foldr [3 hidden]5 mins ago
If you can understand what someone means when they talk about a “small elephant”, then you can understand what they mean when they talk about “portable assembly”. In this case, the relevant point is that you can write ARM64 assembly routines that do useful work (e.g optimized matrix multiplication, or something like that) in such a way that they’ll work correctly on a number of different ARM64 platforms.