ΑΣΚΗΣΗ 8086 με πράξεις.

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

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

Απάντηση
tazonis
Δημοσιεύσεις: 6
Εγγραφή: 27 Απρ 2011 21:17

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από tazonis » 27 Απρ 2011 21:31

Θέλω κανα 2 πρότυπες ασκήσεις πάνω στον 8086 για να καταλάβω πως δουλέυεις τους καταχωρητές πάνω σε πράξεις π.χ Ν^2-2*Ν+1 ή κατι παρόμοιο. Αν γίνεται θα ήθελα και την ρουτίνα εμφάνησης αποτελέσματος.

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

TITLE A1

ASSUME CS:CODE, DS:DATA
CODE SEGMENT
ARXI: 
	MOV AX, DATA
	MOV DS, AX
	LEA DX, MES
	MOV AH, 09H
	INT 21H
	MOV AL, X
	MUL AL

CODE ENDS

DATA SEGMENT 
	MES DB "TO APOTELESMA EINAI",    ,"$"
	X DB N
	Y DB 2
DATA ENDS
END ARXI
Αυτά κατάφερα με τις λιγοστές γνώσεις μου και μετά κόλησα στο που θα αποθηκευτούν τα μέροι των πράξεων και αν πέσει τιποτα πανώ σε κατι αλλο. Ευχαριστώ για τον χρόνο σας.
Τελευταία επεξεργασία από το μέλος tazonis την 29 Απρ 2011 19:12, έχει επεξεργασθεί 2 φορές συνολικά.

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

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από LightForce » 29 Απρ 2011 13:08

Hi tazonis,

Έκανες compile τον παραπάνω κώδικα χωρίς να σου εμφανίσει error με ποιον assembler?

Λίγες παρατηρήσεις,
H διακοπή INT 21h/09h χρειάζεται string που τερματίζει σε '$'
H γραμμή X DB N είναι λάθος.
Το πρόγραμμα δεν επιστρέφει σωστά πίσω στο λειτουργικό.

Ποιον assembler τρέχεις να σου δώσω ρουτίνα που θα εμφανίζει το αποτέλεσμα ώστε να μπορείς να πειραματιστείς σε απλές αριθμητικές πράξεις.

tazonis
Δημοσιεύσεις: 6
Εγγραφή: 27 Απρ 2011 21:17

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από tazonis » 29 Απρ 2011 19:11

Ο assembler που τρεχω ειναι ο 8086 emulator, ευχαριστω για τα tips, εκει που σκαλωνω ειναι πχ σε ενα mul στον ΑΧ το αποτελεσμα αποθηκευεται στον ΑΧ η στον ΑΗ και στην εξισωση μου πρεπει να αποθηκευσω σε διαφορετικους καταχωτητες τα μερη των πραξεων μου και μετα να τα προσθεσω ολα μαζι σε εναν καταχωρητη και αν ναι σε ποιου γινεται να απο8ηκευσω data?

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

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από LightForce » 30 Απρ 2011 04:06

Tο documentation του EMU8086 περιγράφει το σετ εντολών και είναι γεμάτο μικρά παραδείγματα. Απο εκεί καλύτερα να ξεκινήσεις.
Συνήθως σε AX BX CX DX SI DI αποθηκεύεις δεδομένα η σε θέσεις μνήμης η και στην στοίβα.
Ο αλγόριθμος της mul είναι απλός. Όταν ο τελεστής είναι byte συμβάινει αυτό, όταν είναι λέξη αυτό. Δες τον

Οι ρουτίνες θα σε βοηθήσουν να πειραματιστείς αν έχεις την διάθεση.
Η puts τυπώνει ένα string$
Η putn τυπώνει έναν μη προσημασμένο δεκαδικό που βρίσκεται στον AX
Η newline αλλάζει γραμμή.

To πρόγραμμα τώρα θα ήταν έτσι,

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

TITLE A1

ASSUME CS:CODE, DS:DATA

DATA SEGMENT     
    MES DB "TO APOTELESMA EINAI: $"  
    NL DB 0DH,0AH,"$"
    X DW 2
    Y DW 10
DATA ENDS

CODE SEGMENT
ARXI:


    ; MOV AX, DATA
    ; MOV DS, AX       
    ; LEA DX, MES
    ; CALL PUTS     
    ; MOV AX, 100
    ; CALL PUTN    
    ; CALL NEWLINE
                                                                        


    MOV AX, 4C00H   ;exit to DOS
    INT 21H
            
      
;----------------------------------------------------
PUTS:
    PUSH AX
    MOV AH, 09H
    INT 21H
    POP AX
    RET


NEWLINE:
    PUSH DX
    LEA DX, NL
    CALL PUTS
    POP DX
    RET

      
PUTN:
    PUSHA
    PUSH 0
    MOV BX, 10
.STKPUSH:
    XOR DX,DX
    DIV BX
    ADD DX,'0'
    PUSH DX
    OR AL,AL
    JZ .STKPOP
    JMP .STKPUSH
.STKPOP:    
    POP AX
    OR AL,AL
    JZ .PN0
    MOV AH,0EH
    INT 10H
    JMP .STKPOP
.PN0:     
    POPA
    RET
                     
            
CODE ENDS
END ARXI 

Ένα παράδειγμα χ^y που με τις τρέχουσες τιμές θα τυπώσει 'TO APOTELESMA EINAI: 1024'

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

ARXI:
    MOV AX, DATA
    MOV DS, AX        
    LEA DX, MES
    CALL PUTS   
    
    MOV AX, X
    MOV BX, X
    MOV CX, Y
    SUB CX, 1
    JNA POW0 
POW1:
    MUL BX
    DEC CX
    JNZ POW1
POW0:                  
    CALL PUTN       ;print AX
    CALL NEWLINE

    MOV AX, 4C00H   ;exit to DOS
    INT 21H
Καλή τύχη tazonis.

tazonis
Δημοσιεύσεις: 6
Εγγραφή: 27 Απρ 2011 21:17

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από tazonis » 06 Μάιος 2011 04:35

Σε ευχαριστω πολυ φιλε μου 8α το πεδεψω και γω απο δω και περα, δυσκολη η assebly αλλα αν την καταλαβεις ειναι καλη φαση.

GReaper
Δημοσιεύσεις: 48
Εγγραφή: 11 Δεκ 2010 21:47
Επικοινωνία:

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από GReaper » 06 Μάιος 2011 12:28

Η assembly ( οποιαδήποτε ) είναι για μαζοχιστές!!! Αλλά μ' αρέσει!... :D

tazonis
Δημοσιεύσεις: 6
Εγγραφή: 27 Απρ 2011 21:17

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από tazonis » 08 Μάιος 2011 19:46

Ναι αλλα για να περασω το μαθημα στο τει θα την φαω. Εκατσα ξεσκιστηκα απο τοτε που ειχα αυτην την ασκηση και εμαθα αρκετα ¨) Χαρης και σενα κιολας. Τωρα εχω μια γελια πλεον ασκηση αλλα δεν μπορω κα κανω ενα πραμα μονο, ζηταει να βαζει ο χρηστης εναν αριθμο απο 0-9 και να γινετε ελεγχος αν ειναι σωστος και αν ειναι να βγαζει αν ειναι αρτιος,περιτος η 0 και τελος να εμφανιζει ποσες φορες εβαλε λαθος δεδομενα ο χρηστης εγω εγραψα τουτο εδω τον κωδικα αλλα δεν πμορω να βρω πουθενα πως εμφανιζεις τον αριθμο που εχει ενας RESTISTER

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

TITLE ASK 2
ASSUME CS:CODE, DS:DATA
KODIKAS SEGMENT

ARXI:
	MOV AX,DATA
	MOV DS,AX

	MOV CL,0
	MOV CH,0
BEGIN:		
	LEA DX,MES
	MOV AH,9
	INT 21H
	
	MOV AH,08h      
        INT 21h
	
CONTROL:
	CMP AL,'0'
	JB ERROR
	
	CMP AL,'9'
	JA ERROR

	MOV DL,AL ; gia na mhn grafw auto to matsouki gia na emfanizw to noumero xes pws einai i texniki gia na emfanizei kateu8eian ton ari8mo apo thn eisaghgi tou ari8mou sto plhkrologio?  
	MOV AH,2	    
	INT 21H

	CMP AL,'0'
	JE miden	

	MOV AH,0
	MOV BL,2
	DIV BL
	
	CMP AH,0
	JE ARTIOS

	LEA DX,MES_PER  
        MOV AH,09h      
        INT 21h         
        JMP ENDING

artios:
        LEA DX,MES_ART  
        MOV AH,09h      
        INT 21h         
        JMP ENDING
miden:
        LEA DX,MES_ZERO 
        MOV AH,09h      
        INT 21h
        JMP ENDING

ERROR:  
	LEA DX,MES_ERROR
	MOV AH,09H
	INT 21H
	INC CL
	
ENDING:
        INC CH		    
	CMP CH,10	    
	JB BEGIN
	
	MOV CH,10 ;TON CL TON EKANA COUNTER GIA LA8OS EISAGWGES TON AFERESA APO TO 10 POU EINAI POSES FORES A8 GINEI I EPANALI3H TOU PROGRAMATOS ALLA DEN XERW NA TON EMFANIZW
	SUB CH,CL

	LEA DX,MES_CORRECT
	MOV AH,09H
	INT 21H

	MOV AH,4CH
	INT 21H
KODIKAS ENDS

DATA SEGMENT
	MES DB "Eisagete ena monopsifio arithmo 0-9 $"
	MES_ZERO DB "O Arithmos einai miden $"
	MES_ART DB "O Arithmos einai artios $"
	MES_PER DB "O Arithmos einai peritos $"
	MES_ERROR DB "o Arithos einai lathos prospa8hste xana $"
	MES_CORRECT DB "Oi swstes eisagwges einai: ", "$"
DATA ENDS

END ARXI

GReaper
Δημοσιεύσεις: 48
Εγγραφή: 11 Δεκ 2010 21:47
Επικοινωνία:

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από GReaper » 09 Μάιος 2011 09:23

Όχι, οι χαρακτήρες δεν εκτυπόνωνται από μόνοι τους.

Παράξενο, πάντως. Τα interrupts που χρησιμοποιείς εσύ δεν είναι απ' τα BIOS που ξέρω. Και γνωρίζω καλά από interrupts και BIOS.

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

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από LightForce » 09 Μάιος 2011 22:10

Ηι,

Χαίρομαι που υπάρχει διάθεση.
Έχω λίγα tips που θα σου αρέσουν tazonis.

Δες την διακοπή INT 21h/AH=1 που διαβάζει έναν χαρακτήρα με echo στον AL. Μάλλον σου ξέφυγε.

Εάν ο χαρακτήρας είναι ASCII ψηφίο 0-9 και αφαιρέσεις 48 γίνεται μετατροπή σε δυαδική τιμή.
Παράδειγμα το ψηφίο "5" (ASCII 53) γίνεται 5.

Κάνοντας TEST σε καταχωρητή με τον εαυτό του, επηρεάζει τις σημαίες όπως να τον συγκρίνεις με το 0.

Εάν σε καταχωρητή το bit χαμηλότερης θέσης είναι 1 o αριθμός είναι περιττός, αλλιώς είναι άρτιος.

Δες τι λέω.

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

TITLE ASK 2
ASSUME CS:CODE, DS:DATA
KODIKAS SEGMENT

ARXI:
    MOV AX,DATA
    MOV DS,AX

BEGIN:
    LEA DX,MES
    MOV AH,9
    INT 21H

    MOV AH,1        ; read character with echo in AL
    INT 21h

CONTROL:
    CMP AL,'0'
    JB ERROR
    CMP AL,'9'
    JA ERROR        
    
    SUB AL,30h     ; ASCII -> BIN 
    
    TEST AL,AL     
    JZ miden
    TEST AL,1      ; odd or even?
    JZ artios
    
    LEA DX,MES_PER
    MOV AH,09h
    INT 21h
    JMP ENDING

artios:
    LEA DX,MES_ART
    MOV AH,09h
    INT 21h
    JMP ENDING
miden:
    LEA DX,MES_ZERO
    MOV AH,09h
    INT 21h
    JMP ENDING

ERROR:
    LEA DX,MES_ERROR
    MOV AH,09H
    INT 21H

ENDING:  
    JMP BEGIN  
  
LEA DX,MES_CORRECT
MOV AH,09H
INT 21H
       
MOV AH,4CH
INT 21H     


KODIKAS ENDS

DATA SEGMENT
MES DB 13,10,"Eisagete ena monopsifio arithmo 0-9 $"
MES_ZERO DB 13,10,"O Arithmos einai miden $"
MES_ART DB 13,10,"O Arithmos einai artios $"
MES_PER DB 13,10,"O Arithmos einai peritos $"
MES_ERROR DB 13,10,"o Arithos einai lathos prospa8hste xana $"
MES_CORRECT DB 13,10,"Oi swstes eisagwges einai: ", "$"   

DATA ENDS

END ARXI
Λείπει το κομμάτι που μετράει τις σωστές εισαγωγές, δουλεψέ το.
Βάλε την ρουτίνα PUTN στο πρόγραμμά σου, τυπώνει τον ΑΧ σε δεκαδικό.
Σώνει τους καταχωρητές όμως χαλάει τις σημαίες όποτε pushf/popf εάν τις χρειάζεσαι.

Παράδειγμα που τυπώνει τον CL

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

    MOV AL, CL
    XOR AH, AH      ;equals to MOV AH,0
    CALL PUTN       ;print AX
Μην ξεχνάς code tags στα ποστ.

tazonis
Δημοσιεύσεις: 6
Εγγραφή: 27 Απρ 2011 21:17

ΑΣΚΗΣΗ 8086 με πράξεις.

Δημοσίευση από tazonis » 10 Μάιος 2011 03:42

Θα κατσω τωρα να παιδεψω κανα δυο ενοιες καινουργιες που με πεταξες και θα το στρώσω. Δεν ηξερα οτι εχει code tags :-? . Με helpares αρκετα μπορω να πω μιας και ειπα απο το τει δεν παιζει να μαθω τιποτα και αρχησα να ασχολουμε μονος. Ευχαριστω και παλι για τον χρονο σου.

Με τα απλα που ξερω εκανα τα εξης και δουλευει :lol:

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

TITLE ASK 2
ASSUME CS:CODE, DS:DATA
KODIKAS SEGMENT

ARXI:
        MOV AX,DATA
        MOV DS,AX
        MOV CH,0
        MOV CL,0
BEGIN:
        LEA DX,MES
        MOV AH,9
        INT 21H

        MOV AH,1   
        INT 21h

CONTROL:
        CMP AL,'0'
        JB ERROR

        CMP AL,'9'
        JA ERROR       
	
	CMP AL,'0'
	JE miden  
	MOV AH,0
	MOV BL,2
	DIV BL
	
	CMP AH,0
	JE ARTIOS
   
        LEA DX,MES_PER
        MOV AH,09h
        INT 21h
        JMP ENDING
artios:
	LEA DX,MES_ART
        MOV AH,09h
        INT 21h
        JMP ENDING
miden:
        LEA DX,MES_ZERO
        MOV AH,09h
        INT 21h
        JMP ENDING
ERROR:
        LEA DX,MES_ERROR
        MOV AH,09H
        INT 21H
	INC CL
ENDING:  
        INC CH		    
	CMP CH,10
        JB BEGIN
 
	LEA DX,MES_CORRECT
	MOV AH,09H
	INT 21H
	SUB CH,CL
	MOV DL,CH
	ADD DL,30H
	MOV AH,02H
	INT 21H
       
	MOV AH,4CH
	INT 21H     
KODIKAS ENDS

DATA SEGMENT
	MES DB 13,10,"Eisagete ena monopsifio arithmo 0-9 $"
	MES_ZERO DB 13,10,"O Arithmos einai miden $"
	MES_ART DB 13,10,"O Arithmos einai artios $"
	MES_PER DB 13,10,"O Arithmos einai peritos $"
	MES_ERROR DB 13,10,"o Arithos einai lathos prospa8hste xana $"
	MES_CORRECT DB 13,10,"Oi swstes eisagwges einai: ", "$"   

DATA ENDS

END ARXI
[/code]

Απάντηση

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

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

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