Emulator 8086: Eμφανιση δεδομενων απο πινακα.

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

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

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

Emulator 8086: Eμφανιση δεδομενων απο πινακα.

Δημοσίευση από tazonis » 14 Μάιος 2011 20:41

εχω το εξης 8εμα:
Να συνταξετε προγραμμα με το οποιο επειτα απο μηνυμα προς το χρηστη, 8α εισαγεται απο το πληκρολογιο κειμενο με ολους τουσ δυνατους χαρακτηρες(λατινικους,νουμερα,αριθμους,αλλα συμβολα). στη συνεχεια θα αποθηκευεται σε μια περιοχη μνημης, μετα απο ελεγχο που θα γινεται,μονο οι μικρη λατινικοι χαρακτηρες, καθως και οι τρεις χαρακτηρες "." "?" "!".
Η περιοχη αυτη θα ειναι 20 bytes . Η εισαγωγη θα τερματιζει ειτε αν πατηθει το & ειτε αν εχουν εισαχθει 20 χαρακτηρες
Το προγραμμα 8α ελεγχει εαν δεν εχει εισαχθει τιποτα και τοτε θα τερματιζει.
αν εχει εισαχθει κατι, θα εμφανιζει στην οθονη τα ακολου8α. α)στην πρωτη γραμμη θα εμφανιζει τους μικρους λατινικους χαρακτηρες με αντιστροφη σειρα απο αυτην που εισηχθησαν και β) στην 2η σειρα θα εμφανιζει τα συμβολα ως εχουν.

Εγω εγραψα τα εξης αλλα καπου κανς λαθως.

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

TITLE ASK23
ASSUME CS:CODE,DS:DATA
CODE SEGMENT 
    ARXI:
         MOV AX,DATA
         MOV DS,AX
         
         LEA DX,MES
         MOV AH,9
         INT 21H 
         
         MOV CX,20 ;20 επαναληψεις 
         MOV SI,0 
      L1:     
         MOV AH,08h ;εισαγωγη χωρις εμφανιση
         INT 21h
         
         CMP AL,33 ;!
         JE L2
         
         CMP AL,38 ;&
         JE L4
         
         CMP AL,46 ;.
         JE L2
         
         CMP AL,63 ;?
         JE L2
         
         CMP AL,'a'
         JB L3
         
         CMP AL,'z'
         JB L2
         JMP L3
      L2:         
         MOV BUFFER[SI],AL ;γεμησμα buffer με τιμες 
         INC SI                     
      L3:        
         DEC CX
         LOOP L1
      L4:   
         CMP BUFFER[0],0 ;αν δεν εχει εισαχ8ει κατι τερματιζει
         JE END
         
         MOV CX,20 
         MOV SI,0
      L5:   
         CMP BUFFER[SI],'a'
         JB TELOS
         MOV AL,BUFFER[SI]    ;τωρα εδω δεν χερω πως να παρω μονο τα μικρα λατινικα και να τα εμφανησω αναποδα οποτε εκανα αυτο με την φαντασια μ
         MOV BUFFER2[SI],AL
                  
   TELOS:
         INC SI
         DEC CX
         LOOP L5
         
         LEA DX,BUFFER2
         MOV AH,9
         INT 21H
         
         MOV CX,20
         MOV SI,0
         
      L6:
         CMP BUFFER[SI],'a'
         
         JA TELOS
         MOV AL,BUFFER[SI]    ;το ιδιο και δω δεν ξερω πωσ να κανς εμφανησι και μαλιστα σε νεα σειρα στην οθονη
         MOV BUFFER3[SI],AL 
                  
  TELOS2: 
         INC SI
         DEC CX
         LOOP L6
         
         LEA DX,BUFFER3
         MOV AH,9
         INT 21H  
     END:    
         MOV AX,4CH
         INT 21H
CODE ENDS

DATA SEGMENT
         MES DB 13,10,"EISAGETAI APO TO PLHKTROLOGIO OTI 8ELETE $"
         BUFFER DB 20 DUP (0)
         BUFFER2 DB 40 DUP (0)
         BUFFER3 DB 40 DUP (0)           
DATA ENDS 

END ARXI

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

Emulator 8086: Eμφανιση δεδομενων απο πινακα.

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

Γειά σου tazonis,

Υπόψιν ότι δεν δουλεύω τον EMU8086.
Εκτιμώ την προσπάθεια σου, keep practising.

Απλή προσέγγιση της άσκησης.

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

TITLE ASK23
ASSUME CS:CODE,DS:DATA
CODE SEGMENT
        ARXI:
            MOV AX, DATA
            MOV DS, AX
            
            LEA SI, MES
            CALL PUTS

            MOV CX, 20
            LEA SI, S1
            LEA DI, S2
            
        GETC:
            MOV AH, 08h
            INT 21h
            CMP AL, '&'
            JE PRINT
            CMP AL, 'a'
            JB GT1
            CMP AL, 'z'
            JA GT1
            MOV [DI], AL
            INC DI
            JMP GT3

                GT1:
            CMP AL, '!'
            JE GT2
            CMP AL, '.'
            JE GT2
            CMP AL, '?'
            JNE GT3

                GT2:
            MOV [SI], AL
            INC SI

                GT3:
            LOOP GETC

        PRINT:
            CMP SI, OFFSET S1
            JE PR1
            CALL NEWLINE
            LEA SI, S1
            CALL PUTS

                PR1:
            CMP DI, OFFSET S2
            JE END
            CALL NEWLINE
            LEA SI, S2
            CALL PUTS

        END:
            MOV AX, 4Ch
            INT 21h

        NEWLINE:
            PUSH AX
            MOV AL, 13
            CALL PUTC
            MOV AL, 10
            CALL PUTC
            POP AX
            RET

        PUTS:
            PUSH AX
            PUSH SI
                PS1:
            MOV AL, [SI]
            TEST AL, AL
            JZ PS2
            CALL PUTC
            INC SI
            JMP PS1
                PS2:
            POP SI
            POP AX
            RET

        PUTC:
            PUSH AX
            MOV AH, 0Eh
            INT 10H
            POP AX
            RET


CODE ENDS

DATA SEGMENT
    MES DB 13,10,"EISAGETAI APO TO PLHKTROLOGIO OTI 8ELETE:",0
    S1 DB 21 DUP (0)
    S2 DB 21 DUP (0)
DATA ENDS

END ARXI

Ο κώδικας έχει 2 buffer, τον S1 -με δείκτη στον SI- για τα σύμβολα, και τον S2 -με δείκτη στον DI- για τους χαρακτήρες.

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

			LEA SI, S1
			LEA DI, S2
Στους 2 buffer αποθηκεύεται χαρακτήρας μόνο εάν είναι έγκυρος.
Στο τέλος τυπώνονται διαδοχικά εφόσον έχει εισαχθεί χαρακτήρας, με ένα απλό τρίκ.
Συγκρίνω την τιμή στον δείκτη με την διεύθυνση του buffer.
Εάν έχουν την ίδια τιμή ο δείκτης βρίσκεται στο ίδιο σημείο, δεν γράφτηκε χαρακτήρας.

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

            CMP SI, OFFSET S1
            JE PR1
Η ρουτίνα PUTS τυπώνει NULL terminated strings στον SI

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

        PUTS:
            PUSH AX
            PUSH SI
        PS1:
            MOV AL, [SI]
            TEST AL, AL
            JZ PS2
            MOV AH, 0Eh
            INT 10h
            INC SI
            JMP PS1
        PS2:
            POP SI
            POP AX
            RET
Η ρουτίνα PUTC τυπώνει τον χαρακτήρα στον AL

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

        PUTC:
            PUSH AX
            MOV AH, 0Eh
            INT 10H
            POP AX
            RET
Το πρόγραμμα θέλει και μια ρουτίνα reverse string.
Την παρέλειψα εσκεμμένα, πάλεψε το, εδώ είμαστε.

Απάντηση

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

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

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