tasm/masm tyylillä linuxissa?

Linuxin käyttämä assembler on käytännössä estänyt assemblerin lisäopiskelun hankaluutensa tähden. Nyt kysynkin, että onko mahdollista käyttää Borlandin tyyliä linuxissa? Entä onko jossain jotain nettikurssia, josta saisi kickstarttia opiskeluun? Viimeksi kai tehnyt vuonna miekka ja kypärä ms-dos aikana ruudulle tulostavan pelin assemblerilla..
Ilmianna
Jaa

13 Vastausta



Ylläpito on poistanut tästä viestin sääntöjen vastaisena.

Ilmianna
Jaa

Ylläpito on poistanut tästä viestin sääntöjen vastaisena.

Ilmianna
Jaa
dosboxissa toimii tasm ihan ok.

Joten mikä on ongelma?

Toki dosbox vaatii hieman virittelyä alussa, mutta sen jälkeen toimii ok.
Ilmianna
Jaa
Intel ainakin tarjoaa ilmaiseksi assemblerin omille prosessoreilleen ilmaiseksi, en ole itse vähään aikaan kokeillut sitä, mutta pitäisi olla sitten kaikki uusimmat prosessoreiden ominaisuudetkin pitäisi olla tuossa. IDE-liittymää tuossa ei tainnut olla.
Ilmianna
Jaa
ASM-koodin lisäys Lazarus ohjelmassa, taitaa just mennä samoin kuin Delhissäkin.
Tuossa esimerkki, jossa Edit1 kentästä poimitaan luku, ja siihen lisätään 255, ja tulos annetaan Edit2 kentässä.

https://imgur.com/KdPXFIM
Ilmianna
Jaa
Jos toimitaan niin matalalla tasolla, että tarvitsee assembleria, sitä kutsutaan C kielestä.

Silloin helpoin tapa on käyttää kääntäjän inline assembler toiminnallisuutta. Homma käy helpoiten kun kirjoitat ensiksi C:llä sen mitä haluat. Sitten #ifdef:iä käyttämällä voit kytkeä assembler version koodista ja sinne sekaan pätkä inline assembleria.

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
Ilmianna
Jaa
Assemby -kielen käyttö osana ohjelmaa on helpompaa Objectpascalissa kuin C -kielessä.
Sekä Delphi että Freepascal mahdollistavat aliohjelmien tai niiden osien kirjoittamisen Assemby -kielellä.

C -kieli ei tarjoa mitään etuja Objectpascaliin verrattuna, sensijaan C -kieli on huomattavasti virhealttiimpaa.

C -kielessä ei esim. ole lainkaan mahdollisuutta automaattisiin indeksitarkistuksiin,
Objectpascalissa ne saa päälle ohjauslauseella {$R+}

Kun ohjelma käännetään {$R+}
-tilassa, ei ohjelma voi viitata taulukkoon taulukon ulkopuolelle osoittavalla indeksillä,
vaan yritys tällaiseen laukaisee ERangeCheckError -poikkeuksen (tai runtime errorin, jos poikkeukset eivät ole lainkaan käytössä ohjelmassa).

Lisäksi C -kääntäjä tekee assembly -kielen käytöstä hankalaa Constraints -säännöillään, joiden dokumentointi on sekavaa.

Delphi sensijaan esittää asian hyvin selkeästi:

32 -bittisessä Delphissä 3 ensimmäistä parametria (jos ovat tyypiltään sopivia) menevät rekistereihin EAX, EDX, ECX (tässä järjestyksessä).

Funktion tulos menee AL / AX /EAX -rekisteriin, tai Int64 -tyyppinen tulos rekisteripariin EDX:EAX.

M-Karin höpinät kannattaa jättää omaan arvoonsa, kuten aina !

esimerkki:

function Testi(Foo, Bar, Baz:Longword):Int64;
asm
push ESI
mov ESI, EDX // ESI := Bar
XOR EDX, EDX
add EAX, ESI
adc EDX, 0 // EDX:EAX := Foo + Bar
add EAX, ECX
adc EDX, 0// EDX:EAX := Foo + Bar + Baz
pop ESI
// EDX:EAX := Foo + Bar + Baz;
// 64 -bittinen tulos jätetään EDX:EAX -rekisteripariin.
end;

C -kielellä Constraints -säännöt tekevät tästäkin yksinkertaisesta esimerkistä hankalan toteuttaa oikein.

Delphi on fiksusti dokumentoitu, eikä siinä ole jotain käsittämättömiä Constraints -sääntöjä hankaloittamassa ohjelman saamista oikein ja virheettömästi toteutetuksi.

Lisäksi Delphi IDE:stä löytyy hyvin tehty Debuggeri, josta saa myös rekisterit näkyviin ja askeltaa voi F7 (step into) ja F8 (step over) -komennoilla.

Jos valitset Delphin (Delphi 7; pieniä eroja voi olla eri versioissa) valikosta:
View/Debug Windows/C PU

CPU -ikkunassa voit askeltaa yksi konekielikäsky kerrallaan.

M-Karin päinvastaisista väitteistä huolimatta:

Delphi on väline, jolla homma saadaan oikeasti toimivaksi, ja käyttö on selkeää, ja dokumentteja löytää joko Delphin omasta HELP -systeemistä, tai netistä embarcadero:n sivuilta,
Kommentoi
Ilmianna
Jaa
2 VASTAUSTA:
Tämä on täyttä asiaa, ja pitää myös paikkansa.
Kommentoi
Ilmianna
Jaa
"Assemby -kielen käyttö osana ohjelmaa on helpompaa Objectpascalissa kuin C -kielessä.
Sekä Delphi että Freepascal mahdollistavat aliohjelmien tai niiden osien kirjoittamisen Assemby -kielellä.

C -kieli ei tarjoa mitään etuja Objectpascaliin verrattuna, sensijaan C -kieli on huomattavasti virhealttiimpaa."

Assember on virhealttiimpaa kuin C.

Tässä nyt haetaan matalantason ohjelmointia, ja silloin C on parempi kuin ObjectPascal koska C on defacto standardi siellä systeemiohjelmoinnissa, siellä missä tarvitaan assembleria.

C-kieli itseasiassa on korkean tason assembler. Yleensä ikinä ei tarvitse kirjoittaa assembleria vaan voi käyttää C:tä mikä on siirrettävää ja vähentää virheitä assembleriin nähden.

Jos sitten haluaa selkeätä ohjelmointia ja välttää virheitä, unohdetaan C:t ja Pascalit ja käytetään vaikka Haskell kieltä. Siinä kun on tehty virheiden tekeminen äärimmäisen vaikeaksi.

"C -kielessä ei esim. ole lainkaan mahdollisuutta automaattisiin indeksitarkistuksiin,
Objectpascalissa ne saa päälle ohjauslauseella {$R+}"

Indeksien tarkistus kertoo siitä, että koodi on virhealtista koska sehän tarkoittaa, että ohjelmassa tallennetaan tilaa indekseihin.
Kommentoi
Ilmianna
Jaa
+Lisää kommentti
<lainaus>
"C -kielessä ei esim. ole lainkaan mahdollisuutta automaattisiin indeksitarkistuksiin,
Objectpascalissa ne saa päälle ohjauslauseella {$R+}"

Indeksien tarkistus kertoo siitä, että koodi on virhealtista koska sehän tarkoittaa, että ohjelmassa tallennetaan tilaa indekseihin.
</lainaus>

M-Kar sekoilee jälleen!

Ensisijainen tapa estää puskurin ylivuodot / kirjoitus taulukkoon tai luku taulukosta asiallisen indeksialueen ulkopuolella on tietenkin: Se, että koodataan huolellisesti niin, että käytetyt indeksit ovat oikeita.

Delphin ja FreePascalin selkeä syntaksi auttaa tässä!

selkeä syntaksi = vähemmän haittatekijöitä, jotka vievät ohjelmoijan huomion pois olennaisesta, ja siten kasvattavat mahdollisuuksia tehdä virheitä C -kielen tapaan.

Se, että C -kieltä on paljon käytetty systeemiohjelmoinnissa EI millään tavalla tee C -kielestä hyvää systeemiohjelmointityökalua. Myös systeemiohjelmointiin esim. FreePascal on parempi vaihtoehto.

Entä ne indeksitarkistukset?

Ne EIVÄT OLE tarkoitettu huolellisen ohjelmointityön korvikkeeksi, näin ollen niiden käyttäminen ei millään tavalla tee koodista virhealtista, kunhan perusasia eli huolellinen ohjelmointityö tehdään oikein.

Sensijaan niiden indeksitarkistusten idea onkin tämä:

JOS ohjelmoija on pyrkinyt tekemään huolellista ohjelmointityötä, mutta on mokannut tässä, tällöin tulee esille indeksitarkistukset päällä käännetyn ObjectPascal -koodin paremmuus verrattuna esim. C -kielellä tehtyyn koodiin:

C -kielellä tehdyssä koodissa virhe taulukon viittauksessa kielletyllä (eli liian pienellä / liian suurella) indeksillä aiheuttaa suoraan puskurin ylivuodon (kirjoitus: hyökkääjä voi työntää omaa koodiaan tietojärjestelmän suoritettavaksi; luku: hyökkääjä voi luke tietoja, joihin hänellä ei ole oikeutta, eli esim. vakoilla salasanoja, salausavaimia, luottokorttinumeroita jne.)

ObjectPascal -koodissa, joka on käännetty indeksitarkistukset päällä,
jos ohjelma yrittää viitata kiellettyyn indeksiin taulukossa (mikä on tietenkin ohjelmointivirhe, joka pitää korjata niin pian kuin mahdollista), niin tästä aiheutuu poikkeus ERangeCheckError, ja em. poikkeus aiheutuu ENNEN KUIN väärää muistiosoitetta luetaan tai sinne kirjoitetaan.

Eli indeksitarkistukset estävät väärän muistiviittauksen ja aiheuttavat poikkeuksen.

Siis ne 2 kaikista pahinta vaihtoehtoa, eli joko:

a) se. että hyökkääjä pääsisi työntämään omaa konekielikoodiaan järjestelmän ajettavaksi

tai

b) se, että hyökkääjä pääsisi asiattomasti lukemaan salaisia tietoja, joiden ei pitäisi olla hänen saatavillaan

on molemmat automattisesti estetty indeksitarkistukset päällä käännetyssä Objectpascalissa.

Tämä on merkittävä etu esim. C -kieleen verrattuna.

mm. HeartBleed -haavoittuvuus on selainen, että jos OpenSSL olisi tehty Objectpascalilla ja indeksitarkistukset päällä eikä C -kielellä, niin tuota HeartBleed -haavoittuvuutta ei olisi koskaan tapahtunut.

Toki, jos OpenSSL olisi koodattu Objectpascalilla ja indeksitarkistukset päällä, mutta jos ohjelmoija muuten olisi tehnyt saman mokan kuin C-kielellä ohjelmoinut koodaaja teki,
niin vaikka tuota pahinta ei olisikaan tällöin tapahtunut, niin jatkuvat
ERangeCheckError -poikkeukset toki silti mahdollistaisivat palvelunestohyökkäyksen (mutta eivät tietojen varastamista eikä rikollista haittakoodin suorittamista).

Eli kuten esimerkistä näemme, niin nuo indeksitarkistukset kyllä estävät ne 2 pahinta vaihtoehtoa, mutta ne eivät ole korvike huolelliselle ohjelmointityölle, vaan ne ovat hätävara, joka estää ohjelmointivirheen muuttumisen täydelliseksi katasttrofiksi.

Jos siis ohjelmassa havaitaan virhe, niin ko. virhe on aina syytä korjata.

On käsittämätöntä, ettei ohjelmoinnissa ole ollut tapana vaatia samaa korkeaa laatutasoa kuin muilla teollisuuden aloilla.

Tähän olisi syytä tulla muutos, ja ObjectPascal on parhaita kielivalintoja laadukkaan lopputuloksen aikaansaamiseksi.
Kommentoi
Ilmianna
Jaa
1 VASTAUS:
Ei mennä nyt johonkin hardware-tason käyttöjärjestelmän sisäisiin toimintoihin, eikä aivan näin emolevyjenkään DMA-muistisiirtoihin, ehkä _D

Ihan sama mikä salaus onkaan, jos pelataan emolevyn ja komponenttien välisillä tiedonsiirroilla aivan suoraan ilman mitään softaa, pelkästään kun käynnistän ohjelman nimellä "debug", siitä alat tekemään assembly-kieltä itse ;D
Kommentoi
Ilmianna
Jaa
+Lisää kommentti
At%T syntaksi oli jonka linuksi otti omakseen, itse muka keksi _D_D

Eräs juttu on mielenkiintoinen, kun siirrellään ohjelmakoodia grafiikkaprosessorin muistiin, aina pitää käyttää DMA-siirtoa fyysisten muistien välillä, ja DMA-kanavat 0-3 ovat tuollaisia nopeita kanavia joille vai laittaa "tilaukseen muistisiirtoja", koodeja tai mitä nyt sitten haluaa..

Tietysti vaatii järjestelmänsuunnittelijan oikeudet, sitten tuollaisten tekeminen...
Kommentoi
Ilmianna
Jaa
1 VASTAUS:
"At%T syntaksi oli jonka linuksi otti omakseen, itse muka keksi _D_D"

Onko tämä taas sarjassaamme "valeuutisia"?
Kommentoi
Ilmianna
Jaa
+Lisää kommentti
Apinat roikkuu puussa nurinkurin...
Kommentoi
Ilmianna
Jaa
1 VASTAUS:
Aivan näin: AT&T assembly syntaksi on juurikin näin eli toisin kuin Intelin syntaksissa kohteet mihin laitetaan mitäkin juttuja ;)
Kommentoi
Ilmianna
Jaa
+Lisää kommentti

Vastaa alkuperäiseen viestiin

tasm/masm tyylillä linuxissa?

Linuxin käyttämä assembler on käytännössä estänyt assemblerin lisäopiskelun hankaluutensa tähden. Nyt kysynkin, että onko mahdollista käyttää Borlandin tyyliä linuxissa? Entä onko jossain jotain nettikurssia, josta saisi kickstarttia opiskeluun? Viimeksi kai tehnyt vuonna miekka ja kypärä ms-dos aikana ruudulle tulostavan pelin assemblerilla..

5000 merkkiä jäljellä

Peruuta