ασκηση στην γλωσσα προγραμματισμου assembly

συζητήσεις για assembly

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Intifada
Δημοσιεύσεις: 10
Εγγραφή: 05 Ιουν 2011 14:26

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από Intifada » 06 Απρ 2012 17:22

Καλησπερα σας.θελω μια μικρη βοηθεια..εχω 20 συγκεκριμενους αριθμους και μου ζητειται να βρω τον μεσο ορο και να τον τυπωνει στην οθονη σε πινακα "byte"

Intifada
Δημοσιεύσεις: 10
Εγγραφή: 05 Ιουν 2011 14:26

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από Intifada » 07 Απρ 2012 02:10

ston 8086 ειναι

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από LightForce » 07 Απρ 2012 10:33

Καλημέρα,

Μια μικρή βοήθεια για να ξεκινήσεις, σύνταξη fasm.

Προσθέτεις όλες τις τιμές του πίνακα στον AX.

Κώδικας: Επιλογή όλων

            mov ax, 0
            mov dx, ax
            mov si, array-1
            mov cx, array.size

        .sum:
            inc si
            mov dl, byte [si]
            add ax, dx
            loop .sum

            ; AX = sum_of_ numbers
Κάνεις διαίρεση και βρίσκεις τον μέσο.

Κώδικας: Επιλογή όλων

            mov dx, 0
            mov cx, array.size
            div cx

            ; AX = average
Πίνακας.

Κώδικας: Επιλογή όλων

            array db 1,10,100
            array.size = $-array

Intifada
Δημοσιεύσεις: 10
Εγγραφή: 05 Ιουν 2011 14:26

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από Intifada » 09 Απρ 2012 16:45

ευχαριστω παρα πολυ αλλα θελω μια μικρη βοηθεια ακομα το
mov si, array-1
mov cx, array.size στην αρχη τι ακριβως κανει?


εαν εχω καταλαβει καλα πρεπει να προσθεσω ολες τις τιμες και να τις βαλω στον ΑΧ μετα να διαιρεσω με το 20 που ειναι ολες οι τιμες και υστερα να τα βαλω στον πινακα byte?

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από LightForce » 09 Απρ 2012 19:26

Intifada έγραψε:mov cx, array.size στην αρχη τι ακριβως κανει?
Η εντολή loop μειώνει κατά 1 την τιμή του καταχωρητή CX και εφόσον δεν είναι 0 πραγματοποιείται ο βρόγχος.

Στο συγκεκριμένο παράδειγμα,
Η array.size έχει τιμή 3, το μέγεθoς δηλαδή του πίνακα των bytes.
Εάν είχες δηλώσει τα στοιχεία του πίνακα ως λέξεις dw η array.size θα είχε μέγεθος 6.
Αντίστοιχα 12, εάν δήλωνες διπλές λέξεις dd.
Intifada έγραψε:ευχαριστω παρα πολυ αλλα θελω μια μικρη βοηθεια ακομα το mov si, array-1
Eίναι το ίδιο σαν να έγραφες

Κώδικας: Επιλογή όλων

            mov si, array

Κώδικας: Επιλογή όλων

        .sum:           
            mov dl, byte [si]
            add ax, dx
            inc si                         ; άλλαξε θέση η εντολή
            loop .sum
Intifada έγραψε:εαν εχω καταλαβει καλα πρεπει να προσθεσω ολες τις τιμες και να τις βαλω στον ΑΧ μετα να διαιρεσω με το 20 που ειναι ολες οι τιμες
Ναι σωστά.
θα χρειαστείς ρουτίνα που να τυπώνει το αποτέλεσμα σε δεκαδικό.
Intifada έγραψε:και υστερα να τα βαλω στον πινακα byte?
Αυτό δεν το έχω καταλάβει.

Κάνε ποστ εάν θέλεις την προσπάθεια σου εώς τώρα.
Τελευταία επεξεργασία από το μέλος LightForce την 09 Απρ 2012 20:36, έχει επεξεργασθεί 1 φορά συνολικά.

Intifada
Δημοσιεύσεις: 10
Εγγραφή: 05 Ιουν 2011 14:26

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από Intifada » 09 Απρ 2012 19:45

θα σ πω την εκφωνηση της ασκησης τι λεει. Να γραφει προγραμμα σε γλωσσα μηχανης assembly το οποιο θα βρισκει και θα τυπωνει στην οθονη τον μεσο ορο σε πινακα <byte>.To μεγεθος του πινακα ειναι 20 θεσεων και οι τιμες του ειναι οι
(2, 5, 8, 34, 77, 80, 43, 4, 101, 222, 1, 200, 27, 29, 244, 145, 12, 211, 202, 33)


A[0] 2
A[1] 5
A[2] 8
A[3] 34
A[4] 77
A[5] 80
A[6] 43
A[7] 4
A[8] 101
A[9] 222
A[10] 1
A[11] 200
A[12] 27
A[13] 29
A[14] 244
A[15] 145
A[16] 12
A[17] 211
A[18] 202
A[19] 33


Αυτο ειναι το θεμα για την σχολη μου και ειναι τελευταιο μαθημα αλλα δεν το κατεχω και πολυ.Εχω κανει λιγα πραγματα και στην ουσια εχω ασχοληθει λιγο με την ασκηση

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από dva_dev » 09 Απρ 2012 20:18

Αν θέλεις να περάσεις το βλέπω να χρειάζεται να προσπαθήσεις περισσότερο.

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από LightForce » 09 Απρ 2012 22:08

Intifada τρέξε τον κώδικα στον emu8086 με την οδηγία #fasm# στην πρώτη γραμμή.
Κάνε emulate και παρακολούθα τον ΑΧ με single step.
Υπόψη, το παράδειγμα είναι πολύ απλό.

Κώδικας: Επιλογή όλων

            org 100h

            mov ax, 0
            mov dx, ax
            mov si, array-1
            mov cx, array.size

        .sum&#58;
            inc si
            mov dl, byte &#91;si&#93;
            add ax, dx
            loop .sum

            ; AX = sum_of_ numbers

            mov dx, 0
            mov cx, array.size
            div cx

            ; AX = average

            ; print AX in decimal
            ;
            ;
            ;

            mov ah, 4ch
            int 21h


        array db 2, 5, 8, 34, 77, 80, 43, 4, 101, 222, 1, 200, 27, 29, 244, 145, 12, 211, 202, 33
        array.size = $-array
Μηδέν στον AX
Μηδέν στον DX, θέλω το high byte DH να είναι 0.
Ο SI είναι δείκτης διεύθυνσης του πίνακα.
Ο CX έχει το μέγεθος του πίνακα.

Η .sum προσθέτει όλα τα byte του πίνακα στον AX.
Ο βρόγχος θα εκτελεστεί CX φορές.

Η διαίρεση AX = (DX AX) / CX δίνει τον μέσο όρο.

Intifada
Δημοσιεύσεις: 10
Εγγραφή: 05 Ιουν 2011 14:26

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από Intifada » 10 Απρ 2012 05:06

Χιλια ευχαριστω.Νομιζω πως οντως δεν ηταν κατι το πολυ δυσκολο.Θα το μελετησω αναλυτικοτερα και αν εχω καμμια απορια θα σας πω.Ευχαριστω και παλι.

Καλο Πασχα

Intifada
Δημοσιεύσεις: 10
Εγγραφή: 05 Ιουν 2011 14:26

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από Intifada » 26 Απρ 2012 01:30

Γεια σας εδωσα την ασκηση οπως μου ειχατε γραψει πιο πανω και μ ειπε οτι ειναι ημιτελης και οτι δεν βγαζει αποτελεσμα..Χρειαζεται κατι παραπανω να προσθεσω?

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από LightForce » 26 Απρ 2012 09:06

Κώδικας: Επιλογή όλων


            ; print AX in decimal
            ;
            ;
            ; 
Γεια,

Πρέπει να προσθέσεις στον κώδικα ρουτίνα που τυπώνει τον AX σε δεκαδικό και εν συνεχεία να την καλέσεις. Mια πινελιά που άφησα εσκεμμένα.
Δες το παράδειγμα του emulator print_AX.

Intifada
Δημοσιεύσεις: 10
Εγγραφή: 05 Ιουν 2011 14:26

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από Intifada » 26 Απρ 2012 11:11

χαιρεται και παλι.Νομιζω κατι βρηκα αλλα και παλι το διατυπωνω λαθος καθως μου βγαζει error..Δεν ξερω τι να κανω.Θα το κοιταξω λιγο καλυτερα μαλλον

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από LightForce » 26 Απρ 2012 11:56

Πάλεψε το, εάν δεν τα καταφέρεις κάνε post τον κώδικα.

Intifada
Δημοσιεύσεις: 10
Εγγραφή: 05 Ιουν 2011 14:26

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από Intifada » 26 Απρ 2012 12:19

ειχα σκεφτει να κανω στην αρχη

push ax
push dx
push si
push cx


αφου βρω τον μεσο ορο για να εκτυπωσω σε δεκαδικο κατι σαν

write_loop:
pop ax
call write_digit
loop write_loop

η καπως ετσι και στο τελος

pop ax
pop dx
pop si
pop cx
ret



και κατι ακομα στο προηγουμενο κωδικα στο τελος λεει mov ah, 4ch
μηπως ενοεις mov ah, ch?

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

ασκηση στην γλωσσα προγραμματισμου assembly

Δημοσίευση από LightForce » 26 Απρ 2012 18:25

Intifada έγραψε:και κατι ακομα στο προηγουμενο κωδικα στο τελος λεει mov ah, 4ch
μηπως ενοεις mov ah, ch?
Η διακοπή INT 21h/4Ch τερματίζει το πρόγραμμα και επιστρέφει τον έλεγχο στο λειτουργικό.

Όπως έγραψα, το παράδειγμα του emulator print_AX.asm έχει την ρουτίνα που χρειάζεσαι.
Απλώς ενσωμάτωσε την στον κώδικα σου και κάλεσε την.

Απάντηση

Επιστροφή στο “Assembly”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες