Προγραμματισμός σε συμβολική γλώσσα (GNU συστήματα - αρχιτεκτονική x86)

Από Βικιβιβλία

Το βικιβιβλίο αυτό να αποτελέσει ένα πρώτο βήμα σε όσους δημιουργούς λογισμικού και επιστήμονες πληροφορικής θέλουν να κάνουν τα πρώτα τους βήματα στον προγραμματισμό επεξεργαστών της αρχικεκτονικής εντολών x86 σε συμβολική γλώσσα (assembly) σε συστήματα GNU , όπως GNU/Linux , GNU/Hurd.

Η αρχικεκτονική εντολών x86 χωρίζεται σε x86-16, x86-32(x32) και x86-64(x64).

Πλεον εν έτη 2009 η περισσότεροι καινούργιοι επεξεργαστές είναι x64, (πχ όλοι οι core και xeon της intel) τ αρχιτεκτονική την οποία θα δείτε και με τα ονόματα AMD64, Intel64 αν και προτειμάμε να ανεφερόμαστε σ'αυτή με το εμπορικά ουδέτερο όνομα x64. Η αρχιτεκτονική αυτή αποτελεί επέκταση της γνωστής αρχιτεκτονικής x86-32 ,που σημαίνει ότι ένας x64 επεξεργαστής μπορεί να εκτελέσει και προγράμματα x32 λειτουργόντας με διαφορετικό τρόπο (γνωστό σαν legacy mode - παραδοσιακός τρόπος λειτουργίας).

Η x64 είναι CISC αρχιτεκτονική συνόλου εντολών που σημαίνει ότι το μήκος μιας εντολής σε byte δεν είναι σταθέρο αλλά κυμαίνεται από 1-17 byte.

Η αρχική μας πρόθεση είναι να ξεκινήσουμε από την κατανόηση της μορφής μιας εντολής σε γλώσσα μηχανής και να αρχίσουμε σιγά σιγά να δημιουργούμε απλά προγράμματα με απλές εντολές.

Το περιβάλλον μας θα είναι GNU/Linux με χρήση AS,LD,GAS ,Emacs, GDB.


Παράδειγμα (x64) cpuid.s[επεξεργασία]

Θα χρησημιποιήσουμε την εντολή cpuid και θα εμφανίσουμε με την βοήθεια μιας κλήσης συστήματος write το όνομα του τύπου του επεξεργαστή μας. Η εντολή αυτή επιστρέφει πληροφορίες αναγνωριστικές της ΚΜΕ στους καταχωρητές EAX,EBX,ECX,EDX

Αρχικά θα δημιουργήσουσε το πηγαίο σε συμβολική γλώσσα αρχείο cpuid.s , χρησιμοποιώντας συντακτικό του GNU Assembler(gas). Η μετάφραση σε γλώσσα μηχανής θα γίνει με την εντολή

$ as -g -o cpuid.o cpuid.s 

Και κατόπιν πρέπει να συνδέσουμε το αρχείο αντικειμενικού κώδικα

$ ld -o cpuid cpuid.o