Witam, analizuję sobie programik w assemblerze, tłumacząc go na C.

mam dwa fragmenty. (wszystko dotyczy atmegi16)

pierwszy:

    1ae0:	0e 94 83 0d 	call	0x1b06	; // CLR_PB4()
    1ae4:	8d 91       	ld	r24, X+
    1ae6:	0e 94 87 0d 	call	0x1b0e	;  0x1b0e // unsigned char spi_read(unsigned char data) // data: r24  addr: 1b0e
    1aea:	9a 95       	dec	r25
    1aec:	d9 f7       	brne	.-10     	;  0x1ae4
    1aee:	0e 94 85 0d 	call	0x1b0a	;  //SET_PB4()
    1af2:	08 95       	ret

przetłumaczyłem go sobie tak:

void spi_sendcmd(unsigned char n, unsigned char* x) // n: r25, x: X; addr: 1ae0
{
  CLR_PB4();
  do
   {
    spi_read(*x);
	++x;
   }
  while (--n);
  
  SET_PB4();
}

wydaje mi się, że jest to dobre tłumaczenie jednak w miejscu gdzie wywoływana jest ta funkcja, wygląda to w ten sposób:

      9a:	c3 98       	cbi	PORTB, 3	; 24
      9c:	91 e0       	ldi	r25, 0x01	; 1
      9e:	aa 81       	ldd	r26, Y+2	; 0x02
      a0:	bb 81       	ldd	r27, Y+3	; 0x03
      a2:	0e 94 70 0d 	call	0x1ae0	;  0x1ae0 // void spi_sendcmd(unsigned char n, unsigned char* x) // n: r25, x: X; addr: 1ae0
      a6:	91 e0       	ldi	r25, 0x01	; 1
      a8:	a8 81       	ld	r26, Y
      aa:	b9 81       	ldd	r27, Y+1	; 0x01
      ac:	0e 94 70 0d 	call	0x1ae0	;  0x1ae0 // void spi_sendcmd(unsigned char n, unsigned char* x) // n: r25, x: X; addr: 1ae0
      b0:	c3 9a       	sbi	PORTB, 3	; 24
      b2:	08 95       	ret
??? func_9a(???)
{
  PORTB &=~(1<<3);
  ???
  
  spi_sendcmd(1, ???);
  ???
  
  spi_sendcmd(1, ???);
  PORTB |= (1<<3);
  ??? return ???; ???
}

jak widać nigdzie nie ma tutaj ustawionego rejestru X, jednak używane są rejestry r26 i r27, które są po pierwszym wywołaniu wg. mnie "tracone" i teraz pojawia się moje pytanie: czy rejestry X, Y, Z są powiązane jakoś ze sobą i/lub z rejestrami r1-r31