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