Другие языки программирования и технологии

Помогите с написанием программы на языке Ассемблер, алгоритм знаю, вот только команды самого языка - не очень.

Напишите процедуру, вычисляющую число Фибоначчи по заданному индексу (индекс передается этой процедуре в качестве параметра) . Напишите программу для тестирования вашей процедуры: пользователь вводит целочисленный индекс и на экран выводится соответствующее этому индексу число Фибоначчи. Для решения задачи можно использовать рекурсию (а можно и не использовать) .
>можно использовать рекурсию
Можно, но что будет со стеком, если пользователь захочет узнать миллионное число Фибоначчи?

> а можно и не использовать
Можно и не использовать. Тем более, что на ассемблере для получения чисел Фибоначчи требуется всего 2 команды в цикле: add и xchg.

> Не помогайте этому великому уму расслабляться!! !
Ни в коем случае. Только развивающая гимнастика для извилин. Пусть докажет, что он великий и переложит нижеприведённую программу на тот "Ассемблер", который ему требуется (как обычно неуказанный) .

.set STD_INPUT_HANDLE,-10
.set STD_OUTPUT_HANDLE,-11

.data

Prompt: .string "Введите номер числа Фибоначчи: "
tError: .string "Ошибка! Введите натуральное число не более 93: "
tRes1: .string "Fib("
tRes2: .string ") = "
NewLine: .string "\n"
hStdIn: .space 4,0
hStdOut: .space 4,0
Buffer: .space 1050,0
FibIndx: .space 8,0

.text
.globl N81115896

N81115896:
    subq $0x40,%rsp
    movl $STD_INPUT_HANDLE,%есх
    call GetStdHandle
    movl %еах, hStdIn
    movl $STD_OUTPUT_HANDLE,%есх
    call GetStdHandle
    movl %еах, hStdOut

    movq $Prompt,%rcx
    call Print
    call InputInt
    movq %rax,FibIndx
    movq %rax,%rcx
    call Fibonacci
    pushq %rax
    movq $tRes1,%rcx
    call Print
    movq FibIndx,%rax
    call PrintInt
    movq $tRes2,%rcx
    call Print
    popq %rax
    call PrintInt
    xorl %есх, %есх
    call ExitProcess

#Подпрограмма нахождения rcx-того числа Фибоначчи
Fibonacci:
    xorq %r10,%r10
    movq %r10,%rax
    incq %rax
    jmp EntryFib
RepFib:
    addq %rax,%r10
    xchgq %rax,%r10
EntryFib:
    loop RepFib
    ret

Print:
    pushq %rcx
    subq $0x10,%rsp
    call lstrlenA
    movl hStdOut,%есх
    addq $0x10,%rsp
    popq %rdx
    movq %rax,%r8
    xorq %r9,%r9
    movq %r9,0x20(%rsp)
    call WriteConsoleA
    ret
   
PrintInt:
    movq $Buffer,%rdi
    addq $20,%rdi
    xorb %dl,%dl
    movb %dl,(%rdi)
    movq $10,%rcx
RepDiv:
    xorq %rdx,%rdx
    divq %rcx
    addb $0x30,%dl
    movb %dl,-1(%rdi)
    decq %rdi
    testq %rax,%rax
    jnz RepDiv
    movq %rdi,%rcx
    call Print
    ret

InputInt:
    movl hStdIn,%есх
    movq $Buffer,%rdx
    movq %rdx,%r9
    addq $4,%rdx
    movq $1000,%r8
    xorq %rax,%rax
    movq %rax,0x20(%rsp)
    call ReadConsoleA
    xorq %rcx,%rcx
    movq %rcx,%r11
    movq $Buffer,%rsi
    movl (%rsi),%есх
    addq $4,%rsi
BegConv:
    lodsb
    cmpb $0xD,%al
    je EndConv
    subb $0x30,%al
    jb Error
    cmpb $9,%al
    ja Error
    movzbq %al,%rax
    imulq $10,%r11
    jc Error
    addq %rax,%r11
    loop BegConv
EndConv:
    testq %r11,%r11
    jz Error
    movq %r11,%rax
    cmpq $94,%rax
    jae Error
    ret
Error:
    movq $tError,%rcx
    call Print
    jmp InputInt

Компиляция, линковка и тестирование:
Tvt Kristal
Tvt Kristal
51 590
Лучший ответ
Для решения этой задачи тебе понадобится команды:

ADD - сложение
CALL - вызов процедуры
RET - возврат из процедуры
CMP - сравнение
JZ - переход если ноль
MOV - перенос

Все, теперь ты все команды знаешь, вперед и с песней.
Вован *****
Вован *****
91 469
Люди! Не отвечайте этому негодяю! Он рядом со мной на лабе сидит и делать ничего не хочет! Не помогайте этому великому уму расслабляться!!!!
Олег Фадин
Олег Фадин
526