Processor registers¶
Here we describe how parts of the ABC machine are mapped onto an actual processor.
- The program is stored in the code and data segment.
- The heap is stored in memory.
- The A stack is stored in memory.
- The B and C stack are intertwined on the machine stack.
Registers are used for the following purposes:
- The machine instruction pointer is also the ABC instruction pointer.
- The machine stack pointer is also the B/C stack pointer.
- One register for the A stack pointer.
- One register to hold a pointer to the unused part of the heap, to write new nodes to.
- On some systems, one register to hold the number of free words on the heap.
- Some registers to store the top values on the A and B stacks, for efficiency.
- One or more scratch registers.
- In the run time system (in particular in the garbage collector), registers are used for other purposes as well.
Below are mapping tables for various platforms.
The tables include the functions of the registers in common calling
conventions. This is useful when you call an external function not through the
ccall
ABC instruction but using an ABC jmp
, jsr
, etc. This allows you to
efficiently pass the heap and stack pointers to the external function. When
unspecified, a register is caller-saved. See Wikipedia for more details about
these calling conventions:
x86¶
Function | Register | Function in cdecl |
---|---|---|
A stack pointer | esi |
Callee-saved |
B/C stack pointer | esp |
Stack pointer |
Heap pointer | edi |
Callee-saved |
A[0] |
ecx |
|
A[1] |
edx |
|
B[0] |
eax |
Result |
B[1] |
ebx |
Callee-saved |
Scratch | ebp |
Base pointer |
(In cdecl, all arguments are passed on the stack.)
x86-64¶
Function | Register | In System V ABI | In Windows calling convention |
---|---|---|---|
A stack pointer | rsi |
Argument 2 | Callee-saved |
B/C stack pointer | rsp |
Stack pointer | Stack pointer |
Heap pointer | rdi |
Argument 1 | Callee-saved |
Free words | r15 |
Callee-saved | Callee-saved |
A[0] |
rcx |
Argument 4 | Argument 1 |
A[1] |
rdx |
Argument 3; result 2 | Argument 2 |
A[2] |
r8 |
Argument 5 | Argument 3 |
B[0] |
rax |
Result 1 | Result |
B[1] |
rbx |
Callee-saved | Callee-saved |
B[2] |
r10 |
||
B[3] |
r11 |
||
B[4] |
r12 |
Callee-saved | Callee-saved |
B[5] |
r13 |
Callee-saved | Callee-saved |
B[6] |
r14 |
Callee-saved | Callee-saved |
Scratch | rbp |
Base pointer | Base pointer |
Scratch | r9 |
Argument 6 | Argument 4 |