Άσκηση με πίνακα (x86 intel)

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

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

Απάντηση
kkkkonstantina
Δημοσιεύσεις: 14
Εγγραφή: 12 Νοέμ 2009 17:49

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από kkkkonstantina » 02 Δεκ 2011 22:29

Γεια σας!Έχω μία άσκηση κατά την οποία θα πρέπει να γεμίζω έναν πίνακα 10 θέσεων από το πληκτρολόγιο και στην συνέχει να τα εμφανίζω στην οθόνη. Ενώ γεμίζω τον πίνακα κανονικά μετά στην εμφάνιση μου βγάζει μόνο μηδενικά!Αν μπορούσε κάποιος να με βοηθήσει θα ήταν υπέροχα γιατί προσπαθώ πρώτη φορά να κάνω πίνακες σε assembly και μου φαίνεται πολύ ενδιαφέρον! Εύχομαι να μην έχω κάνει κάποιο τραγικό λάθος!Ευχαριστω προκαταβολικά! :-)

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

format MZ
push cs
pop ds

mov SI,pinakasA


mov AH,09       ;emfanisi voithitikou mhnumatos
mov DX,inmsg
int 21h

mov CX,10        ;poses fores 8a ektele8ei o brogxos

gem:             ;gemisma pinaka

mov AH,1
int 21h

mov DL, AL      ;metatroph xarakthra se arithmo
sub DL, 30h  
mov [SI],DL
inc SI

loop gem

mov AH,09       ;emfanisi kenou xarakthra
mov DX,keno
int 21h




mov CX,10
mov SI,pinakasA




metafora:

mov AL,[SI]   ;metafora ston AL to periexomeno tou SI

inc SI
loop metafora




mov CX,10
mov SI,pinakasA


emfanisi:      ;metatropi arithmwn se xarakthres ascii

 mov AX,0
 mov AL,[SI]
 mov DX,AX
 mov DI,X
 add DI,2 

L2:

 mov AX,DX
 mov DX,0
 mov BX,10
 div BX

 xchg AX,DX
 add AL,30H
 mov [SI],AL

 dec DI
 cmp DX,0
 jnz L2

 mov AH,09
 mov DX,X
 int 21h

 mov AH,09
 mov DX,keno
 int 21h



loop emfanisi

mov SI,pinakasA


exit:
mov AX,4C00h
int 21h



inmsg db 'dwse 10 arithmous gia ton pinaka: ','$'
keno db 0Ah,0Dh,'$'
pinakasA db ?,?,?,?,?,?,?,?,?,?
X db 30h,30h,30h,30h

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

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από LightForce » 03 Δεκ 2011 02:57

Γεια σου,

H gem ρουτίνα έχει λογική, όχι όμως ο υπόλοιπος κώδικας.
Τρέξε τον παρακάτω κώδικα, δέχεται 10 ASCII ψηφία, τα τοποθετεί σε πίνακα, και τα τυπώνει με την διακοπή INT 21h / AH=2.

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

      org 100h
   
    mov cx, 10
    mov si, pinakasA
    push cx si

gem:
    mov ah, 1
    int 21h
    ;sub al, 30h
    mov [si], al
    inc si
    loop gem

    pop si cx
    mov ah, 2       

emfanisi:
    mov dl, [si]
    ;add dl, 30h
    int 21h
    inc si
    loop emfanisi

exit:
    mov ax, 4C00h
    int 21h

pinakasA db 10 dup ? 

kkkkonstantina
Δημοσιεύσεις: 14
Εγγραφή: 12 Νοέμ 2009 17:49

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από kkkkonstantina » 03 Δεκ 2011 12:47

Ευχαριστώ πάρα πολύ!!!Βρήκα λύση τελικά! το έγραψα έτσι και τρέχει !! Τώρα έχω να αθροίσω τα στοιχεία του πίνακα και να εμφανίσω το αποτέλεσμα του αθροίσματος

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

format MZ
push cs
pop ds

mov SI,pinakasA


mov AH,09 ;emfanisi mhnumatos
mov DX,inmsg
int 21h

mov CX,10 ;poses fores 8a ektele8ei o brogxos

gem: ;gemisma pinaka

mov AH,1
int 21h

mov DL, AL ;metatroph ari8mou se kwdika ascii
sub DL, 30h
mov [SI],DL


inc SI

loop gem

mov AH,09 ;emfanisi kenou xarakthra
mov DX,keno
int 21h



mov CX,10

mov SI,pinakasA

emfanisi:

mov AX,0
mov AL,[SI]
mov DX,AX
mov DI,X
add DI,2

L2:

mov AX,DX
mov DX,0
mov BX,10
div BX

xchg AX,DX
add AL,30H
mov [DI],AL

dec DI
cmp DX,0
jnz L2

mov AH,09
mov DX,X
int 21h

mov AH,09
mov DX,keno
int 21h

inc SI
mov DI,0

loop emfanisi

exit:
mov AX,4C00h
int 21h

inmsg db 'dwse 10 arithmous gia ton pinaka: ','$'
keno db 0Ah,0Dh,'$'
pinakasA db ?,?,?,?,?,?,?,?,?,?
X db 30h,30h,30h,'$' 

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

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από LightForce » 03 Δεκ 2011 17:09

Mην ξεχνάς code tags στο πόστ.

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

[code] [/code] 
Παρακαλώ, είναι καλή η προσπάθεια σου.

Ίσως μία ρουτίνα byte2string σου φανεί χρήσιμη.

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

    mov al, 80
    mov si, X
    call byte2string

    mov ah, 9
    mov dx, X
    int 21h



; al = input, [ds:si] = output $ terminated
byte2string:
    pusha
    xor ah, ah
    add si, 2
    mov byte [si+1], '$'
    mov cx, 3
    mov bx, 10
.A:xor dx, dx
    div bx
    add dl, 30h
    mov [si], dl
    dec si
    loop .A
    popa
    ret

X db 4 dup ?
Καλώς ήρθες. Ελπίζω και άλλα ποστ στο section.

kkkkonstantina
Δημοσιεύσεις: 14
Εγγραφή: 12 Νοέμ 2009 17:49

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από kkkkonstantina » 05 Δεκ 2011 20:43


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

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από LightForce » 06 Δεκ 2011 00:29

kkkkonstantina έγραψε:δεν μπορώ να καταλάβω τον κώδικα που μου έγραψες
Τρέξε το πρώτο παράδειγμα στον fasm.
Χωρίς χρήση πίνακα, εισαγωγή 10 ψηφίων και πρόσθεση αυτών στον bl.
Στην συνέχεια καλώ την ρουτίνα και έπειτα εμφανίζω το σύνολο.

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

            org 100h

            mov ah, 9           ; print msg1
            mov dx, msg1        ;
            int 21h             ;

            mov bx, 0           ; Total = 0
            mov cx, 10
.L1:
            mov ah, 1           ; al = getkey
            int 21h             ;
            sub al, 30h         ; Asc2Bin
            add bl, al          ; add to Total
            loop .L1            ;

            mov ah, 9           ; print msg2
            mov dx, msg2        ;
            int 21h             ;

            mov al, bl          ; al = byte to convert
            mov si, buff        ; si = offset buff
            call byte2string    ;

            mov ah, 9           ; print buff
            mov dx, buff        ;
            int 21h             ;

            ret                 ; quit


; al = input, [ds:si] = output $ terminated
byte2string:
            pusha
            xor ah, ah
            add si, 2
            mov byte [si+1], '$'
            mov cx, 3
            mov bx, 10
    .A: xor dx, dx
            div bx
            add dl, 30h
            mov [si], dl
            dec si
            loop .A
            popa
            ret


    msg1 db "Hit 10 digits:$"
    msg2 db 13,10,"Total = $"
    buff db 4 dup ?

Eδώ δες πως πήρα το μήκος του πίνακα array.
Κρατάω και επαναχρησιμοποιώ τις τιμές σε cx si με push/pop.
Εισαγωγή 10 ψηφίων, έπειτα πρόσθεση των τιμών του πίνακα στον bl.
Καλώ την ρουτίνα και εμφανίζω το σύνολο.

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


            org 100h

            mov ah, 9
            mov dx, msg1
            int 21h

            mov si, array-1
            mov cx, array.length

            push cx
            push si
.L1:
            inc si
            mov ah, 1
            int 21h
            sub al, 30h
            mov [si], al
            loop .L1

            pop si          
            pop cx
            mov bx, 0       ; Total = 0

.L2:        inc si
            add bl, [si]
            loop .L2

            mov ah, 9
            mov dx, msg2
            int 21h

            mov al, bl
            mov si, buff
            call byte2string

            mov ah, 9
            mov dx, buff
            int 21h

            ret


; al = input, [ds:si] = output $ terminated
byte2string:
            pusha
            xor ah, ah
            add si, 2
            mov byte [si+1], '$'
            mov cx, 3
            mov bx, 10
    .A: xor dx, dx
            div bx
            add dl, 30h
            mov [si], dl
            dec si
            loop .A
            popa
            ret


    msg1 db "Hit 10 digits:$"
    msg2 db 13,10,"Total = $"
    buff db 4 dup ?

    array db 10 dup ?
     .length = $-array

Αντί για μονά ψηφία σκέψου την εισαγωγή σε πίνακα δεκαδικών ακεραίων (και αρνητικών) 16-bit αριθμών, άθροιση και εμφάνιση του συνόλου.
keep practising.

kkkkonstantina
Δημοσιεύσεις: 14
Εγγραφή: 12 Νοέμ 2009 17:49

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από kkkkonstantina » 06 Δεκ 2011 19:02

Με έχεις βοηθήσει όσο δεν φαντάζεσαι ειλικρινά!!Προσπαθούσα πόσες ώρες να βρω τι θα κάνω κ που θα βάλω τα push k pop..... Ευτυχώς τώρα θα κάτσω να μελετήσω τον κώδικα να μπω στο νόημα!!!Τα σχόλια είναι άκρως κατατοπιστικά!!!! Θα έχω κ άλλα ερωτήματα αυτό είναι το μόνο σίγουρο!!!! :-)))

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

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από LightForce » 07 Δεκ 2011 23:45

Πειραματίσου, θέλει χρόνο η γλώσσα.
Χαίρομαι αν βοήθησα, προσπάθησα να μην σε μπερδέψω.
θα βρείς πολύ κώδικα και snippets στο fasm board

kkkkonstantina
Δημοσιεύσεις: 14
Εγγραφή: 12 Νοέμ 2009 17:49

Άσκηση με πίνακα (x86 intel)

Δημοσίευση από kkkkonstantina » 08 Δεκ 2011 10:35

Όντως χρειάζεται πολύ χρόνο η γλώσσα και πολλούς πειραματισμούς!!Άλλα είναι κατά κάποιο τρόπο διασκεδαστικό γιατί αλλάζεις και αλλάζεις πράγματα μέχρι να σου τρέξει το πρόγραμμα σωστά :-)) !Θα επιστρέψω σε 4ς ημέρες για να συνεχίσω την δουλειά!

Απάντηση

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

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

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