void run(char* address){
__asm
pop HL
jp (HL)
__endasm;
}Kompiluje się prawidłowo, ale nie działa. Ktoś może mi wytłumaczyć dlaczego? Ja to rozumiem w następujący sposób:
-argument przy wywołaniu funkcji jest wrzucany na stos
-instrukcja "pop HL" ściąga argument ze stosu do rejestru HL
-"jp (HL)" skacze bezwarunkowo pod adres przechowywany w rejestrze HL.
program zachowuje się tak, jakby nic się nie wykonało.
#programowanie #naukaprogramowania #retrocomputing
@6502 W asm pykałem ze 25 lat temu, więc specem już dawno nie jestem (demencja :D). Tym bardziej nie jestem specem od SDCC, choć z C mam podobnie długą historię.
Jednak z tego co udało mi się wyłapać z sieci (bo Twój wpis spowodował, że stałem się sentymentalny i zacząłem grzebać), to wstawki asm w sdcc nie akceptują parametrów innych, niż global. Stąd, powinieneś przepisać zmienną wejściową funkcji do jakiejś zmiennej globalnej.
Ponadto, asm zwraca zawsze (nie ma potrzeby return), ale ty wymuszasz void. Nie wiem, czy to ma jakiś wpływ, ale widziałem deklaracje z __naked, które wyglądały dla mnie bardziej sensownie.