если в двух словах, то у тебя есть указатель вершины стека. Когда происходит вызов функции, то указатель увеличивается на суммарный объем всех локальных переменных которые в функции используются, в байтах
ну, я про то, что %rsp он один как бы, вот тебе пришло прерывание у тебя теперь стекфрейм обработчика прерывания, куда делось старое значение %rsp? откуда iret знает, какое проставить?