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


░█░█░█░█░█░█░█░█░█░█░█░