Рекурсия на ассемблере - Assembler
Формулировка задачи:
Здравствуйте! Уже который день мучаюсь с реализацией программы вычисления факториала числа. Вот, собственно, код:
После запуска программы в Qeditor, она на какое-то время зависает и, в конце концов, ничего не делает. Помогите пожалуйста решить проблему.
.data x dd 1 buffer db 128 dup(?) format db "%d",0 stroka db 'Факториал числа: $' .code ;--------------------------- fact proc push ebp mov ebp, esp mov ecx, [esp+4] mov eax, ecx mul x mov x, eax dec ecx jz end_p push ecx call fact end_p: mov esp, ebp pop ebp ret fact endp ;-------------------------- start: mov ecx, 10 push ecx call fact invoke wsprintf, addr buffer, addr format,x invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start
Решение задачи: «Рекурсия на ассемблере»
textual
Листинг программы
; masm windows gui # .686 .model flat include windows.inc includelib user32.lib includelib kernel32.lib include user32.inc include kernel32.inc .data buffer db 128 dup(?) format db "%d",0 msg_title db 'Факториал числа',0 N equ 12 .code start: mov eax,1 mov ecx,N call fact invoke wsprintf, addr buffer, addr format,eax invoke MessageBox, NULL, addr buffer, addr msg_title, MB_OK invoke ExitProcess, NULL ;--------------------------- fact proc jecxz done mul ecx dec ecx call fact done: ret (N-1)*4 fact endp end start
Объяснение кода листинга программы
Вывод списка с номерами до 20 включительно:
- Объявлены переменные:
- eax — для хранения результата.
- ecx — для итеративного использования в качестве счётчика.
- N — число, факториал которого необходимо вычислить.
- В основной функции start() происходит следующее:
- eax = 1 — инициализация начального значения факториала.
- ecx = N — передача в функцию fact().
- fact() вызывается рекурсивно.
- wsprintf() используется для форматирования строки с факториалом.
- MessageBox() показывает факториал на экране.
- ExitProcess() завершает программу.
- В рекурсивной функции fact() происходит следующее:
- Если ecx = 0, то происходит выход из рекурсии и возврат управления в основную функцию.
- ecx уменьшается на единицу.
- fact() вызывается рекурсивно.
- eax умножается на ecx.
- Ошибки, которые могут возникнуть:
- Если N больше 12, то возможна переполнение стека.
- Если сообщение об ошибке, которое может возникнуть при вычислении факториала, больше 128 символов, то возможна переполнение буфера.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д