Κολλημα σε Assembly 8086

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

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

Απάντηση
fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 24 Απρ 2010 15:59

Φιλτατοι ειμαι φοιτητης στα Τει Θεσσαλονικης στο τμημα Πληροφορικης.
Αντιμετωπιζω το εξης προβλημα σε μια εργασια μου:

Να συντάξω πρόγραμμα με το οποίο έπειτα από μήνυμα προς τον χρήστη, θα εισάγω από το πληκτρολόγιο κείμενο με λατινικούς χαρακτήρες και αριθμούς. Θα αποθηκεύονται σε μια περιοχή μνήμης μετά από έλεγχο που θα γίνεται, μόνο οι κεφαλαίοι και οι μικροί λατινικοί χαρακτήρες καθώς και οι αριθμοί.
Η περιοχή αυτή θα είναι μεγέθους 30 bytes. Η εισαγωγή θα τερματίζεται αν πατηθεί το σύμβολο τελεία (‘.’) ή αν έχω εισάγει 30 χαρακτήρες.
Το πρόγραμμα θα ελέγχει εάν έχουν εισαχθεί κάποιοι χαρακτήρες, και στην περίπτωση που δεν έχω εισάγει τίποτα θα εμφανίζει κατάλληλο μήνυμα και θα τερματίζεται.
Αν όμως έχω εισάγει κάποιους χαρακτήρες, θα εμφανίζει στην οθόνη μόνο τους μικρούς λατινικούς χαρακτήρες σε μία γραμμή και τους αριθμούς στην επόμενη γραμμή.


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

Ο κωδικας στον emulator 8086 που εγραψα ειναι ο εξης:

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

TITLE ASKISI3
KODIKAS SEGMENT 
ASSUME CS:KODIKAS,DS:DEDOMENA

             ; Oi 2 parakatw entoles apokathistoun thn timh toy DS.
ARXH:     
MOV AX,DEDOMENA
MOV DS,AX 

LEA DX,MIN2  ; GINETAI H EMFANISH TOU MYNHMATOS SE PERIPTOSI POU DEN EISAXTHEI KATI.
MOV AH,09H
INT 21H 

LEA DX,MIN1  ; Bazoyme ti dieythinsi mnimis toy Message1 ston DX 
MOV AH,09H   ; Metaferoyme ston AH to 9 gia na mporoyme na emfanisoyme to Message1
INT 21H      ; Kaloyme to leitoyrgiko systima na emfanisei stin othoni to Message1

B1:
MOV CX,30    ; METRHTHS EPANALHPSHS
MOV SI,0

B2: 
 
MOV AH,01H
INT 21H

B3:  
 
CMP AL,"."    ; ELEGXETAI AN THA PATITHEI TO #. AN PATITHEI TOTE TO PROGRAMMA TERMATIZETAI.
JE EMFANISI1 
             

B4:  
CMP AL,'0'  
JB B8

B5: 
CMP AL,'9'
JB B8   


 
B6:
  
CMP AL,'a'
JB B8

B7:
CMP AL,'z'
JB B8 

    
     
B8:
  
 
MOV BUFFER[SI],AL  ; sto buffer tha apothikeutei o kathe xareaktiras kai arithmos pou tha pliktrologisei o xristis.  
INC SI 
  

B9:
CMP SI,30
JB B2  

EMFANISI1: 

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



CMP SI,0
JE TELOS 
  
MOV CX,SI
MOV SI,0  

              

EMFANISI2: 

MOV DL,BUFFER[SI]  
JE EMFANISI5


EMFANISI4:

INC SI          ; AYXISI TOU DEIKTH 
MOV AH,02H      ; KLHSH TOU DOS GIA EMFANISI XARAKTHRA.
INT 21H         ; DIAKOPH TOU DOS





EMFANISI5:

LOOP EMFANISI2

TELOS: 

                ; Oi 2 epomenes entoles termatizoyn to programma kai epistrefoyn sto leitoyrgiko sistima
MOV AH,4CH
INT 21H

KODIKAS ENDS
DEDOMENA SEGMENT

BUFFER DB 30 DUP(0)  ; ORIZETAI MIA PERIOXH MNHMHS 40 BYTES ME ONOMA BUFFER.
MIN1 DB 'DWSTE KEIMENO ME LATINIKOUS XARAKTIRES KAI ARITHMOUS :',10,13,'$'  ; TO MYNHMA PROTROPHS PROS TON XRHSTH NA PLIKTROLOGHSEI XARAKTIRA,ARITHMO.
MIN2 DB 'DEN KANATE EISAGOGI!!!',10,13, '$' ;TO MYNHMA POU THA EMFANISTEI AN DEN PLIKTROLOGHSEIKATI O XRHSTHS. 
MIN3 DB '',10,13, '$' 

DEDOMENA ENDS
END ARXH             ; Me tin odigia END leme apo poy tha arxisei na ektelite to programma mas
Thanks προκαταβολικα.

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

Κολλημα σε Assembly 8086

Δημοσίευση από LightForce » 25 Απρ 2010 00:27

hi fantomas,

Την έχεις σχεδόν λύσει την άσκηση.
Μια απλή λύση στο πρόβλημα για τα μικρά γράμματα με την ρουτίνα islower()

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

ISLOWER:
XOR AX,AX          
CMP DL,"a"
JB R1
CMP DL,"z" + 1
ADC AL,0
R1: RET                 ; εάν αποτύχει, επιστρέφει 0 στον AL
Μπορείς στην συνέχεια να τυπώσεις μόνο τα μικρά γράμματα.

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

MOV CX,SI
MOV SI,-1

EMFANISI2:
INC SI
MOV DL,BUFFER[SI]
CALL ISLOWER
TEST AL, AL
JΖ R0
MOV AH,02H    ; KLHSH TOU DOS GIA EMFANISI XARAKTHRA.
INT 21H    ; DIAKOPH TOU DOS
R0:     LOOP EMFANISI2
Χρειάζεσαι ανάλογο κώδικα για τους αριθμούς μόνο.

fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 25 Απρ 2010 11:29

Ευχαριστω για την απαντηση.Ομως υποπρογραμματα δεν εχουμε κανει ακομα.. μηπως υπαρχει καποιος αλλος απλος τροπος?
Στο κομματι αυτο?Χωρις υποπρογραμμα;

EMFANISI2:
INC SI
MOV DL,BUFFER[SI]
CALL ISLOWER
TEST AL, AL
JΖ R0
MOV AH,02H ; KLHSH TOU DOS GIA EMFANISI XARAKTHRA.
INT 21H ; DIAKOPH TOU DOS
R0: LOOP EMFANISI2

fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 25 Απρ 2010 12:47

fantomas έγραψε:Ευχαριστω για την απαντηση.Ομως υποπρογραμματα δεν εχουμε κανει ακομα.. μηπως υπαρχει καποιος αλλος απλος τροπος?
Στο κομματι αυτο?Χωρις υποπρογραμμα;

EMFANISI2:
INC SI
MOV DL,BUFFER[SI]
CALL ISLOWER
TEST AL, AL
JΖ R0
MOV AH,02H ; KLHSH TOU DOS GIA EMFANISI XARAKTHRA.
INT 21H ; DIAKOPH TOU DOS
R0: LOOP EMFANISI2
Βασικα με τον πρωτο κωδικα που εγραψες χθες κατι καταλαβα αλλα δεν θυμαμαι ποιος ηταν πολυ καλα .Αν μπορεις τον ξαναγραφεις?Ευχαριστω και παλι. 8)

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

Κολλημα σε Assembly 8086

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

hi,

Δοκίμασε τώρα fantomas.
Ο κώδικας είναι πολύ απλός, σαρώνει τον buffer και τυπώνει πρώτα μόνο τα μικρά γράμματα, ελέγχοντας εάν ο χαρακτήρας είναι >='a' και <='z'
Στην συνέχεια newline και έπειτα το ίδιο κομμάτι για τους αριθμούς.

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

CMP SI,0
JE TELOS
 
MOV CX,SI
MOV SI,-1 
       
PUSH SI             
PUSH CX            

EMFANISI2&#58;
INC SI          ; AYXISI TOU DEIKTH
MOV DL,BUFFER&#91;SI&#93; 
CMP DL, 'a'
JB .L1
CMP DL, 'z'
JA .L1
MOV AH,02H      ; KLHSH TOU DOS GIA EMFANISI XARAKTHRA.
INT 21H         ; DIAKOPH TOU DOS
.L1&#58; LOOP EMFANISI2   
  
POP CX          
POP SI

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

EMFANISI3&#58;
INC SI          ; AYXISI TOU DEIKTH
MOV DL,BUFFER&#91;SI&#93; 
CMP DL, '0'
JB .L2
CMP DL, '9'
JA .L2
MOV AH,02H      ; KLHSH TOU DOS GIA EMFANISI XARAKTHRA.
INT 21H         ; DIAKOPH TOU DOS
.L2&#58; LOOP EMFANISI3

fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 25 Απρ 2010 17:56

Καλησπερα. Δεν εχω λογια.Χιλια ευχαριστω.Εισαι expert.Ευτυχως το προγραμμα ετρεξε οπως επρεπε. Παντως τον κωδικα τωρα τον καταλαβα.Ευχαριστω και παλι. :D

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

Κολλημα σε Assembly 8086

Δημοσίευση από LightForce » 26 Απρ 2010 00:05

Παρακαλώ, να 'σαι καλά.

Μην αμελήσεις να διορθώσεις τα B4..B7 εφόσον θέλεις να αποθηκεύονται μόνο οι χαρακτήρες '0'..'9', 'a'..'z' στον buffer.

fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 01 Μάιος 2010 12:37

γεια χαρα.βασικα θελω να ρωτησω κατι.
Πως μπορω να τερματισω την εισαγωγη κειμενου πατωντας το'##';
Βασικα αυτο απαιτει η εργασια μου. Πληκτρολογω κειμενο και σταματω την εισαγωγη κειμενου
πατωντας '##'.
Ευχαριστω προκαταβολικα.

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

Κολλημα σε Assembly 8086

Δημοσίευση από LightForce » 01 Μάιος 2010 17:06

Διάβασε έναν χαρακτήρα, εάν είναι # και ο επόμενος είναι πάλι # ...

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

            org 100h

readkey&#58;
            mov ah, 01h
            int 21h
            cmp al, '#'
            jnz continue
            ; mov ah, 01h
            int 21h
            cmp al, '#'
            jz exit

continue&#58;
            ;
            ;
            ;
            jmp readkey


exit&#58;
            int 20h

fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 14 Μάιος 2010 18:25

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

Να γραφεί πρόγραμμα που έχει δύο υποπρογράμματα.
Το πρώτο υποπρόγραμμα θα εμφανίζει κατάλληλο μήνυμα και ακολούθως θα κάνει εισαγωγή από το πληκτρολόγιο δυο μονοψήφιων αριθμων του δεκαεξαδικού συστήματος (χωρίς εμφάνιση) και μετά από κατάλληλο έλεγχο θα τον εμφανίζει στην οθόνη.
Στη συνέχεια, στο κυρίως πρόγραμμα θα γίνεται πολλαπλασιασμός των δύο μονοψήφιων αριθμών που έχουν εισαχθεί προηγουμένως και θα καλείται το δεύτερο υποπρόγραμμα.
Το δεύτερο υποπρόγραμμα θα εμφανίζει στην οθόνη το γινόμενό τους στο δεκαεξαδικό σύστημα μετά από κατάλληλο μήνυμα.

Το προβλημα μου ειναι οτι δεν μπορω να βγαλω σωστο αποτελεσμα. Οτι αριθμο και να πατησω βγαζει αποτελεσμα 00.


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

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

TITLE ASKISI5
KODIKAS SEGMENT PUBLIC
ASSUME CS&#58;KODIKAS, DS&#58;DEDOMENA, SS&#58;SOROS

MAIN PROC NEAR
	MOV AX,DEDOMENA ; Apokatastash tou DS
	MOV DS,AX	; Apokatastash tou DS
      
   LEA DX,APOTEL
    MOV AH,09H	; Typwnoume to mhnyma
    INT 21H 
    
     
    
    MOV AL,NUM1	; Metaferoume tin timi toy NUM1 ston AL
    MOV BL,NUM2	; Bazoyme sto BL tin timi toy NUM2
    MUL BL      ; Kanoume ton pollaplasiasmo NUM1*NUM2

    
    
	 
     
    MOV DL, AL	; Metaferoume to athroisma apo ton AL ston DL gia na ginei to perasma meso kataxoriti
	
	CALL DISPLAY_HEX; Kaloume tin Display_hex    
	 
	 
	LEA DX,APOT
    MOV AH,09H	; Typwnoume to mhnyma
    INT 21H 
    
   
     
	MOV AH,4CH	; Eksodos sto leitoyrgiko systhma
	INT 21H 
	
MAIN ENDP

DISPLAY_HEX PROC NEAR    
     
     
    
    MOV AH, 01h ; eisagogi xaraktira apo to pliktrologio me parallili emfanisi
	INT 21H	 
	
	MOV AH, 01h ; eisagogi xaraktira apo to pliktrologio me parallili emfanisi
	INT 21H
    
    
   	
     
     
MOV BL,DL	; Metafero to periexomeno tou DL se allo kataxoriti giati ton xriazomai kai pali

	MOV BH,0	; Midenizo ton BH kai etsi ksero oti o BX exei ayto pou eixe o BL
	MOV CL,4	; Bazo ston CL 4 gia na exo toses epanalipseis

	SHL BX,CL	; Metatopizo aristera ton BX tosa bit osa exei o CL
	MOV DL,BH	; Metaferoume ton proto hex arithmo apo ton BH ston DL gia na ginei to perasma 

	CALL ONE_DIGIT	; Kaloume tin One_digit 

	MOV CL,4	; Bazo ston CL 4 gia na exo toses epanalipseis

	SHR BL,CL	; Metatopizo Deksia ton BL tosa bit osa exei o CL
	MOV DL,BL	; Metaferoume ton deftero hex arithmo apo ton BL ston DL gia na ginei to perasma  
	
	 CALL ONE_DIGIT	; Kaloume tin One_digit 
    

	
	

	RET		; Epistrefo stin thesi apo opou klithike h yporoutina

DISPLAY_HEX ENDP


ONE_DIGIT PROC NEAR   
    
    
	
	CMP DL,9	; Sygkrinoume to DL me to 9 gia na ksexoriso an o DL exei arithmo 0-9 H metaksi 10-15
	JA GRAMMA	; An o DL einai metaksi 10-15 phgaine stin etiketa "Gramma" gia na emfanistei apo A-F

	ADD DL,48	; Metatrepoume ton arithmo poy exei o DL se xaraktira poy einai antistoixos se ASCII
	JMP NEXT	; Phgainoyme stin etiketa "Next" giati i epomeni grammi anaferetai gia arithmoys 10-15

GRAMMA&#58;	ADD DL, 'A'-10	; Metatrepoume ton aritho pou einai 10-15 sto antistoixo gramma A-F prosthetontas 55

  


NEXT&#58;	MOV AH,02H	; Emfanizoyme stin othoni to periexomeno tou DL
	    INT 21H  
 
	
TELOS&#58;	RET		; Epistrefo stin thesi apo opou klithike h yporoutina

ONE_DIGIT ENDP

KODIKAS ENDS

DEDOMENA SEGMENT 
    
	NUM1 DB 00h    
	NUM2 DB 00h
	
		
	
	APOTEL DB "EISAGETE 2 16DIKOUS ARITHMOUS&#58;",10,13,'$'
	APOT DB "TO GINOMENO EINAI&#58;",10,13,'$'				
DEDOMENA ENDS

SOROS SEGMENT STACK
	DB 256 DUP&#40;0&#41;
SOROS ENDS
	END MAIN

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

Κολλημα σε Assembly 8086

Δημοσίευση από LightForce » 15 Μάιος 2010 00:38

Γεια σου fantomas,

Το πρόγραμμα σου ξεκινάει λανθασμένα, πολλαπλασιάζει 0x0 μετά καλεί την DISPLAY_HEX

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

    MOV AL,NUM1   ; Metaferoume tin timi toy NUM1 ston AL
    MOV BL,NUM2   ; Bazoyme sto BL tin timi toy NUM2
    MUL BL       ; Kanoume ton pollaplasiasmo NUM1*NUM2         
     
    MOV DL, AL   ; Metaferoume to athroisma apo ton AL ston DL gia na ginei to perasma meso kataxoriti
   
   CALL DISPLAY_HEX  ; Kaloume tin Display_hex    


που διαβάζει συνεχόμενα 2 χαρακτήρες στον AL χωρίς νόημα.

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

    MOV AH, 01h ; eisagogi xaraktira apo to pliktrologio me parallili emfanisi
   INT 21H   
   
   MOV AH, 01h ; eisagogi xaraktira apo to pliktrologio me parallili emfanisi
   INT 21H


Τips που ίσως βοηθήσουν,


Για να μην εμφανιζεται ο χαρακτήρας:

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

            mov ah, 07h         		; INT 21h / AH=7 - character input without echo to AL
            int 21h
Ένας τρόπος για μετατροπή 4 bit σε ASCII hex ψηφίο 0..F

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

            ; AL = 10

            and al, 00001111b		  ; converts 4 bit &#40;1 nibble&#41; AL to ASCII hex in AL
            cmp al, 10
            sbb al, 69h
            das

            ; AL = 'A'

fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 16 Μάιος 2010 12:09

Ευχαριστω για την απαντηση. Δηλαδη τι θα πρεπει να κανω?

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

Κολλημα σε Assembly 8086

Δημοσίευση από LightForce » 16 Μάιος 2010 13:37

fantomas έγραψε:Ευχαριστω για την απαντηση. Δηλαδη τι θα πρεπει να κανω?
Συνέχισε να γράφεις κώδικα και να πειραματίζεσαι, είσαι σε καλό δρόμο.

Ίσως σε βοηθήσουν οι λίγες γραμμές κώδικα που ακολουθούν, σε TASM assembler σύνταξη.
Μην το θεωρήσεις defacto λύση, μια ιδέα μόνο.

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

; tasm demo.asm
; tlink /t demo

.model tiny
code segment
assume cs&#58;code, ds&#58;code
org 100h

start&#58;
        lea dx, APOTEL          ; print msg
        mov ah, 09h
        int 21h
        
        mov ah, 07h             ; read first char &#40;no echo&#41;
        int 21h                         
        
        call Asc2Bin            ; ASCII hex digit to binary
        mov bl, al              ; save value
        
        mov ah, 07h             ; read second char
        int 21h    
            
        call Asc2Bin            ; ASCII hex digit to binary
        mul bl                  ; AX=AL*BL                
                        
        push ax                 ; save AX
        
        lea dx, APOT            ; print msg
        mov ah, 09h
        int 21h                
        
        pop ax                  ; restore AX
        
        mov ah, al
        shr al, 4               ; 4-bit value to ASCII digit '0'...'9'; 'A'..'F'
        cmp al, 10              ;
        sbb al, 69h             ;
        das                     ;
        int 29h                 ; write char in AL to screen
        mov al, ah
        and al, 00001111b
        cmp al, 10
        sbb al, 69h
        das  
        int 29h                      
                
        mov  ah, 4ch            ; terminate program
        int  21h
  
    
Asc2Bin&#58;                        ; ASCII digit '0'...'9'; 'A'..'F' to binary
        cmp al, '9'
        jbe @@10
        sub al, 7
@@10&#58;
        sub al, '0'
        ret
        
       APOTEL db 'EISAGETE 2 16DIKOUS ARITHMOUS&#58;',10,13,'$'
       APOT db 'TO GINOMENO EINAI&#58;',10,13,'$' 

code ends
end start
*Η διακοπή INT 29h τυπώνει τον χαρακτήρα που βρίσκεται στον AL, θεωρείται undocumented, και ίσως σπάει την συμβατότητα με τον 8086.

fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 16 Μάιος 2010 16:55

Και παλι ευχαριστω! Τελικα με αυτον τον κωδικα μπηκα στο νοημα.Καταλαβα τι θελεις να πεις. 8)

fantomas
Δημοσιεύσεις: 38
Εγγραφή: 24 Απρ 2010 15:45

Κολλημα σε Assembly 8086

Δημοσίευση από fantomas » 01 Σεπ 2010 18:52

Θελω να σε ευχαριστησω LightForce ,για την πολυτιμη σου βοηθεια.Μπορεσα και περασα το μαθημα και με βαθμο μαλιστα.

Απάντηση

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

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

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