Другие языки программирования и технологии
Помогите с написанием программы на языке Ассемблер, алгоритм знаю, вот только команды самого языка - не очень.
Напишите процедуру, вычисляющую число Фибоначчи по заданному индексу (индекс передается этой процедуре в качестве параметра) . Напишите программу для тестирования вашей процедуры: пользователь вводит целочисленный индекс и на экран выводится соответствующее этому индексу число Фибоначчи. Для решения задачи можно использовать рекурсию (а можно и не использовать) .
>можно использовать рекурсию
Можно, но что будет со стеком, если пользователь захочет узнать миллионное число Фибоначчи?
> а можно и не использовать
Можно и не использовать. Тем более, что на ассемблере для получения чисел Фибоначчи требуется всего 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
Компиляция, линковка и тестирование:

Можно, но что будет со стеком, если пользователь захочет узнать миллионное число Фибоначчи?
> а можно и не использовать
Можно и не использовать. Тем более, что на ассемблере для получения чисел Фибоначчи требуется всего 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
Компиляция, линковка и тестирование:

Для решения этой задачи тебе понадобится команды:
ADD - сложение
CALL - вызов процедуры
RET - возврат из процедуры
CMP - сравнение
JZ - переход если ноль
MOV - перенос
Все, теперь ты все команды знаешь, вперед и с песней.
ADD - сложение
CALL - вызов процедуры
RET - возврат из процедуры
CMP - сравнение
JZ - переход если ноль
MOV - перенос
Все, теперь ты все команды знаешь, вперед и с песней.
Люди! Не отвечайте этому негодяю! Он рядом со мной на лабе сидит и делать ничего не хочет! Не помогайте этому великому уму расслабляться!!!!
Похожие вопросы
- Помогите в написании программы на языке с++
- Помогите в написании программы на языке С++
- Помогите с заданием по написанию программы на языке ассемблер, вычисляющую значение переменной R.
- Помогите пожалуйста написать программу на языке программирования AssemblerКто первый поможет сделать правильно10балов+50
- Помогите, пожалуйста, написать программу на языке Си
- Pycharm (Пожалуйста, помогите с написанием программы)
- помогите, пожалуйста, доработать программу на языке Java
- Помогите пожалуйста написать программу на языке Borland С++ Builder
- Помогите в написании программы.
- помогите, пожалуйста, написать программу на языке Паскаль