Odpověď na názor

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í.

  • 2. 6. 2025 17:08

    forth

    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.