Рекурсия на ассемблере - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Уже который день мучаюсь с реализацией программы вычисления факториала числа. Вот, собственно, код:
.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
После запуска программы в Qeditor, она на какое-то время зависает и, в конце концов, ничего не делает. Помогите пожалуйста решить проблему.

Решение задачи: «Рекурсия на ассемблере»

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 включительно:

  1. Объявлены переменные:
    • eax — для хранения результата.
    • ecx — для итеративного использования в качестве счётчика.
    • N — число, факториал которого необходимо вычислить.
  2. В основной функции start() происходит следующее:
    • eax = 1 — инициализация начального значения факториала.
    • ecx = N — передача в функцию fact().
    • fact() вызывается рекурсивно.
    • wsprintf() используется для форматирования строки с факториалом.
    • MessageBox() показывает факториал на экране.
    • ExitProcess() завершает программу.
  3. В рекурсивной функции fact() происходит следующее:
    • Если ecx = 0, то происходит выход из рекурсии и возврат управления в основную функцию.
    • ecx уменьшается на единицу.
    • fact() вызывается рекурсивно.
    • eax умножается на ecx.
  4. Ошибки, которые могут возникнуть:
    • Если N больше 12, то возможна переполнение стека.
    • Если сообщение об ошибке, которое может возникнуть при вычислении факториала, больше 128 символов, то возможна переполнение буфера.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5