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.