`` `Συνέλευση
Τμήμα .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. Οι προσαρμογές θα χρειαστούν για άλλα συστήματα. Οι γλώσσες υψηλότερου επιπέδου προτιμώνται γενικά για τις περισσότερες εργασίες προγραμματισμού λόγω της αυξημένης αναγνωσιμότητας, της φορητότητας και της παραγωγικότητας των προγραμματιστών.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα