вот такой код: int R_EAX, R_ESI; void test(void) { asm volatile ("" : "=a" (R_EAX), "=S" (R_ESI)); } порождает вот такой ассемблер. .globl test .type test,@function test: pushl %esi #APP #NO_APP movl %eax,R_EAX movl %esi,R_ESI popl %esi ret вопрос: почему gcc сохраняет/восстанавливает %esi (в отличие от %eax)? %esi ведь фигурирует только в output list. на такое поведение закладывается, например, switch_to(), но я не могу найти, где это поведение документированно.