String parsing

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

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

Απάντηση
Άβαταρ μέλους
percules
Δημοσιεύσεις: 3
Εγγραφή: 08 Νοέμ 2009 11:03

String parsing

Δημοσίευση από percules » 08 Νοέμ 2009 11:21

Έχω μία εργασία που πρέπει να κάνω ένα μίνι λειτουργικό σε assembly.
Έχω πρόβλημα στο promt. Θέλω να δίνω 1 string και αυτό να χωρίζεται το πολύ σε 3 strings. Διαχωριστής είναι το κενό. Δηλαδή θέλω να κάνω string parsing σε assembly!
Με άλλα λόγια θέλω να δίνω εντολή και παραμέτρους (το πολύ 2 παράμετροι) πχ "copy here.txt there.txt" και το πρόγραμμα να χωρίζει εντολή και παραμέτρους ώστε να αναγνωρίζονται αργότερα και να εκτελείται η ανάλογη εντολή. Μπορεί κάποιος να βοηθήσει; Η έστω να μου στείλετε κάποιο link που να υποδεικνύεται η χρήση των strings και το string parsing σε assembly.
Χρησιμοποιώ τον emu8086.

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

String parsing

Δημοσίευση από LightForce » 08 Νοέμ 2009 13:19

Ηι percules, καλώς ήρθες.
Χρειάζεσαι, αν κατάλαβα καλά μία strtok() τύπου function σε 8086 κώδικα. Mείνε συντονισμένος αν μπορέσω αργότερα θα ετοιμάσω ένα απλό παράδειγμα.

Εντωμεταξύ μπορείς να μελετήσεις τα παραδείγματα που αφορούν strings στον EMU8086.

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

String parsing

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

Ένα παράδειγμα είναι η πολύ απλή ρουτίνα StrTokenizer που υπάρχει στην βιβλιοθήκη OASML.
Την τροποποίησα, η ρουτίνα αρχικά περνούσε τις source και dest διεθύνσεις μέσω στοίβας, επέλεξα καταχωρητές για ευκολία.
Λίγες παρατηρήσεις:

Ο AL πρέπει να φορτωθεί με τον χαρακτήρα διαχωρισμού πρίν καλέσεις την ρουτίνα.
Η OFFSET του destination string DI δεν μεταβάλλεται ενώ του source string SI αλλάζει έτσι ώστε με διαδοχικά καλέσματα στην ρουτίνα να 'δείχνει' το αμέσως επόμενο τμήμα.
Το μήκος του destination string θα είναι 0 εάν δεν βρεθεί επόμενο τμήμα.
Το source string δεν πρέπει να ξεκινάει η να τελειώνει με τον χαρακτήρα διαχωρισμού.

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

StrTokenizer:
            push di
            mov ah, al
@StrTokenizer:
            mov al, byte PTR [si]
            test al, al
            je @StrTokenizerEP
            cmp al, ah
            je @StrTokenizerNextToken
            mov byte PTR [di], al
            inc di
            inc si
            jmp @StrTokenizer
@StrTokenizerNextToken:
            inc si
@StrTokenizerEP:
            mov byte PTR [di], 0
            pop di
            ret

Δύο παραδείγματα χρήσης της ρουτίνας StrTokenizer χρησιμοποιώντας το κείμενο απο το post σου, delimiter ο χαρακτήρας Space (ASCII 20h)

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

           SourceStr db "copy here.txt there.txt",0
Παράδειγμα 1, παίρνεις το κείμενο copy

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

            mov al, 20h                        ; The delimiter
            mov si, OFFSET SourceStr           ; Source string's offset
            mov di, OFFSET DestStr             ; Destination string's offset
            call StrTokenizer                  ; Tokenizer the string (1nd portion)

            ; DestStr = 'copy'
Παράδειγμα 2, παίρνεις το κείμενο here.txt καλώντας την ρουτίνα 2 φορές συνεχόμενες.

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

            mov al, 20h                          ; The delimiter 
            mov si, OFFSET SourceStr            ; Source string's offset
            mov di, OFFSET DestStr              ; Destination string's offset
            call StrTokenizer                   ; Tokenizer the string (1nd portion)
            call StrTokenizer                   ; Tokenizer the string again (2nd portion)

            ; DestStr = 'here.txt'
Ελπίζω να βοήθησα και να σου έδωσα ιδέες.

Σημείωση:
H ρουτίνα τρέχει στον Emulator 8086 όπως επίσης και σε Flat Assembler εάν προστεθούν οι 2 γραμμές

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

            OFFSET fix
            PTR fix
στην αρχή του κώδικα.

Άβαταρ μέλους
percules
Δημοσιεύσεις: 3
Εγγραφή: 08 Νοέμ 2009 11:03

String parsing

Δημοσίευση από percules » 08 Νοέμ 2009 23:20

Σ' ευχαριστώ πολύ LightForce για τη βοήθεια.
Η εργασία μου είναι δυστυχώς σε emu8086, αν ήταν σε C++ θα ήταν πολύ πιο εύκολα τα πράγματα για εμένα. Είμαι αρχάριος ακόμα στην assembly αλλά πιστεύω ότι θα τα καταφέρω.
Ευχαριστώ και πάλι, θα επικοινωνήσω πάλι εάν έχω απορίες!

Απάντηση

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

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

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