B8.6 Forcing inline assembly operands into specific registers
Sometimes specifying the exact register that is used for an operand is preferable to letting the compiler allocate a register automatically.
For example, the inline assembly block may contain a call to a
function or system call that expects an argument or return value in a particular
register.
To specify the register to use, the operand of the inline assembly statement
must be a local register variable, which you declare as follows:
register int foo __asm("r2");
register float bar __asm("s4") = 3.141;
A local register variable is guaranteed to be held in the specified register in
an inline assembly statement where it is used as an operand. Elsewhere it is treated
as a normal variable, and can be stored in any register or in memory. Therefore a
function can contain multiple local register variables that use the same register if
only one local register variable is in any single inline assembly statement.
Example
// This function uses named register variables to make a Linux 'read' system call.
// The three arguments to the system call are held in r0-r2, and the system
// call number is placed in r7.
int syscall_read(register int fd, void *buf, unsigned count) {
register unsigned r0 __asm("r0") = fd;
register unsigned r1 __asm("r1") = buf;
register unsigned r2 __asm("r2") = count;
register unsigned r7 __asm("r7") = 0x900003;
__asm("svc #0"
: "+r" (r0)
: "r" (r1), "r" (r2), "r" (r7));
return r0;
}
Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers of your data.