Register Guide

RISC-V a2 / x12 Register: Argument

Function argument register 2. Passes third argument.

ABI name: a2; physical register: x12.
Save rule: Caller.
Read it through its psABI role first, then inspect how each instruction reads or writes it.
Physical Name x12ABI Name a2Save Rule Caller
Role
Argument
Convention
Caller-saved
Remember This First
a* registers are caller-saved, so callees may overwrite them.
psABI Reference

Argument/return-value register

The psABI uses a0-a7 as argument registers, with a0-a1 also carrying return values. They are not callee-saved and may be overwritten by calls.

Preserved across calls: No
RISC-V psABI integer register convention
Quick Understanding & Search Notes

a2 / x12 belongs to the a0-a7 argument-register group. The psABI uses a0-a7 for arguments and a0-a1 for return values; these registers are not preserved across calls.

a0-a7 are argument registers, and a0-a1 are also used for return values.
a2 is not preserved across calls, so a callee may overwrite it.

When It Fits Best

  • - Carry function arguments before the call; a2 is the third argument register.
  • - a2 is not listed as a return-value register in the psABI table; look first at a0/a1 for returns.
  • - Read a0-a7 first as function argument registers under the psABI.

When Not To Use It This Way

  • - Do not assume a* registers keep their old values after a call.
  • - If an a* value must survive a call, save it into s* or the stack first.

What Happens Around A Call

1

a* registers are caller-saved, so callees may overwrite them.

2

After a call returns, do not assume the old a2 argument value still exists; the callee may overwrite it.

3

When arguments exceed a0-a7, the extra ones go on the stack.

Arguments And Return Values

Examples explain the rule, not a complete program
addi a0, zero, 3  # first argument
addi a1, zero, 4  # second argument
call add2
# after return, a0 holds the return value

FAQ

Does a2 / x12 keep its old argument value after a call?

Do not assume so. a0-a7 are not preserved across calls, and the callee may overwrite them.

Which a registers carry return values?

The psABI uses a0-a1 for return values as well as arguments.