section .data MAX_ITER equ 256 width equ 1024 height equ 1024 section .bss loop resd 1 rr resq 1 x resq 1 y resq 1 r resq 1 i resq 1 a resq 1 b resq 1 c resd 1 section .text global _start _start: ; Initialize variables mov dword [loop], 0 fldz fst qword [rr] fldz fst qword [x] fldz fst qword [y] iterate: ; while (rr < 4096) fld qword [rr] fld qword [4096.0] fcomi st0, st1 jae .end_loop ; r = x * x fld qword [x] fmul st0, st0 fst qword [r] ; i = y * y fld qword [y] fmul st0, st0 fst qword [i] ; rr = r + i fld qword [r] fadd qword [i] fst qword [rr] ; y = 2 * x * y + b fld qword [x] fmul qword [y] fadd qword [y] fadd qword [b] fst qword [y] ; x = r - i + a fld qword [r] fsub qword [i] fadd qword [a] fst qword [x] ; if (++loop == MAX_ITER) return 0 inc dword [loop]
Ei yhtään ylimääräistä koodia. Hienosti ohjelmoitu!
Miksi kirjoittaa assemblyä samalla tavalla kuin korkeamman tason ohjelmointikielen kääntäjä olisi ehkä joskus 60-luvulla koodia tuottanut? Nopealla silmäyksellä ohjelmalistaus ei ole edes kokonainen.
jalski@
Menit vähintään vain parillakymmenellä vuodella metsään tuon 60-lukusi kanssa. MASM ei ole häipynyt yhtään mihinkään vaikkei Microsoft ole myynyt sitä enää aikoihin erillisenä pakettina. Se sisältyy kuitenkin lähes jokaiseen em. puljun julkaisemaan SDK:n ja C-kääntäjään ja toimitetaan mm. Visual Studio paketin mukana. Nyt on niin, että tuo vääntö toimii yhtä hyvin 32 kuin 64 bittisessä ympäristössä millä tahansa alustalla jolla on ylipäätään jotain merkitystä. Kun nyt lässyttelit listauksista niin käypä kurkkaamassa nimimerkki jone2712 avausulostuloa aiheesta, eli mitä hän kysyi...
Meinasin vaan, että miksi jos haluaa kirjoittaa assemblyä tekee sen kuin vanha korkeamman tason ohjelmointikielen kääntäjä mikä ei osaa käyttää rekistereitä edes silmukkalaskureina.
Missä koodissa on näkyvillä '.end_loop' label tai miten 'inc dword [loop]' palauttaa nollan mikäli laskuri on suurempi kuin 'MAX_ITER'?
Mandelbrot laskennassa assemblyä suurempi optimointi olisi rinnakkaisuus laskentaan ja mikäli kuva olisi symmetrinen voisi laskea vaan puolet kuvasta ja piirtää molemmat puolet.
Ihme kitinää... Just don't lose your sense of humour while you're coding (if you've ever even had ...)
😉