ZHCUAQ1F july 2015 – april 2023
保留寄存器
.reserve [register1 [, register2 , …]]
.reserve 指令会阻止汇编优化器在 .proc 或 .cproc 区域中使用指定的寄存器。
如果 .proc 或 .cproc 区域中显式分配了 .reserved 寄存器,则汇编优化器也可以使用该寄存器。例如,变量 tmp1 可以分配给寄存器 A7,即使它在 .reserve 列表中,因为 A7 在 ADD 指令中明确定义:
.cproc
.reserve a7
.reg tmp1
....
ADD a6, b4, a7
....
.endproc
当位于包含 .call 语句的 .cproc 区域内时,无法在.reserve 语句中指定 A4 和 A5。调用约定要求 A4 和 A5 用作 .call 语句的返回寄存器。
此示例中的 .reserve 可保证汇编优化器不会对变量 tmp1 到 tmp5 使用 A10 到 A13 或 B10 到 B13:
test .proc a4, b4
.reg tmp1, tmp2, tmp3, tmp4, tmp5
.reserve a10, a11, a12, a13, b10, b11, b12, b13
.....
.endproc a4
如果可用的寄存器池受到过度限制,汇编优化器可能会生成效率较低的代码。此外,可用寄存器池可能会受到限制,从而无法进行分配,并生成错误消息。例如,以下代码会生成错误,因为所有条件寄存器都已保留,但变量 tmp 需要条件寄存器:
.cproc ...
.reserve a1,a2,b0,b1,b2
.reg tmp
....
[tmp] ....
....
.endproc