我仍在学习 NASM 程序集(32 位 Ubuntu)中的递归,现在我正在尝试递归地添加数组中的所有元素。数组的元素每个都是 4 字节。
我想出了一个似乎可行的解决方案。
基本上,要在数组中添加元素,我需要以某种方式计算它们,对吗?所以我有ESI
我的柜台。但是,这个寄存器需要0
在函数的开头设置 - 但我认为没有任何方法可以判断当前函数调用是第一个,还是第二个或第三个......所以要修复这个,我有两个函数:初始调用和递归调用。第一个设置ESI
为0
然后调用递归调用。元素全部添加到EAX
,在初始调用中也设置为0
..
但我很关心它,因为它与我之前做过的两个递归函数有些不同:
因为,首先,我使用了两个函数,一个用于开始,另一个用于实际的递归部分。另外,我正在使用一个计数器,感觉非常像一个迭代解决方案。
所以我的问题是:有没有一个更类似于我上面发布的两个递归函数的解决方案?我当前的解决方案可以被认为是递归的吗?
; --------------------------------------------------------------------------
; Recursive function that adds all the elements in an array into EAX.
; The array's elements are 4-bytes each.
; --------------------------------------------------------------------------
SECTION .data
array: dd 1,5,3,7,4,8,5,2
size: equ $-array
SECTION .text
global main
main:
; ------------------------------------------------------------------
; * Main
; ------------------------------------------------------------------
call addVector
breakpoint: ; Used for GDB to inspect the result later
; ------------------------------------------------------------------
; * Exit
; ------------------------------------------------------------------
mov EAX,0
int 0x80
; ------------------------------------------------------------------
; * Initial function call, before doing the recursive calls
; Sets ESI to 0, which will be used to count the array's elements
; Also sets EAX to 0, for storing the result
; ------------------------------------------------------------------
addVector:
push ESI
mov ESI,0
mov EAX,0
call recursiveCall
pop ESI
ret
; ------------------------------------------------------------------
; * Recursive part of the function
; Adds to EAX to current element, and increases the ESI counter by
; 4 (because the array's elements are 4-bytes each).
; If the counter happens to be >= the array's size, stop.
; ------------------------------------------------------------------
recursiveCall:
cmp ESI,size
jge endRecursiveCall
add EAX,[array + ESI]
add ESI,4
call recursiveCall
endRecursiveCall:
ret