Asembler 68k

poruka: 4
|
čitano: 1.454
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
Asembler 68k

Pozdrav,

radimo na faksu u asembleru, točinje u simulatoru Motoroli 68k i proučavam ja to sve ali me još muči par stvari pa evo da pitam ako netko zna :) 

Znači ako sam ja dobro razumio registri u 68k su svaki 32-bitni, i mi vidimo ispisane podatke u njima u hexadecimalnom obliku, e sad ako ja napišem nešto tipa:

 

       LEA  poruka,A1

  

poruka  DC.B 'Hello world',0

 

to stavlja podatke iz labele "poruka" u registar A1

i kad ja pokrenem program (naravno program ima još linija, ali da ne pišem sve)

u registru A1 mi je postavljeno 00001012

Uglavnom moje pitanje je kako se string kao "Hello world" reprezentira u registru i kako je došlo do ovog 1012.

Koliko je meni poznato za jedan znak je potreban jedan bajt, pa me to malo zbunjuje.

 

Molim vas da me ispravite ako sam nešto krivo napisao ili nešto krivo razumio, a vjerojatno jesam.

 
0 0 hvala 0
17 godina
neaktivan
offline
Asembler 68k

Tvoja "poruka" je label. Dakle što se događa u pozadini... String se fizički mora nalaziti negdje u memoriji. Tokom prevođenja u binarni kod osim instrukcija, u memoriju se upisuju i podaci. Svaka instrukcija se nalazi negdje, na nekoj određenoj adresi, tako i tvoj podatak se nalazi na nekoj adresi. Label poruka je početna adresa tvog stringa (poruka + 1 bi bio 2. znak, poruka + 2 3. znak itd.). Kada prebacuješ "poruku" u registar, ne prebacuješ string, nego 32-bitnu adresu na kojoj se on nalazi, odnosno adresu na kojoj se nalazi prvi bajt tog stringa. Nadam se da ti je malo jasnije.

0100001001101111011010100110000101101110
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Re: Asembler 68k

pokusat cu ti i ja pojasnit iako je vec uglavnom sve napisano...

 

ako si dosad ucia C++ susrea si se s pojmom pokazivaca. Registar A1 je prvom naredbom definiran kao 32-bitni pokazivac na blok adresa stringa "Hello world". Ovaj .B na labeli poruka oznacava ti da slijedi niz byteova, inace mozes odabrat i .W (16bit) ili .L (32bit), a ovisno o tome ce se vrsit aritmetika pokazivaca prilikom iscitavanja navedenog bloka podataka. 

U registru A1 si iscita 00001012 i to ti je hex adresa na kojoj se nalazi pocetak tvog stringa, odnosno A1 pokazuje na upravo tu adresu. Na samoj adresi 00001012, ako imas uvida u nju trebalo bi se nalazit nesto slicno ovom: 48656C6C ili 6C6C6548 ovisno kako motorola to zapisuje (inace ne programiram u m68000 asembleru), a sto ce odgovarat Hell, odnosno lleH. Ako netko zna tocno, nek napise. 

Bilo bi neefikasno koristit 32 bita za zapis 8 bitova jednog slova, pa zato i navodis .B kao velicinu svog jedinicnog zapisa. 

 

Edit: malo sam bacia oko, i ovisno o broju znakova, onaj koji se prvi pojavljuje se zapisuje kao najvazniji od X byteova, npr. za 1 znak, bilo bi 00000011, za tri bi bilo 00112233, gdje bi string bia hex vrijednost 112233 u ascii kodu. dakle, u tvom primjeru, na adresi 00001012 tribalo bi pisat 48656C6C. Nadam se da ce pomoc... 

Poruka je uređivana zadnji put sri 2.11.2016 13:43 (wifi).
16 godina
offline
Re: Asembler 68k

-ako pokušavš 'razumjeti' .. pogrešno predočavaš što/kako radi računalo (zapravo CPU, bilo koji chip, tranzistor).

npr, ne, ne radi PC (nevažno koja arhitektura, x86, 68 itd.) s hexovima, (kao ni s decimalnim) nego binarno, nula-jedan, stanje tranzistora, upaljeno-ugašeno. Problem je baratati s binarnim brojkama (i naredbama), zbog npr duljine, lakše nam je dec. dok je hex 'kompatibilniji' (kao između, zbog višekratnika baze 2-16, tj lakše ga je 'napamet' preračunati kad je to portrebno). Još lakše je ako radiš (u glavi) s niblovima (4-bit=pola bytea, 0-15, 1111) jer dva su 8 bitna, 4 su hex.. npr FFhex = F-F nibl = 15-15, bin 1111 1111 =255dec. Ali, to je samo za matematiku, zapravo nevažno (mada je to zapravo jedino što se u školi/školskim primjerima spominje o bin-hex računanju. Tj to je važno ako govorimo o brojevima, računanju. .. no trebaš izbaciti 'broj' iz glave, nije to broj, to je podatak, bilo što. Može biti slovo, naredba, vrijednost.. može biti boja pixela slike ili nota pjesme. Zapravo kad bi otvorio npr mp3 kao text vidio bi 'čvrčke', da pustiš neki text u media playeru vidio bi audio-buku .. šum.

- sve je memorija, sve je memorijska adresa (ne razmišljati samo kao RAM, jer ram je samo skladište, memorijska adresa je i sam registar, naredba ili podatak). Adresa postoji uvijek, neovisno imaš li više-manje RAMa, kojeg ovisno o količini moraš adresisrati (da bi ga koristio). Kad bi to preveo na kuće/ulice.. nekog grada, tad je RAM broj kuća/građana (recimo veličina), dok su adrese uvijek adrese i bez njih ništa ne funkcionira (izgubljen podatak, difunkcionalan grad).

 

- pogledaj ''nešto digitalnog'' npr CD audio, pogledaj par sketora HDDa (nevažno koji file), DVD-videa, slike, .. što se vidi (opet, ne misliti o hex-dex ili chr$ prikazu editora koji ovisi o editoru-mogućnostima) -vidiš, nule-jedinice, beskonačni niz. Vidiš nešto što možeš usporediti s telegrafskim točka-crtama.. 001010100011110010101011110011011111010110001110101 apsolutno je nevažno to što sam natipkao (kobasicu) kao binarni broj, jer to nije broj, to je ... 'ništa'. Tj, to je ono što mi kažemo da je, npr može biti 8bitni podatak za audio, grafiku, text, može biti telefonski broj, može biti adresa, ime, može biti naredba, može biti baš bilo što. Interpretacija je bitna (+ standardi, + jednako kao u komunikaciji, +jednako ako i telegraf .. tj, moraš zanti što je početak, ''=prvo slovo!''). U komunikaciji npr modem, to je znak AT, kod MS-DOS/.exe je MZ .. kod filea je to header (unutar kojeg je opis, kodek, format.. osnovne info, ili ništa, čak i bez extenzije jer extenzija ne postoji, to je samo naša oznaka zbog lakšeg prepoznavanja sadržaja). Telegraf ima određenju kombinaciju (ne znam točno, recimo..) - - - x3 kao i SOS ...---... tj kad vidiš taj uzorak, znaš što je. OD tog kreneš. Tako radi npr video player s medija kao DVD. Nakon tog, idući podatak je sam pixel (u slučaju video playera) kao podatak kojeg treba pročitati, obraditi i poslati na ekran, kraće (preskočeno) poslati na ekran kao stream, pa idući bit, pa iduči.. itd.. do kraja filma.

Kako to radi 'chip'? Sve je sofware/file. Od bootanja računala, bios pointerom pokaže na loader, loader na OS, os učita potrebno (driver..) i pokrene aplikaciju, sve to su pointeri-adrese, sve to su nule-jedinice, ali u ovom slučaju ne kao podatak-broj/text nego izvršni/aplikativni (apps vs DATA). Dok je dio zapravo DATA, npr boja ekrana, pozadinska slika, buttoni.. to su interni DATA, podaci same app/OSa, ne korisnički podaci nekog filea kao slika-text. Ona gore natipkana 'binarna kobasica' (izmišljena, random..) se možda pojavi slučajno kao uzorak bezbroj puta, možda nikad. Jednom je to možda funkcija eksplozije spritea na ekranu, drugi put je možda index baze, treći put par slova s bug foruma :)..

 

File System, (u komunikaciji pandan start-stop biteu, tj standardu), FS kao NTFS (fat, ext..) brine o samom fileu, ne moraš tražiti početak-kraj .. (btw, tako radi soft za spašavanje podataka/particija.. čita i traži oznake, btw2 ne postoje particije-folderi, to su samo oznake, sve je file, sve su nule-jedinice, sve je to memorija tj adresa, razlika je samo medij, hdd, ram, cpu.. tj trajni, privremeni i u upotrebi podaci). Editor tad ne traži po disku, nego dobije adresu početka i kraja filea, (editor može biti video, text, audio.. što god, soft-apps tj ono nešto što barata s podacima).

Kako radi CPU? Konstantno, iz memorije (RAMa) uzima podatke i vraća (stavlja) ih. Sve ide kroz CPU i RAM, ako je na HDDu, mora se učitati u RAM. CPU je pak 'jako glup tranzistor'.. vrlo sličan mravu ili još gluplje prekidaču za svjetlo na zidu.. on-off. No to što ih ima par milijardi ga čini moćnim. U jednom ili više ciklusa CPU učitava, obrađuje, sprema podatke. To se naziva computing, obrada :)

Takav glupi chip, učita nešto s neke adrese, to negdje stavi, napravi nešto s tim, prosljedi negdje.. (sad sve ove riječi nešto/negdje.. zvuče još gluplje, ali to je to) :))

Da je hrpa žerulja i prekidača na zidu, vidjeli bi to i bilo bi lako za razumjeti, npr da tako paljenjem-gašenjem 'nacrtamo' nešto, nevažno jel to broj, slovo, znak.. kao prvi 'kompjuteri' s bušenim karticama tj tkalački strojevi .. e da, tako je to započelo. Takav 'glupasti' uzorak (pattern) za tkanje, pohranjen u drvenoj pločici koja propušta igle-konac.. i dobiješ šareni šal ili stoljnjak. Iste te rupe, nule-jedinice mogu biti bilo koji podatak, Touring, kad se to shvatilo izmišljen je kompjuter, koji može obaviti zapravo bilo koji zadatak. Prevedeno, bilo koji CPU može bilo što, samo ga treba isprogramirati, nahraniti podacima .. i čekati :)

Tu dolazi arhitektura, noviji-jači .. što to znači? Pa da imaju više (glupih) tranzistora, koji opet kad ih je puno, mogu sve, jel to neka funkcija kao log/korjen, zbrajanje, teselacija-VGA, sve to je isto, samo 'jače'. Sve je zbrajanje (više razine), koje kad odvojiš specijalizirane tranzistore može izuzetno složene operacije koje bi trajale tisućama ciklusa izračunati u jednom (nekoliko) ciklusa.

npr (već spomenuto, CPU može samo zbrajati), oduzimanje je binarno, s komplementom dvojke.. prevedeno, 5-3=2 .. ako nema oduzimanja, komplement (dec) broja 3 je 7, 5+7=12 odbacuje se višak (komplement komplementa 8) i dobiješ rezultat 2. Tako radi CPU. .. i sad smo blizu tvog pitanja :)

npr u dekadskom sustavu nam je lako množit s 10, samo 'dodamo' nulu. U binarnom je množenje s 2 ista stvar.. tj TAX bit (rotacija, unutar registra). 3x10=30, 3x2=6.. bin 0011 x2? ista stvar, samo pomaknuti (rotirati) bit(ove).. pomaknuti ih uljevo (i dodati na kraju nulu-nova znamenka, kao i pamtiti prvi broj.. tj njega se nekad odbacije, nekad koristi..). tad se dobije 0110 .. =4+2=6. Pošto nisu direktno usporedive baze, 10 i 2 .. kad se množi s 10 može npr x8 (2x2x2) + 2x .. = 3x10 =  0011 x2x2x2 +0011 + 0011 (jasnije?) .. tri puta pomaknemo uljevo ( i odmah ćemo dodati još znamenki, zbog duljine 'nule ispred'): 0000 0011->0000 0110 -> 0000 1100 -> 0001 1000 koji je to broj? (ne još računati, samo za vježbu, gledati HEX-niblove! 18 hex = 16+8), pa dodati (teško ovako pisati, potpisivanjem dva puta bin 3).. skratit ćemo na 6. broju 24 dodati 2x3.. = 30. Istina, CPU je mogao potrošiti deset ciklusa zbrajanja broja 3 i izračunati, no ovako je imao samo 5 ciklusa i vrlo jednostavnu funkciju shiftbita (rotacije, podsjetnik kao množenje/dijeljenje s 10 u dekatskom). U HEXu je to 'lakše' (naravno nakon godina baratanja s bin-hex, treba vrijeme-rutina), 18h+6h=1(14)=1Ehex. (1F=31, 20hex=32..). Zbog tog se koristi hex, jer je bliži bin bazi, često sam broj nije važan, kad je potrebno tek tad ga se pretvara u humanreadible.. dekadski. Hrpe fileova (ne znamo koji-što) kad gledaš editorom, vidiš upravo hex.. 'čvrčke' ili txt-kod (ASCII) za prikaz na ekranu-textu. Pri tome ne znaš jel neka oznaka naredba ili podatak, tj moraš znati strukturu filea (uputu z akorištenje).

 

Ta funkcija se koristi konstantno, ne samo za matematiku-množenje/dijeljenje, nego za sve s prikazom na ekranu, tj scroll. Tad samo računanje nije ni potrebno, tj nevažna je sama vrijednost, nego je cilj pomaknuti sliku s ekrana npr za jedan pixel ili deset, proizvoljno u stranu, scrollati (gore-dolje/lijevo desno..) u tome je sam binarni broj 'kobasica' nevažan, tj ne govori nam ništa, tj sadržaj na ekranu je isti, samo pomaknut (+ vidljiv dio na ekranu).

Kako to radi CPU? .. registrima, nisu svi isti (iste funkcije), mada spomenuto 68k 32bitni (sporedno, tj trebaju biti samo dovoljno veliki za držanje podatka, tj ako nisu, tad se ista stvar dijeli-množi posao.. ali osnova je ista, imao 32 bitni ili 8 bitni registar..). Jedini besmislen bi bio jednobitni tj to bi bio jedan tranzistor s jednim stanjem (koji tad ne može ništa više). Tad se uvodi oznaka Lo-Hi bit .. hi je prvi, kao važniji (veći broj-vrijednost) dok se većina matematike obavlja na lo-nižem kao da gorimo o milionima 1.000.001 + 3, .. zapamti se milion, računa se manje vrijedna znamenka 1+3=4 milion se prepiše ako nije došlo do promjene HI bita.. (kao množenje/pretek 3+7=10 znamenka više..). Sad opet na tkalački stan, da se u tkanju želi pomak uzorka (scroll) jednostavno bi se dodali-zarotirali redovi-nizovi rupa na drvenoj pločici, jednako tako trčeći display-reklama ispisuje stanje na cestama, vijesti.. ne računa se 'slovo A' nego se bitovi-pixeli shiftaju paljenjem-gašenjem po displayu, pri tome je sam broj sporedan (i nema potrebe izračunavati ga).

Registri, jedni upravljaju ulazno-izlaznim podacima (služe samo tome, dohvaćanju), iz njih tad 'glavni' reg. uzima vrijednost, stavlja međurezultate.. i možemo ih podijeliti u npr ALU .. a sad je i GPU unutar CPU kao x86 i koprocessor x87.. to su samo specijalizacije + 32-64 bita širine sabirnice (koja služi onoj važnoj stvari, adresiranju).. jer svaki registar, podatak, mora biti negdje, gdje? Adresa. To je memorija, tj pointer-adrsa, na podatak koji obrađujemo i njegov rezultat.

-PEEK-POKE? Da, iz (neke) mem adrese, učitaj ili zapiši stanje, nekad davno, tako su se hackali leveli-životi u igrama.

 

Binarni zapis, nule-jedinice, hex kao kraći .. usporedba kao naša abeceda i kinesko (fonetsko) pismo. PC uvjek radi s binarnim, neovisno kako mi to vidimo-programiramo.

-tu dolaze jezici više razine, kao C naviše. Mi tad ne kažemo PCju da upali raster od točkica za npr slovo A, nego mu kažemo da ispiše chr$(65) koji je kao DATA snimljen .. u nekoj mem lokaciji, cpu uzme adrese, pročita sadržaj i ispiše ga oept na neku adresu koja je sad VGA-ekran/pozicija slova + boja itd. Strojno je to zamorno, kao pikanje goblena (tkalački stol), mi jednostavno višem jeziku zadamo što želimo, dok kompajler to prevede u strojni. Asembler je najniži oblik, zamoran, ograničen mnemoničkim oznakama, specifičan za svaku arhitekturu... ali može sve (zapravo svaki može sve, to znamo od Touringa). Viši jezik može samo one rutine koje smo napravili, npr krug-circle, zada se radijus, ispuna, smjer, boja, koordinate.. i cpu to prevedeno izvrši. Apsolutno je svejedno radio ti to u višem jeziku kao C/Basic ili asembleru ili peekpokaš hexloaderom :) .. no ima jedna razlika. Veličina (rastrošnost) generiranog koda + prošlo stoljeće (kao dinosauri) u odnosu na raspoložive količine dostupne memorije-RAMa. Nekad je sve bilo u KB, danas u GB.. ne moramo brinuti jel kompajler bahato potroši 532bayta više od ručno natipkanog koda za isti rezultat. Viši jezik toliko ubrzava razvoj-izradu (i održavanje) da je dodatna ručna optimizacija nepotrebna (kontraproduktivna) + sve je već izuzetno optimizirano, prošla su vremena kad je sve bilo novo, novi algoritmi i sl. (npr razni sort algoritmi, bubble, jet, shell.. ) Dobro je znati assembler, dobro je znati matematiku.. no RL, koristi se calculator, treba imati ideju, napraviti. Strojni jezici i osnove su samo onako.. poželjno da netko i to zna, kao i popraviti prvi automobil-ford.. ali nije nešto korisnog za 99,9999% ostalih u ITu.

 

za svaki jezik-platformu imaš hello world primjer. S nižim jezicima kao strojni-assembler, nećeš baš ništa vidjeti osim ako već imaš ogromno znanje-rutinu s konkretnim ass, dok će ti za više sve biti jasno neovisno o platformi ako znaš bilo koji od 'popularnih' jezika. Razlika, ono što PC-soft radi umjesto nas kao prevođenje i (uvijek) konačni rezlatat koji je razumljiv strojevima a to su nule-jedinice, kojim god soft kreneš ispod haube je 0-1.

.. u ass nećeš vidjeti string hello .. kao nešto prepoznatvljivo, vidjet ćeš samo mnemonike (koji su slični ali i različiti za razne asemblere) koji ti govore samo osnovnu naredbu, ali te naredbe su low.. i tek više njih daje smisao (kao što jedno ili nekoliko slova ne govori ništa o knjigi). Što god vidiš, to su naredbe koje iz reg.A prebacuju u reb.B-X.., zbrajaju, vraćaju u memoriju (zapravo u mem.adresu a to može biti RAM, može VGA, printer..)

-učenje motorole ass može biti gubljenje vremena, znanje jednog ass ne pomaže na drugoj platformi mada je svako znanje ipak prednost. Problem je što moraš biti 'majstor' a za to treba i vrijeme, dok svladaš ass za mrtvu platofmu možeš raditi 'korisnije' stvari višim jezicima. (npr java, ali i nju se planira ubiti.. zbog sigurnosti, kako god okreneš, drž se C-a, dovoljno između svih jezika-svjetova).

 

+ btw, adresna sabirnica, registri, ne moraju biti npr 32-ili-64bit.. npr intel za ograničenje dostupne memorije (adresni prostor), koristi npr 36-40-48 bit, to nije ono što se podrazumjeva kad se kaže 32-64 bitna platofrma. Druga razlika su RISC-CISC razlozi/prednosti/mane tj potrošnje resursa, neka radna stanica (specijaliziran komp) može biti brža na RISCu, ali bi bila rastrošna/spora za ostale taskove kao playanje audia i sl. što radi običan PC-mobač.. intel je odavno od Pentioma ubacio kao hibrid, koprocesorski dio kao risc, dok je ostatak cisc. Sad se npr CUDA-GPU korsite za takve specijalizirane stvari, tako da je intelova filozofija 'bolja' (dobra, optimalna). Inače je 'lakše' kad CPU ne mora razmišljati o različitim tipovima podataka.. a to je npr single-double, long itd.. to je direktno povezano s radom u ass i registrima (mogućnost, time i način kako će se nešto napraviti).

Uvjek su osnovni kriteriji, (prvi, jedini), 'da radi', zatim da radi bolje/brže, dodatne mogućnosti.. ili manja potrošnja (resursa). KISS kaže bjež od asemblera i registra, život je (pre)kratak. 68 je generacijski i386, danas beskorisno što se tiče snage dok i mobiteli danas imaju na raspolaganju više RAMa nego nekad superračunala (uz podsjetnik na B.Gatesovu izjavu o 640KB RAMa.. a to je doba kad je ass već nestajao iz upotrebe).

C64/TurboModul-OpenSourceProject.org.cn.部分作品为网上收集整理,供开源爱好者学习使用
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice