Я подозреваю, что единственный способ сделать это без использования дополнительного регистра требует дополнительной записи и чтения в память, что было бы единственной точкой отказа от использования дополнительного регистра.
Я предложу текущее решение, которое у меня есть. Я храню rbp, чтобы использовать его для временного хранения, а затем восстановить его до вызова функции. Это похоже на ответ Дрирша
movq %rbp, -24(%rsp) //store original rbp 3 words beyond the stack
movq %rsp, %rbp //store original rsp
subq $8, %rsp //buy a word on the stack
andq $-0x10, %rsp //16 byte align the stack (growing downwards)
//We now have 1 or 2 words free on the stack (depending on the original
// alignment). This is why we put rbp 3 words beyond the stack
movq %rbp, (%rsp) //store the original rsp right here
movq -24(%rbp), %rbp //restore original rbp
call foo
movq (%rsp), %rsp //restore original rsp
iretq