Zkouseli jste po AI napsat nejtrivialnejsi program v assembleru? Napsat programovou smycku co se opakuje 1000x. Je vam jedno jak bude citac ulozen, jake hodnoty zvoli, zda poroste nebo se bude snizovat. Jedine co chcete aby v prubehu smycky a po smycce zustaly registry a zasobnik stejny. Zasobnik mu povolite pouzivat behem inicializace a v prubehu testovani smycky kdyz si ho uklidi a nechate mu tam nejake misto.
Na Z80...
a pak jen sledujte tu hruzu co z nej leze...
i kdyz se ho budete snazit opravovat a ruzne napovidat tak v urcitem okamziku se zacykli a bude ruzne generovat chyby. Budete muset prejit na metodu ze ma cislovat radky a odkazovat se na ty konkretni radky a on stejne bude selhavat.
Kdyz misto AI tohle zkusite zadat zacatecnikovi tak u neho mate sanci ze to nakonec pochopi i kdyz bude mnohem pomalejsi v nekterych oblastech. Jako zjistit si kolik bajtu ma ktera instrukce a kolik taktu. To AI dokaze dolnit mrknutim oka. Ale nedokaze te znalosti vubec vyuzit.
AI tohle nezvlada jak ma malo naucenych dat. Nema odkud krast. Nepouzitelny.
To je stejné jako s automatizací. Nahrazen byl člověk obsluhující výtah. Všude jinde šlo "jen" o usnadnění práce tak, že stejný počet lidí udělal více práce nebo pro stejně práce stačí menší počet lidí. AI nemá nahradit v IT "pořádné" programátory, ale juniory/absolventy, outsourcing do Indie a technickou podporu na Filipínách. Prostě těch dolních 50 %.
Brácha třeba má zkušenost s outsourcingem do Indie (úkol trval týden - udělá zadání, pošle výsledek, zbytek dne "má hotovo") a Chat-GPT (úkol trval den - odpověď v sekundách, cykl upřesňování a oprav byl na úrovni práce s tím Indem, ale nečekalo do dalšího dne). Chat-GPT stal koruny, Ind o několik řádů víc.
PS: I ten assembler mu fungoval, dokud se vešel do počtu tokenů (od toho místa v kódu je to už jen halucinace). Dnes už umí Chat-GPT až milion.
2. 6. 2025, 16:56 editováno autorem komentáře
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.
;----------------------------------------------------------
; Smyčka proběhne přesně 1000× (0x03E8).
; • SP zůstává beze změny.
; • Žádný registr kromě AF se nikdy nemodifikuje.
; • Do A můžete vkládat vlastní práci uvnitř LOOP_BODY.
;----------------------------------------------------------
org 0x0000 ; libovolný začátek programu
;--------------------------
; Paměť pro čítač
;--------------------------
COUNTER_LO: db 0 ; nízký bajt
COUNTER_HI: db 0 ; vysoký bajt
;--------------------------
; Inicializace čítače na 1000 (0x03E8)
;--------------------------
ld a,0xE8 ; low byte = 232
ld (COUNTER_LO),a
ld a,0x03 ; high byte = 3
ld (COUNTER_HI),a
;--------------------------
; Hlavní smyčka
;--------------------------
LOOP_START:
; --- VLASTNÍ KÓD SMYČKY -------------------------------
LOOP_BODY:
nop ; sem vložte svou práci
; ------------------------------------------------------
;--- Dekrementace 16-bitového čítače -------------------
ld a,(COUNTER_LO) ; A = low
sub 1 ; A = low-1, nastaví Carry pokud podteklo
ld (COUNTER_LO),a
ld a,(COUNTER_HI) ; A = high
sbc a,0 ; high = high-Carry
ld (COUNTER_HI),a
;-------------------------------------------------------
;--- Test, zda čítač dosáhl nuly -----------------------
or a ; high == 0 ? (NZ pokud ≠0)
jp nz,LOOP_START ; pokud high ≠ 0 pokračuj
ld a,(COUNTER_LO) ; high je 0, zkontroluj low
or a ; low == 0 ?
jp nz,LOOP_START ; pokud low ≠ 0 pokračuj
;-------------------------------------------------------
;--------------------------
; Smyčka skončila – čítač = 0
;--------------------------
; další kód programu…
jp $ ; nekonečno, jen pro příklad