汇编语言 递归

递归过程是调用自身的过程。有两种递归:直接递归和间接递归。在直接递归中,过程调用自身,而在间接递归中,第一个过程调用第二个过程,后者又调用第一个过程。

在许多数学算法中可以观察到递归。例如,考虑一下计算一个数的阶乘的情况。一个数的阶乘由方程式给出:

  1. Fact (n) = n * fact (n-1) for n > 0

例如:5 的阶乘是 1 x 2 x 3 x 4 x 5=5 x 4 的阶乘,这是演示递归过程的一个好例子。每个递归算法都必须有一个结束条件,即当条件满足时,程序的递归调用应该停止。在阶乘算法的情况下,当 n 为 0 时达到结束条件。

下面的程序展示了如何在汇编语言中实现阶乘 n。为了保持程序简单,我们将计算阶乘 3

  1. section .text
  2. global _start ;必须声明才能使用 gcc
  3. _start: ;告诉链接器入口点
  4. mov bx, 3 ;用于计算阶乘 3
  5. call proc_fact
  6. add ax, 30h
  7. mov [fact], ax
  8. mov edx,len ;消息长度
  9. mov ecx,msg ;消息
  10. mov ebx,1 ;文件描述 (stdout)
  11. mov eax,4 ;系统调用号 (sys_write)
  12. int 0x80 ;调用内核
  13. mov edx,1 ;消息长度
  14. mov ecx,fact ;消息
  15. mov ebx,1 ;文件描述 (stdout)
  16. mov eax,4 ;系统调用号 (sys_write)
  17. int 0x80 ;调用内核
  18. mov eax,1 ;系统调用号 (sys_exit)
  19. int 0x80 ;调用内核
  20. proc_fact:
  21. cmp bl, 1
  22. jg do_calculation
  23. mov ax, 1
  24. ret
  25. do_calculation:
  26. dec bl
  27. call proc_fact
  28. inc bl
  29. mul bl ;ax = al * bl
  30. ret
  31. section .data
  32. msg db 'Factorial 3 is:',0xa
  33. len equ $ - msg
  34. section .bss
  35. fact resb 1

结果如下:

  1. Factorial 3 is:
  2. 6