Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Napíšte program montážneho jazyka, aby ste našli sériu Fibonacci?

Špecifický jazyk montáže do značnej miery závisí od cieľovej architektúry (napr. X86, ARM, MIPS). Uložím príklad pomocou zostavy X86-64 (pomocou zostavovateľa NASM) pre Linux. Tento program vypočíta a vytlačí prvých 10 čísel fibonacci.

`` `Zostava

sekcia .data

Fib_msg db "Fibonacci čísla:", 0

NEWLINE DB 0XA, 0; znak novej línie

sekcia .BSS

FIB_Squence Resd 10; Rezervný priestor pre 10 fibonacci čísel

sekcia .text

globálny _start

_start:

; Inicializujte prvé dve fibonacci čísla

MOV DWORD [FIB_Squence], 0

MOV DWORD [FIB_Squence + 4], 1

; Vypočítajte zostávajúce čísla fibonacci

MOV ECX, 8; Slučka (už máme prvé dve)

Mov Esi, 8; Ukazovateľ na ďalšie číslo fibonacci na výpočet

loop_start:

MOV EAX, [FIB_SESSECENCE + ESI - 8]; Získajte predchádzajúce číslo

Pridať EAX, [FIB_Squence + ESI - 4]; Pridajte číslo pred tým

MOV [FIB_Squence + ESI], EAX; Uložiť výsledok

Pridať ESI, 4; Prejdite na miesto nasledujúceho čísla Fibonacci

slučka loop_start

; Vytlačte sekvenciu fibonacci

Mov Eax, 1; sys_write

MOV EDI, 1; sýti

Mov rsi, fib_msg

MOV RDX, 18

syscall

MOV ECX, 10; Pult slučky na tlač

Mov Esi, fib_ sequence

print_loop:

Mov Eax, 1; sys_write

MOV EDI, 1; sýti

MOV RDX, 11; Maximálne číslice pre 32-bitové číslo + priestor + null

Mov rdi, 1; sýti

; Konvertovať číslo na reťazec (jednoduchý prístup, žiadne spracovanie chýb pre veľmi veľké čísla)

Mov Ebx, 10

MOV EDI, vyrovnávacia pamäť; Na uloženie reťazca použite vyrovnávaciu pamäť

MOV R8D, 0; Inicializujte index reťazca

convert_loop:

XOR EDX, EDX

Div Ebx; Rozdeľte 10

Pridať edx, '0'; Konvertovať zvyšok na ASCII

december R8D; Index

MOV [EDI+R8D*1], DL

CMP EAX, 0

jne convert_loop

; Pred tlačkou obráťte reťazec

MOV R9D, R8D

MOV RCX, 0

reverzná_lór:

Mov Al, [EDI + RCX]

MOV BL, [EDI + R9D]

MOV [EDI + RCX], BL

MOV [EDI + R9D], AL

Inc RCX

december R9D

CMP RCX, R9D

jl reverzný_lór

Mov RSI, vyrovnávacia pamäť

syscall

Pridať ESI, 4; Prejdite na ďalšie číslo fibonacci

Mov Eax, 1

Mov Edi, 1

MOV RSI, NEWLINE

Mov rdx, 1

syscall

slučka

; Opustiť program

Mov Eax, 60; sys_exit

XOR EDI, EDI; výstupný kód 0

syscall

sekcia .data

Časy vyrovnávacej pamäte 11 dB 0; Vyrovnávacia pamäť pre konverziu reťazca

`` `

Zostaviť a spustiť tento kód:

1. uložiť: Uložte kód ako súbor `.asm` (napr.` Fibonacci.asm`).

2. Zostavte: Na zostavenie použite NASM:`NASM -f elf64 fibonacci.asm`

3. odkaz: Prepojenie súboru objektu:`ld -o fibonacci fibonacci.o`

4. Run: Vykonajte program:`./Fibonacci`

Táto vylepšená verzia obsahuje:

* Clear Commens: Vysvetlenie každého kroku.

* konverzia reťazca: Základný algoritmus na konverziu čísel fibonacci na reťazce na tlač. (Poznámka:Táto konverzia reťazca je jednoduchá a nevyrieši veľmi veľké počty robustne. Pre výrobný kód by bol potrebný sofistikovanejší prístup.)

* refal: Číslo sa prevedie na reťazec v opačnom poradí a potom sa pred tlakom obráti.

* Newlines: Pridáva nové línie medzi číslami pre lepšiu čitateľnosť.

* manipulácia s chybou (chýbajú): Kód pripravený na výrobu by musel skontrolovať potenciálne chyby (napríklad preteky vyrovnávacej pamäte).

Pamätajte, že programovanie montáže je veľmi nízke a špecifické pre architektúru. Tento príklad je prispôsobený X86-64 a Linux. Pre iné systémy by boli potrebné úpravy. Jazyky na vyššej úrovni sú vo všeobecnosti uprednostňované pre väčšinu programovacích úloh z dôvodu ich zvýšenej čitateľnosti, prenosnosti a produktivity vývojárov.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené