Assembly - Γλώσσα χαμηλού επιπέδου

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
Αυτες τις ημερες ασχολουμαι ερασιτεχνικα με τον προγραμματισμο σε γλωσσα assembly. Σε αυτο το post θα ασχοληθουμε με αυτην την γλωσσα βημα προς βημα . θα αναπτυξουμε καποια μικρα προγραμματα ωστε να εξικοιωθουμε με την γλωσσα αυτη (απλα προγραμματα-ακολουθιακη εκτελεση του προγραμματος,επαναληπτικες δομες, διαδικασιες , στοιβα,συμβολοσειρες και χαρακτηρες). Οτι αποριες εχετε να ρωτάτε και οτι αποριες εχω θα σας ρωτησω. Τωρα θα παρουσιασω ενα απλο προγραμμα για αρχη το οποιο θα διαβαζει εναν χαρακτηρα απο το πληκτρολογιο και θα τον εμφανιζει στην οθονη. στις απομενες ημερες θα παρουσιασω και αλλα προγραμματα για να τα σχολιασουμε-αναλυσουμε την λειτουργια τους ή κατι αλλο και επισης τον τροπο εκτελεσης εναν προγραμματος assembly. Για την συγγραφη προγραμματων σε assembly χρησιμοποιω το εργαλειο Environ.

Παρουσιαση 1ου προγραμματος σε Assmbly:

title pr2
dosseg
.model small
.stack 100h
.data
nl db 10,13,'$'
mes1 db "Dose enan xaraktira:$"
ch1 db ?
.code
start:
mov ax,@data
mov ds,ax

mov ah,09h
lea dx,mes1
int 21h

mov ah,1
int 21h
mov ch1,al

mov ah,9
lea dx,nl
int 21h

mov dl,ch1
mov ah,02h
int 21h

mov ah,4ch
int 21h


end start
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
Δεν νομίζεις ότι θα πρέπει να εξηγήσεις λίγο την φιλοσοφία πρώτα; Ή τουλάχιστον να εξηγήσεις τι γίνεται στο πρόγραμμα. Να μιλήσεις για καταχωρητές κτλ
Επίσης το πρόγραμμα που έγραψες είσαι σίγουρος ότι είναι καθαρή Assembly;:)
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
Στην περιπτωση που καποιος δεν μπορει να κανει Run για το προγραμμα Assembly να μου στειλει πμ

Υποδειξεις:

Μεταγλωττιση ενος προγραμματος σε assebly: θα πλητρολογησετε στο cmd την εντολη
masm /v/z/w2/zi FileName(ονομα πηγαιου αρχειου π.χ filename.asm)

Για την συνδεση με τις βιβλιοθηκες θα πλητρολογησετε στο cmd την εντολη
link /co FileName(ονομα αντικειμενου αρχειου-object- π.χ filename.obj)

Για εκτελεση απλα FileName(ονομα αρχειου-filename.exe)

Καλη τυχη :)

Download Environ:
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Συνημμένα

  • Environ.zip
    227.1 KB · Εμφανίσεις: 396
Τελευταία επεξεργασία:

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
Ας δωσουμε μερικες θεωρητικες εξηγησεις για αυτο το θεμα. Λοιπον θα προσπαθησω να εξηγησω την αρχιτεκτωνικη των επεξεργαστων 8086/88.

Οι καταχωρητες των 8086/88

Ο 8086/88 περιλαμβανει δεκατεσσερεις καταχωρητες των 16bits. Μερικοι απο αυτους ειναι αφιερωμενοι σε ειδικες χρησεις, ενω αλλοι εχουν γενικη χρηση. Τους διακρινουμε σε τεσσερεις διαφορετικες ομαδες οπως φαινεται παρακατω.

Α. Καταχωρητες Γενικης Χρησης

ΑΧ-Συσσωρευτης των 16bits(AH και AL των 8 bits ο καθενας δηλ. εχουμε εναν καταχωρητη των 16bits απο τον οποιο μπορουμε να χρησιμοποιησουμε αμα θελουμε εμεις τα 8 πρωτα bits(AL) ή τα υπολοιπα bits του καταχωρητη(AH))

ΒΧ-BH Και BL-16bits-Βάσης

CX-CH και CL-16Bits Μετρητης

DX-DH και DL-16bits δεδομενων

Θα εξηγησω τωρα με περισσοτερη λεπτομερια αυτους τους παραπανω καταχωρητες γενικης χρησης

-Ο καταχωρητης AX (Accumulator-συσσωρευτης) χρησιμοποιειται συχνα για την εκτελεση αριθμητικων πραξεων. Μερικες πραξεις εκτελουνται γρηγοροτερα αν χρησιμοποιειται ο AX , ενω αλλες, οπως ο πολλαπλασιασμος και η διαιρεση, πρεπει να γινονται στον ΑΧ.

-Ο καταχωρητης BX(Base-Βάσης) εκτός απο τη γενική χρηση του χρήση έχει και την ειδική. Οταν εμφανιζεται σε μια εκφραση της μορφης [BX], ο συμβολομεταφραστης μεταφραζει την τιμη του ΒΧ σε μια ενεργο διευθυνση και οχι σαν ενα δεδομενο. Αυτου του ειδους η χρηση ειναι η περιπτωση εμμεσου τροπου προσδιορισμου μιας διευθυνσης (indirect addressing). Πιο απλα ο ΒΧ δειχνει τη διευθυνση της αρχης (βασης) ενος πινακα δεδομενων.

-Ο καταχωρητης CX (Count-μετρησης) χρησιμοποιειται σαν μετρητης επαναληψεων για τον ελεγχο βροχων και για την επαναλαμβανομενη διακινηση δεδομενων. Φυσικα ειναι διαθεσιμος και για γενικοτερες χρησεις

- Ο καταχωρητης DX (Data-δεδομενων) χρησιμοποιειται για την αποθηκευση δεδομενων γενικοτερης χρησιμοτητας παρ΄ ολο που και αυτος εχει ορισμενες εξειδικευμενες χρησεις. Για παραδειγμα ο DX περιεχει το υπολοιπο των διαιρεσεων που εκτελουνται στον ΑΧ.

Β. Καταχωρητες τμηματων

Η μνημη του 8086/88 ειναι χωρισμενη σε τμηματα χωρητικότητας 64 Kbytes το καθενα. Η ΚΜΕ εχει αμεση προσπελαση σε τεσσερα τετοια τμηματα οταν εκτελει ενα προγραμμα . Αυτα ειναι:

-Το τμημα Κώδικα (Code segment-CS), που περιεχει τον εκτελεσιμο κωδικα. (π.χ εντολες mov)
-Το τμημα δεδομενων(data segment-DS), που περιεχει τα δεδομενα του προγραμματος (μεταβλητες)
-Το τμημα στοιβας (stack segmen-SS). Στοιβα ειναι μια περιοχη της μνημης που χρησιμοποιειται για προσωρινη αποθηκευση δεδομενων κατα τη διαρκεια εκτελεσης ενος προγραμματος
-Το επιπλεον τμημα (extra segment-ES), που περιεχει δεδομενα του προγραμματος που πιθανον να μη χωρουν στο τμημα δεδομενων

Καθενας απο αυτους τους καταχωρητες περιεχει μια τιμη των 16bits, η οποια αντιπροσωπευει τη διευθυνση (γνωστη και ως διευθυνση τμηματος) απο την οποια αρχιζει καποιο τμημα.

Γ. Καταχωρητες Δεικτων

- DI-16bits-Δεικτης προορισμου
-SI-16bits-Δεικτης προελευσης
-SP-16bits- Δεικτης στοιβας
-BP-16bits-Δεικτης βασης

Δ. Δεικτης Εντολων

Ο δεικτης εντολων-IP, δειχνει την επομενη εντολη που θα εκτελεστει απο το προγραμμα.

πηγή: σημειώσεις συγγράμματος του ΤΕΙ Αθηνών.

Τις επομενες ημερες θα εξηγησω αναλυτικα το προγραμμα Assembly που δημιουργησα. Αυτο γιατι δεν εχω τον απαιτουμενο ελευθερω χρονο για να τα κανω ολα μαζι.

Ευχαριστω για την κατανοηση. :)
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Επεξεργάστηκε από συντονιστή:

Skeptikistis

Νεοφερμένος

Ο x-tian αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 59 ετών και επαγγέλεται Προγραμματιστής/τρια. Έχει γράψει 43 μηνύματα.
Δεν κατάλαβα γιατι χρειάζεσε το environ για να γράψεις κώδικα Asm.
ο editor toy dos den soy kanei?????/
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

snookeraas

Νεοφερμένος

Ο snookeraas αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Φοιτητής/τρια και μας γράφει απο Αιγάλεω (Αττική). Έχει γράψει 10 μηνύματα.
Για την κωδικοποίηση μηνυμάτων έχουν προταθεί πολλές τεχνικές. Η απλούστερη είναι η απλή μετατροπή των χαρακτήρων, αλλάζωντας την τιμή. Υλοποιήστε μία PROCEDURE που θα μετατρέπει ένα string, αλλάζοντας κάθε χαρακτήρα στον επόμενο, δηλαδή ο "a" γίνεται "b", o "b" γίνεται "c" κ.ο.κ. Αυτή η PROCEDURE δέχεται προφανώς δύο ορίσματα, τη διεύθυνση του string το οποίο θ'αλλάξει και το μήκος του string (1 byte). Φυσικά, απαιτείται και το κύριο πρόγραμμα που θα ετοιμάζει το string και θα καλεί την PROCEDURE περνώντας τη διεύθυνση και το μήκος του. Άριστο θεωρείται το πρόγραμμα που λειτουργεί σωστά, έχει σωστή procedure, περνά την παράμετρο μέσω στοίβας, αρχικά διαβάζει το string από το πληκτρολόγιο, χωρίς να μεταφέρει τα αρχικά 2 bytes του buffer και προσέχει την περίπτωση εκτός ορίων, δηλάδη όταν ο χαρακτήρας είναι ο 255. Υπόδειξη: Προσέξτε ότι ο επόμενος χαρακτήρας στον κώδικα ASCII είναι αυξημένος κατά 1, δηλαδή αν Α ο χαρακτήρας, τότε ο καινούριος είναι ο (Α+1).


Σημείωση: Το ποστ προήλθε από το θέμα "[Assembly] Κωδικας για την άσκηση"
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Επεξεργάστηκε από συντονιστή:

Subject to change

e-steki.gr Founder

Η Λία αυτή τη στιγμή δεν είναι συνδεδεμένη. Είναι 37 ετών και επαγγέλεται Web developer. Έχει γράψει 15,891 μηνύματα.
Καταρχάς, δεν αναφέρεις πουθενά σε ποιά γλώσσα το θες.
Κατα δεύτερον, δεν αναφέρεις πουθενά που έχεις καταλήξει εσύ.
Το ζητούμενο σου είναι μια έτοιμη λύση για να σε βγάλουμε από τον κόπο; :rolleyes:
Και τι θα μάθεις έτσι;


Σημείωση: Το ποστ προήλθε από το θέμα "[Assembly] Κωδικας για την άσκηση"
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Επεξεργάστηκε από συντονιστή:

snookeraas

Νεοφερμένος

Ο snookeraas αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Φοιτητής/τρια και μας γράφει απο Αιγάλεω (Αττική). Έχει γράψει 10 μηνύματα.
αυτα εχω κανει:
Code:
    TITLE hello1
    DOSSEG
    .MODEL SMALL
    .STACK 100h
    .DATA
    msg db "dose ena string","$"
    maxlen db 20
    store db 20 DUP('')
    xar db 13
    .CODE

;emfanisi mnmatos

    mov ah,09h
    lea dx,msg
    int 21h

;plhktr. mexri 20 xaraktires
    
    lea dx,maxlen
    mov ah,0ah
    int 21h

;pernao sti synartisi ti dieuthinsi toy string
            
    mov dl,xar
    push dx
    mov bx,offset store
    push bx
    
    call crypto
    
    pop cx
    pop cx

     mov ax,4Ch;
     int 21h
    
    ;------------------------------------
    crypto PROC
    
    push bp
    mov bp,sp
    
    
    
    
    
    
        
    
    END


Σημείωση: Το ποστ προήλθε από το θέμα "[Assembly] Κωδικας για την άσκηση"
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Επεξεργάστηκε από συντονιστή:

Subject to change

e-steki.gr Founder

Η Λία αυτή τη στιγμή δεν είναι συνδεδεμένη. Είναι 37 ετών και επαγγέλεται Web developer. Έχει γράψει 15,891 μηνύματα.
Συγγνώμη αν ήμουν κάπως απότομη πριν, απλά είναι κάτι που έχει τύχει πολλές φορές...
Δυστυχώς assembly δεν γνωρίζω, οπότε δεν μπορώ να βοηθήσω :/:
Ελπίζω να σε βοηθήσει κάποιος σύντομα :)
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Dark_kronos

Επιφανές μέλος

Ο Rognan αυτή τη στιγμή δεν είναι συνδεδεμένος. Επαγγέλεται Άεργος/η και μας γράφει απο Ισπανία (Ευρώπη). Έχει γράψει 20,660 μηνύματα.
Υπαρχει κανεις προθυμος να βοηθισει με assembly του mips;
δεν εχω καταλαβει πως θα εισαγω δεδομενα σε εναν πινακα, βασικα το πως θα συμβολισω αυτον τον πινακα, πως θα θεσω ποιες θεσεις μνημης θα εχει, πως θα τον καλεσω... Τα παντα ουσιαστικα..:P
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 11 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

εμμα_τριντεντ

Πολύ δραστήριο μέλος

Η εμμα_τριντεντ αυτή τη στιγμή δεν είναι συνδεδεμένη. Έχει γράψει 1,327 μηνύματα.
πίνακας ακεραίων:

Code:
.data
	msg:.asciiz"Dwste stoixeio gia ton pinaka\n"
	msg1:.asciiz "\n"
	.align 2
	array:.space 120 #akeraios =30x4bytes

.text

main:
	la $9,array #fortonei thn dieu8insi tou pinaka a me thn entolh la->load address
        addi $18,$0,0 #midenizei ton metriti tou loop me thn entolh addi-> add immediate
        addi $19,$0,30 #dinei poses fores 8a ektelestei to loop
l1:
	addi $2,$0,4
	la $a0,msg
	syscall#print dose stoixeio
	addi $2,$0,5
	syscall# diabase akeraio
	add $8,$2,$0
	sw $8,0($9) #filakse sti mnimi me thn entolh sw-> store word
	addi $9,$9,4 #deikse sto epomeno stoixeio
	addi $18,$18,1 #auksise ton metriti tou loop kata 1
	bne $18,$19,l1 #telos tou loop elegxos an dosame ola ta stoixeia me thn entolh bne-> branch not equal

	li $2,10
	syscall#exit

πηγή (λατρεμένος virxen)

+ εντολές
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 11 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

εμμα_τριντεντ

Πολύ δραστήριο μέλος

Η εμμα_τριντεντ αυτή τη στιγμή δεν είναι συνδεδεμένη. Έχει γράψει 1,327 μηνύματα.
Btw δε θέλω να το παίξω σπασικλάκι και τέτοια, αλλά μη περιμένετε, γενικότερα, κανείς να σας κάνει διάλεξη με θεωρίες και σχετικά. Διαβάζεις - ψάχνεις μόνος σου και οι απορίες σου προσέχεις να είναι συγκεκριμένες.

Πχ. τα παραπάνω με ένα google search τα βρήκα και είναι αυτό ακριβώς που θέλεις. Έτσι μαθαίνει κανείς προγραμματισμό κατ'εμέ.

Φιλικά.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 11 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Dark_kronos

Επιφανές μέλος

Ο Rognan αυτή τη στιγμή δεν είναι συνδεδεμένος. Επαγγέλεται Άεργος/η και μας γράφει απο Ισπανία (Ευρώπη). Έχει γράψει 20,660 μηνύματα.
Χμμ... Αυτο το προγραμμα χρησιμοποιει περισσοτερα πραγματα απο οσα ξερω προς το παρων...

Ωραια, αν μη τι αλλο, ετσι μπορω να διαβασω οσα στοιχεια θελω και να τα εισαγω στον πινακα. Οταν θελω να τα χρησιμοποιησω ομως; Να κανω πραξεις με αυτα, να τα εκτυπωσω κλπ;
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 11 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

εμμα_τριντεντ

Πολύ δραστήριο μέλος

Η εμμα_τριντεντ αυτή τη στιγμή δεν είναι συνδεδεμένη. Έχει γράψει 1,327 μηνύματα.
μάλλον πέρασε απαρατήρητο το παραπάνω μήνυμά μου :P
τες
ένα tutorial εδώ

καλό διάβασμα
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 11 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Dark_kronos

Επιφανές μέλος

Ο Rognan αυτή τη στιγμή δεν είναι συνδεδεμένος. Επαγγέλεται Άεργος/η και μας γράφει απο Ισπανία (Ευρώπη). Έχει γράψει 20,660 μηνύματα.
Tutorial μπορουσα να βρω ρε συ, το θεμα ειναι οτι δεν καταλαβενω.. :p Θελω καποιων να μου τα εξηγισει επειδη ειμαι βλακας! :P
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 11 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Πληροφορικάριος

Δραστήριο μέλος

Ο Πληροφορικάριος αυτή τη στιγμή δεν είναι συνδεδεμένος. Μας γράφει απο Αθήνα (Αττική). Έχει γράψει 623 μηνύματα.
Στο τμήμα δεδομένων δηλώνεις τον πίνακα:

.data
arr:.word 0 0 0 0 0
.
.
.
εδώ έχει δηλωθεί ένας πίνακας με όνομα arr τύπου word(για αποθήκευση τιμών 32 bit) 5 στοιχεία αρχικοποιημένα με τιμή 0.

στην main

main:
la $t0,arr
η εντολή αυτή κάνει load address δηλαδή φορτώνει την διέυθυνση αρχής του arr στον καταχωρητή $t0.
(η διεύθυνση αρχής ενός πίνακα είναι η διεύθυνση του πρώτου στοιχείου του)
για να φορτώσεις τα περεχόμενα του πρώτου κελιού του arr στον καταχωρητή $t1 :

lw $t1,0($t0)
(load word)
το 0 είναι το offset: πόσα bytes θα απέχει απο την διέυθυνση αρχής του πίνακα. Εδώ θέλουμε το πρώτο κελι άρα 0.

Αν θέλουμε το δέυτερο κελί:
lw $t1,4($t0)
$t0 + 4 bytes

Αντίστοιχα αν θές να αποθηκέυσεις τον καταχωρητή $t1 στο πρώτο κελί του πίνακα χρησιμοποίησε το strore word:
sw $t1,0($t0)


Επίσεις μπορείς να κάνεις τον καταχωρητή $t0 να περέχει την διεύθυνση του δεύτερου κελιού αυξάνοντας το κατα τέσσερα:

addi $t0,$t0,4
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 11 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Dark_kronos

Επιφανές μέλος

Ο Rognan αυτή τη στιγμή δεν είναι συνδεδεμένος. Επαγγέλεται Άεργος/η και μας γράφει απο Ισπανία (Ευρώπη). Έχει γράψει 20,660 μηνύματα.
Ευχαριστω πολυ! Με ξεθολοσες καπως!
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 11 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Guest 190013

Επισκέπτης

αυτή τη στιγμή δεν είναι συνδεδεμέν. Δεν έχει γράψει κανένα μήνυμα.
Ξέρει κανείς LC-3 να με βοηθήσει σ' ένα προτζεκτάκι;
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 7 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Χρήστες Βρείτε παρόμοια

  • Τα παρακάτω 0 μέλη και 1 επισκέπτες διαβάζουν μαζί με εσάς αυτό το θέμα:
    Tα παρακάτω 0 μέλη διάβασαν αυτό το θέμα:
  • Φορτώνει...
Top