Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

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

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

Απάντηση
stavrakis7
Δημοσιεύσεις: 6
Εγγραφή: 15 Νοέμ 2010 10:41

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από stavrakis7 » 15 Νοέμ 2010 10:49

to thema einai:na ylopoihthei programma pou ipologizei tis ekfraseis A*B+C*D+E*f
OPOU OI ARITHMOI A,B,C,D,E,F NA EISAGWNTAI APO TO PLHKTROLOGIO K TO APOTELESMA N EKTIPWNETE KAI THN OTHONH

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

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από LightForce » 15 Νοέμ 2010 20:18

stavrakis7, σε τι αρχιτεκτονική για ποιoν assembler.

stavrakis7
Δημοσιεύσεις: 6
Εγγραφή: 15 Νοέμ 2010 10:41

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από stavrakis7 » 17 Νοέμ 2010 10:37

assembly ston 8086

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

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από LightForce » 17 Νοέμ 2010 21:08

exv mia ergasia aplh sxetika .den thelw n m thn lisete apla n me voithisete ligo
Λίγη βοήθεια μπορώ να δώσω, και ας έγραψες greeklish.

To πρόγραμμα τρέχει σε Emu8086 και υπολογίζει εκφράσεις με 2 operators +,*
Η διεύθυνση του string που περιέχει την έκφραση στον καταχωρητή SI
Επιστρέφει το αποτέλεσμα στον καταχωρητή AX

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

 
;==== expression parser ====

step0:      dec si   
            call step1
aadd:       cmp byte [si], "+"
            jnz X0
            call step1
            add ax, bx
            jmp aadd
X0:         ret

step1:      push ax
            call step2
mmul:   	 cmp byte [si], "*"
            jnz X1
            call step2
            mul bx
            jmp mmul
X1:         pop bx
            ret

step2:      inc si
            push ax
            xor ax, ax
            xor bx, bx
            mov cx, 10
numb:   	 mov bl, [si]
            sub bl, 30h
            cmp bl, cl
            jae X1
            mul cx
            add ax, bx
            inc si
            jmp numb  

Ένα παράδειγμα, θα τυπώσει 768.

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

            org 100h

            jmp start

            string db "8*32+4*64+2*128",0
start:
            mov si, OFFSET string
            call step0           ;evaluate expression
            call putn            ;print result

            mov ah, 4Ch          ;exit program
            int 21h


;print unsigned AX number in decimal

putn:       mov cx, 10
l0:         xor dx, dx
            div cx
            push dx
            test ax, ax
            jz l1
            call l0
l1:         pop ax
            add al, 30h
            push ax
            mov ah, 0Eh
            int 10h
            pop ax
            ret


;==== expression parser ==== 

Μπορείς επίσης να πάρεις την παραμέτρο της γραμμής εντολών σαν έκφραση. :idea:

stavrakis7
Δημοσιεύσεις: 6
Εγγραφή: 15 Νοέμ 2010 10:41

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από stavrakis7 » 18 Νοέμ 2010 11:21

μια ερωτηση στο step2: γιατι βαζουμε στο cx 10;[mov cx,10]
χρησιμοποιω μονο την int 10 για ν εμφανισω τα γραμματα ποy θελω στην οθονη ετσι;

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

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από LightForce » 18 Νοέμ 2010 18:53

Ναι, η διακοπή INT 10h / AH = 0Eh τυπώνει τον χαρακτήρα που βρίσκεται στον AL
Και παρατηρώ ότι push/pop δεν χρειάζεται.

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

            add al, 30h    
            mov ah, 0Eh
            int 10h     
            ret 
H step2 μετατρέπει το string στον SI σε δυαδικό αριθμό στον AX πολλαπλασιάζοντας με το 10 και προσθέτοντας την δυαδική τιμή του επόμενου ψηφίου.

stavrakis7
Δημοσιεύσεις: 6
Εγγραφή: 15 Νοέμ 2010 10:41

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από stavrakis7 » 19 Νοέμ 2010 10:53

μια τελευταια ερωτηση .πχ το Α στο πληκτρολογιο συμβολιζετε το 41Η.πως θα φαινεται στο προγραμμα μου οτι καθε γραμμα συμβολιζετε με τον κωδικο πληκτρολογιου;παντως σε ευχαριστω για την βοηθεια που μου δωσες.

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

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από LightForce » 20 Νοέμ 2010 13:32

Τίποτα νάσαι καλά, ελπίζω να μην σε μπέρδεψα.
Στην τελευταία ερώτηση δεν πιάνω τι ακριβώς θέλεις να κάνεις.

stavrakis7
Δημοσιεύσεις: 6
Εγγραφή: 15 Νοέμ 2010 10:41

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από stavrakis7 » 20 Νοέμ 2010 14:06

για ν τυπωθει το γραμμα Α στην οθονη,η τιμη 41h αντιστοιχει στο χαρακτηρα Α.το προβλημα ειναι πως θα το γραπσω στο προγραμμα;καπως ετσι για ολα τ γραμματα που θελω νεμφανιστουν στην οθονη;
prnt: mov al,41h για το γραμμα α πχ.
mov ah,oeh
int 10h
int 20h

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

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από LightForce » 20 Νοέμ 2010 15:28

Σου έγραψα ένα μικρό παραδείγματα που ίσως σε βοηθήσει.

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

        org 100h
      
        mov ax, 03h    ;Text mode
        int 10h
      
;Εμφάνιση ενός ASCII χαρακτήρα (byte) στην οθόνη, 
      
        mov al, "A"     ;A
        call putc                  
        mov al, 42h     ;B 
        call putc         
        mov al, byte ptr [char]   ;C
        call putc 
        mov al, byte ptr [char+1]   ;D
        call putc        
        call newline
                                                       
  
;Εμφάνιση 2 ASCII χαρακτήρων στην οθόνη (word),

        mov ax, "HI"
        xchg al, ah
        call putc
        xchg al, ah
        call putc         
        call newline
       
   
;Εμφάνιση ενός string που τελειώνει σε $

        mov dx, OFFSET string$      ;DX holds string address
        call puts$            
        call newline
                       
                       
;Εμφάνιση ενός NULL terminated string,

        mov si, OFFSET string0      ;SI holds string address
        call puts0           
        call newline 
                   
                
;Παράδειγμα που τυπώνει την αλφάβητο,

        mov cx, 26
        mov al, "A"
lop:    call putc
        inc al
        loop lop          
        call newline               
                               
        int 20h         ;Exit program

      
putc:
    	 push ax
    	 mov ah, 0Eh
    	 int 10h
    	 pop ax
    	 ret   			     
   
puts$:                       
        push ax
        mov ah, 09h          ;INT 21h / AH=9 
        int 21h
        pop ax
        ret             
                   
puts0: 
        push ax       
        push si
lp0:    mov al, byte ptr [si]
    	 test al, al
    	 jz fin
    	 call putc
    	 inc si
    	 jmp lp0
fin:	 pop si
        pop ax  
    	 ret	
    		
		             
newline:   
        push ax
        mov al, 0Dh
        call putc
        mov al, 0Ah
        call putc
        pop ax
        ret
               
               
        char db "CD"        		             
        string$ db "Hello$"	        	             
        string0 db "Freestuff",0	

Εδώ θα βρείς τις πληροφορίες που χρειάζεσαι για τις βασικές διακοπές εισόδου/εξόδου.

stavrakis7
Δημοσιεύσεις: 6
Εγγραφή: 15 Νοέμ 2010 10:41

Πρόγραμμα που υπολογίζει εκφράσεις A*B+C*D+E*f

Δημοσίευση από stavrakis7 » 20 Νοέμ 2010 15:51

se euxaristw file,oti k n pw einai ligo.

Απάντηση

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

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

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