Home Hardware Networking Programmazione Software Domanda Sistemi
Conoscenza del computer >> Programmazione >> Computer Programming Languages >> .

Scrivi un programma di linguaggio assembly per trovare la serie Fibonacci?

Il linguaggio di assemblaggio specifico dipende fortemente dall'architettura target (ad es. X86, braccio, mips). Fornirò un esempio utilizzando l'assemblaggio X86-64 (usando l'assemblatore NASM) per Linux. Questo programma calcola e stampa i primi 10 numeri Fibonacci.

Assemblaggio `` `

sezione .data

fib_msg db "numeri fibonacci:", 0

newline db 0xa, 0; personaggio di Newline

Sezione .BSS

fib_sequence resd 10; Riserva lo spazio per 10 numeri di fibonacci

Sezione .Text

globale _start

_inizio:

; Inizializza i primi due numeri di fibonacci

mov dword [fib_sequence], 0

mov dword [fib_sequence + 4], 1

; Calcola i restanti numeri di fibonacci

mov ecx, 8; Contatore del loop (abbiamo già i primi due)

Mov Esi, 8; Puntatore al prossimo numero di fibonacci da calcolare

Loop_start:

mov eax, [fib_sequence + esi - 8]; Ottieni il numero precedente

Aggiungi eax, [fib_sequence + eSi - 4]; Aggiungi il numero prima di quello

mov [fib_sequence + eSi], eax; Conservare il risultato

Aggiungi ESI, 4; Passa alla posizione del numero di Fibonacci successivo

Loop Loop_start

; Stampa la sequenza Fibonacci

mov eax, 1; sys_write

Mov Edi, 1; stdout

MOV RSI, FIB_MSG

mov rdx, 18

Syscall

mov ecx, 10; Contatore del ciclo per la stampa

mov eSi, fib_sequence

print_loop:

mov eax, 1; sys_write

Mov Edi, 1; stdout

mov rdx, 11; Cifre massime per un numero a 32 bit + spazio + null

mov rdi, 1; stdout

; Converti il ​​numero in una stringa (approccio semplice, nessuna gestione degli errori per numeri molto grandi)

mov ebx, 10

Mov Edi, buffer; Usa un buffer per archiviare la stringa

mov r8d, 0; Inizializza l'indice della stringa

convert_loop:

XOR EDX, EDX

div ebx; Dividere per 10

Aggiungi edx, '0'; Convertire il resto in ascii

Dec R8D; Sposta l'indice

MOV [EDI+R8D*1], DL

CMP EAX, 0

jne convert_loop

; Invertire la stringa prima della stampa

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 inverse_loop

Mov RSI, buffer

Syscall

Aggiungi ESI, 4; Passa al prossimo numero di fibonacci

mov eax, 1

Mov Edi, 1

Mov RSI, Newline

mov rdx, 1

Syscall

Loop Print_Loop

; Esci dal programma

Mov Eax, 60; sys_exit

XOR EDI, EDI; Codice di uscita 0

Syscall

sezione .data

tampone tempi 11 dB 0; Tampone per la conversione delle stringhe

`` `

per assemblare ed eseguire questo codice:

1. Salva: Salva il codice come file `.asm` (ad es.` Fibonacci.asm`).

2. Assembla: Usa NASM per assemblarlo:`NASM -f elf64 fibonacci.asm`

3. Link: Collega il file dell'oggetto:`ld -o fibonacci fibonacci.o`

4. Run: Eseguire il programma:`./Fibonacci`

Questa versione migliorata include:

* Commenti più chiari: Spiegare ogni passaggio.

* Conversione della stringa: Un algoritmo di base per convertire i numeri Fibonacci in stringhe stampabili. (Nota:questa conversione delle stringhe è semplice e non gestisce notevolmente numeri molto grandi. Per il codice di produzione, sarebbe necessario un approccio più sofisticato.)

* String Reversion: Il numero viene convertito in una stringa in ordine inverso e quindi invertito prima della stampa.

* Newline: Aggiunge le nuove linee tra i numeri per una migliore leggibilità.

* Gestione degli errori (mancante): Il codice pronto per la produzione dovrebbe verificare i potenziali errori (come gli overflow buffer).

Ricorda che la programmazione dell'assembly è molto basso e specifica per l'architettura. Questo esempio è adattato a X86-64 e Linux. Gli adattamenti sarebbero necessari per altri sistemi. I linguaggi di livello superiore sono generalmente preferiti per la maggior parte delle attività di programmazione a causa della loro maggiore leggibilità, portabilità e produttività degli sviluppatori.

 

Programmazione © www.354353.com