Odpovídáte na názor k článku Stack Overflow chce přežít AI. Názory mohou přidávat pouze registrovaní uživatelé. Nově přidané názory se na webu objeví až po schválení redakcí.
Me zadani:
Napis me programovou smycku opakujici se 1000x na procesoru Z80. Ale tak ze pred smyckou, ve smycce a za smyckou nemenis zasobnik, ani zadne registry krome AF registru, ten muzes pouzivat libovolne. Dale zasobnik ukazuje na misto kde ma par bajtu k dispozici. Takze ho lze pouzit behem inicializace smycky a na konci smyccky, kde provadis vyhodnoceni zda pokracovat nebo ne.
Jeho prvni reseni/iterace, kde vynechavam spamujici kecy okolo:
; Předpoklad: SP ukazuje na místo, kde jsou alespoň 2 bajty volné ; a lze je bezpečně použít. ; Zachováme všechny registry kromě AF. ; Inicializace čítače (1000 do zásobníku) LD A, 232 ; 1000 = 0x03E8, LSB PUSH AF ; uložíme LSB na stack LD A, 3 ; MSB PUSH AF ; uložíme MSB na stack .loop: ; --- Tělo smyčky začíná zde --- ; V těle můžeš používat jen registr AF ; ------------------------------- ; ... (tvoje smyčka) ... ; --- Tělo smyčky končí zde --- ; Zde snížíme čítač na zásobníku (čti 16bitové číslo, dekrementuj, zapiš zpět) ; Načíst LSB a MSB z vrcholu stacku POP AF ; AF = MSB:LSB low byte LD A, A ; LSB je v A LD B, A ; Uložíme si LSB do B POP AF ; A = MSB LD C, A ; MSB do C ; LSB = B, MSB = C ; 16bit: (C << 8) | B LD A, B DEC A LD B, A ; otestuj borrow CP 0xFF ; byl původně 0, tedy borrow? JR NZ, .no_borrow DEC C .no_borrow: ; Zapiš zpět na zásobník (nejprve MSB) LD A, C PUSH AF ; MSB LD A, B PUSH AF ; LSB ; Ověř, zda jsme dosáhli nuly LD A, B OR C ; pokud obě nuly => konec JR NZ, .loop ; --- Konec smyčky ---
1) nedodrzel zadani a v tele smycky ma posunuty zasobnik, protoze si tam uklada 2 hodnoty. V komentari pise neco o 2 bajtech i kdyz tam ma 4.
2) nesmyslne slozity kod
LD A, B DEC A LD B, A ; otestuj borrow CP 0xFF ; byl původně 0, tedy borrow? JR NZ, .no_borrow
lze nahradit
DEC B LD A, B INC A JR NZ, .no_borrow
Ale hlavne nehleda snadna reseni ktera mu Z80 sam nabizi. Proc testovat -1, misto rovnou nuly? Nebo druhe snadne reseni je predel 0x80. Proc rovnou nenapsat neco jako
DEC C JR NZ, .no_borrow DEC B .no_borrow ... JR NZ, .loop
3) Neuklidil si po sobe ten zasobnik.
4) Pouzil BC registry tak ze je zmenil.
5) Prohazuje si na zasobniku MSB a LSB a nevi o tom. Nebo ma aspon bordel v komentarich co je co. Pri prvni iteraci urcite se chova k MSB, ktery ma v B jako by to byl LSB.
6) Do kodu pridava zbytecnosti, protoze nektere veci podle me nemohl najit snad ani na netu pri uceni jako tohle:
LD A, A ; LSB je v A
Protoze tohle by nenapsal ani zacatecnik. Tohle by dokazal vyprodukovat jen prekladac.