Προγραμματισμός

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Γλώσσες Προγραμματισμού Υπολογιστών

Γράψτε ένα πρόγραμμα γλώσσας συναρμολόγησης για να βρείτε τη σειρά Fibonacci;

Η συγκεκριμένη γλώσσα συναρμολόγησης εξαρτάται σε μεγάλο βαθμό από την αρχιτεκτονική -στόχο (π.χ. X86, ARM, MIPS). Θα δώσω ένα παράδειγμα χρησιμοποιώντας το συγκρότημα X86-64 (χρησιμοποιώντας το NASM Assembler) για το Linux. Αυτό το πρόγραμμα υπολογίζει και εκτυπώνει τους πρώτους 10 αριθμούς Fibonacci.

`` `Συνέλευση

Τμήμα .Data

FIB_MSG DB "Fibonacci αριθμοί:", 0

Newline DB 0xa, 0; Newline χαρακτήρα

Τμήμα .bss

FIB_SECENTS RESD 10; Διατηρήστε χώρο για 10 αριθμούς Fibonacci

Τμήμα.

παγκόσμιο _start

_αρχή:

; Αρχικοποιήστε τους δύο πρώτους αριθμούς Fibonacci

mov dword [fib_equence], 0

MOV DWORD [FIB_SECENCE + 4], 1

; Υπολογίστε τους υπόλοιπους αριθμούς Fibonacci

MOV ECX, 8; Counter Loop (έχουμε ήδη τα πρώτα δύο)

Mov Esi, 8; Δείκτης στον επόμενο αριθμό Fibonacci για υπολογισμό

loop_start:

mov eax, [fib_ease + esi - 8]; Αποκτήστε τον προηγούμενο αριθμό

Προσθέστε το EAX, [FIB_SERSENCE + ESI - 4]; Προσθέστε τον αριθμό πριν από αυτό

mov [fib_equence + esi], eax; Αποθηκεύστε το αποτέλεσμα

Add Esi, 4; Μετακινηθείτε στην επόμενη τοποθεσία του αριθμού Fibonacci

loop loop_start

; Εκτυπώστε την ακολουθία Fibonacci

mov eax, 1; sys_write

MOV EDI, 1; στεγανόστρωμα

mov rsi, fib_msg

MOV RDX, 18

συκώ

MOV ECX, 10; Μετρητής βρόχου για εκτύπωση

mov esi, fib_sease

print_loop:

mov eax, 1; sys_write

MOV EDI, 1; στεγανόστρωμα

MOV RDX, 11; Μέγιστα ψηφία για αριθμό 32 bit + χώρο + μηδέν

MOV RDI, 1; στεγανόστρωμα

; Μετατρέψτε τον αριθμό σε μια συμβολοσειρά (απλή προσέγγιση, χωρίς χειρισμό σφαλμάτων για πολύ μεγάλους αριθμούς)

MOV EBX, 10

MOV EDI, buffer; Χρησιμοποιήστε ένα buffer για να αποθηκεύσετε τη συμβολοσειρά

MOV R8D, 0; Αρχικοποιήστε το ευρετήριο της συμβολοσειράς

convert_loop:

XOR EDX, EDX

div ebx; Διαιρέστε με 10

Προσθέστε το EDX, '0'; Μετατρέψτε το υπόλοιπο σε ASCII

DEC R8D; Ευρετήριο μετακίνησης

MOV [EDI+R8D*1], DL

cmp eax, 0

jne convert_loop

; Αντιστρέψτε τη συμβολοσειρά πριν από την εκτύπωση

MOV R9D, R8D

mov rcx, 0

Reverse_loop:

MOV AL, [EDI + RCX]

MOV BL, [EDI + R9D]

MOV [EDI + RCX], BL

MOV [EDI + R9D], AL

Inc RCX

DEC R9D

CMP RCX, R9D

jl reverse_loop

mov rsi, buffer

συκώ

Add Esi, 4; Μετακινηθείτε στον επόμενο αριθμό Fibonacci

mov eax, 1

Mov Edi, 1

mov rsi, newline

mov rdx, 1

συκώ

loop print_loop

; Έξοδος από το πρόγραμμα

MOV EAX, 60; sys_exit

XOR EDI, EDI. Κωδικός εξόδου 0

συκώ

Τμήμα .Data

Buffer Times 11 dB 0; Buffer για μετατροπή συμβολοσειράς

`` `

Για να συναρμολογήσετε και να εκτελέσετε αυτόν τον κωδικό:

1. Αποθήκευση: Αποθηκεύστε τον κώδικα ως αρχείο `.asm` (π.χ.` fibonacci.asm ').

2. συναρμολόγηση: Χρησιμοποιήστε το NASM για να το συναρμολογήσετε:`nasm -f elf64 fibonacci.asm '

3. σύνδεσμος: Συνδέστε το αρχείο αντικειμένου:`ld -o fibonacci fibonacci.o '

4. Εκτέλεση: Εκτελέστε το πρόγραμμα:`./Fibonacci '

Αυτή η βελτιωμένη έκδοση περιλαμβάνει:

* Καθαρότερα σχόλια: Εξηγώντας κάθε βήμα.

* Μετατροπή συμβολοσειράς: Ένας βασικός αλγόριθμος για τη μετατροπή των αριθμών Fibonacci σε εκτυπώσιμες χορδές. (Σημείωση:Αυτή η μετατροπή συμβολοσειράς είναι απλή και δεν χειρίζεται πολύ μεγάλους αριθμούς. Για τον κωδικό παραγωγής, θα χρειαζόταν μια πιο εξελιγμένη προσέγγιση.)

* Αναστροφή συμβολοσειράς: Ο αριθμός μετατρέπεται σε μια συμβολοσειρά με αντίστροφη σειρά και στη συνέχεια αντιστρέφεται πριν από την εκτύπωση.

* newlines: Προσθέτει νέες γραμμές μεταξύ αριθμών για καλύτερη αναγνωσιμότητα.

* Χειρισμός σφαλμάτων (λείπει): Ο κώδικας που είναι έτοιμος για παραγωγή θα πρέπει να ελέγξει για πιθανά σφάλματα (όπως υπερχείλιση buffer).

Θυμηθείτε ότι ο προγραμματισμός της συναρμολόγησης είναι πολύ χαμηλού επιπέδου και αρχιτεκτονική. Αυτό το παράδειγμα είναι προσαρμοσμένο σε x86-64 και Linux. Οι προσαρμογές θα χρειαστούν για άλλα συστήματα. Οι γλώσσες υψηλότερου επιπέδου προτιμώνται γενικά για τις περισσότερες εργασίες προγραμματισμού λόγω της αυξημένης αναγνωσιμότητας, της φορητότητας και της παραγωγικότητας των προγραμματιστών.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα