A Little of This and a Little of That
For example how do you arrange the arguments for a function on a stack?
- C-Style? The first argument is pushed last onto the stack
- Pascal Style? The first argument is pushed first onto the stack
Both have upsides, and both have downsides. But neither is enforced by the hardware.
On the other hand datatype alignment is influenced by the hardware. The hardware is usually optimised to store specific types of operand at specific byte alignment offsets. Some platforms do support loading unaligned data, but there is usually an associated performance penalty. As such these alignments are somewhat/fully specified by the hardware.
Oddly enough some of the ABI isn't specified by hardware, but by platform. After all, to do just about anything on a computer these days, you must interact with the Operating System, and that OS has specific expectations about how it is to be interacted with.