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.