|  Startsida |  Hårdvara |  Nätverk |  Programmering |  Programvara |  Felsökning |  System |   
Programmering
  • C /C + + -programmering
  • Computer Programspråk
  • Delphi Programmering
  • Java Programming
  • JavaScript programmering
  • PHP /MySQL Programmering
  • perl Programmering
  • python Programming
  • Ruby programmering
  • Visual Basics Programmering
  • * Dator Kunskap >> Programmering >> Computer Programspråk >> Content

    Skriv ett monteringsspråkprogram för att hitta Fibonacci -serien?

    Det specifika monteringsspråket beror starkt på målarkitekturen (t.ex. x86, arm, mips). Jag ger ett exempel med x86-64-montering (med NASM-monteraren) för Linux. Detta program beräknar och skriver ut de första 10 Fibonacci -numren.

    `` `

    avsnitt. Data

    fib_msg db "Fibonacci nummer:", 0

    NewLine DB 0xa, 0; Newline -karaktär

    Avsnitt .BSS

    fib_sequence resd 10; Reservera utrymme för 10 Fibonacci -nummer

    avsnitt .text

    global _start

    _start:

    ; Initiera de två första Fibonacci -numren

    mov dword [fib_sequence], 0

    mov dword [fib_sequence + 4], 1

    ; Beräkna de återstående Fibonacci -numren

    mov ecx, 8; Loop Counter (vi har redan de två första)

    mov ESI, 8; Pekare till nästa Fibonacci -nummer för att beräkna

    loop_start:

    mov eax, [fib_sequence + esi - 8]; Få det föregående numret

    Lägg till EAX, [fib_sequence + esi - 4]; Lägg till numret innan det

    mov [fib_sequence + esi], eax; Lagra resultatet

    lägg till ESI, 4; Flytta till nästa Fibonacci -nummerplats

    Loop Loop_Start

    ; Skriv ut Fibonacci -sekvensen

    mov eax, 1; sys_write

    MOV EDI, 1; stdout

    mov rsi, fib_msg

    mov rdx, 18

    syscall

    mov ecx, 10; Slingbänk för tryckning

    mov esi, fib_sequence

    print_loop:

    mov eax, 1; sys_write

    MOV EDI, 1; stdout

    mov rdx, 11; Max siffror för ett 32-bitars nummer + utrymme + null

    mov rdi, 1; stdout

    ; Konvertera numret till en sträng (enkel metod, ingen felhantering för mycket stort antal)

    mov ebx, 10

    MOV EDI, buffert; Använd en buffert för att lagra strängen

    MOV R8D, 0; Initiera strängens index

    convert_loop:

    xor edx, edx

    div ebx; Dela med 10

    lägg till edx, '0'; Konvertera resten till ASCII

    DEC R8D; Flytta index

    mov [edi+r8d*1], dl

    cmp eax, 0

    jne convert_loop

    ; Omvänd strängen innan du skriver ut

    MOV R9D, R8D

    mov rcx, 0

    omvänd_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, buffert

    syscall

    lägg till ESI, 4; Flytta till nästa Fibonacci -nummer

    mov eax, 1

    mov edi, 1

    MOV RSI, Newline

    mov rdx, 1

    syscall

    Loop Print_loop

    ; Lämna programmet

    mov eax, 60; sys_exit

    XOR EDI, EDI; utgångskod 0

    syscall

    avsnitt. Data

    buffertider 11 dB 0; Buffert för strängkonvertering

    `` `

    för att montera och köra den här koden:

    1. spara: Spara koden som en ".asm" -fil (t.ex. "Fibonacci.asm").

    2. montering: Använd NASM för att montera den:`NASM -F ELF64 FIBONACCI.ASM`

    3. länk: Länk objektfilen:`ld -o Fibonacci Fibonacci.o`

    4. Run: Utför programmet:`./Fibonacci`

    Denna förbättrade version inkluderar:

    * tydligare kommentarer: Förklara varje steg.

    * strängkonvertering: En grundalgoritm för att konvertera Fibonacci -numren till utskrivbara strängar. (Obs:Den här strängkonverteringen är enkel och hanterar inte mycket stort antal robust. För produktionskod skulle ett mer sofistikerat tillvägagångssätt behövas.)

    * String reversal: Antalet konverteras till en sträng i omvänd ordning och vändes sedan innan du trycker.

    * newlines: Lägger till nylinjer mellan siffror för bättre läsbarhet.

    * felhantering (saknas): Produktionskad kod skulle behöva kontrollera om potentiella fel (som buffertflöden).

    Kom ihåg att monteringsprogrammering är mycket låg nivå och arkitekturspecifik. Detta exempel är skräddarsydd efter x86-64 och Linux. Anpassningar skulle behövas för andra system. Språk på högre nivå föredras i allmänhet för de flesta programmeringsuppgifter på grund av deras ökade läsbarhet, portabilitet och utvecklarproduktivitet.

    Tidigare:

    nästa:
    relaterade artiklar
    ·Vilka funktioner utför tolkar i datorprogrammering?
    ·Ändra bakgrundsfärgen i GridView
    ·Vad är skillnaden mellan Analoga & Digitala Data
    ·Hur E posta en länk i Flash Actionscript
    ·Hur man lär Binary Code
    ·Hur man skapar en Makefile
    ·Hur man konfigurerar MIT Scheme för SICP
    ·Hur man skriver ett förfarande i Pascal
    ·Vad betyder prioritetsordningen i datorspråk?
    ·Hur man kompilerar en Android Project på Windows
    Utvalda artiklarna
    ·Ta reda på om en sträng är en Palindrom i Python
    ·Hur man använder en Remote Debugger
    ·Hur Synkronisera block av kod i Java
    ·Hur man öppnar en PDF-fil i Java
    ·Lägga till en DataRelation
    ·Hur man avgör om ett ark finns inom en arbetsbok med V…
    ·Vad är en PHP Echo
    ·Java Kan du inte hitta symbol Metod Out
    ·Hur man skriver ett program som kommer ut ordnade par i…
    ·Hur man reparerar en Tillfälligt stackutrymme Fel i Ja…
    Copyright © Dator Kunskap https://www.dator.xyz