汇编中的递归?

Dav*_*vis 3 recursion x86 linked-list

我正在努力更好地掌握汇编,当我必须处理寄存器,弹出/推送等时,我对如何递归调用函数感到有点困惑.

我在C++中嵌入x86程序集.在这里,我试图创建一个方法,给定一个整数数组将按照它们出现在数组中的顺序构建一个包含这些整数的链表.

我通过调用递归函数来做到这一点:

insertElem (struct elem *head, struct elem *newElem, int data) 
Run Code Online (Sandbox Code Playgroud)

-head:列表的负责人

-data:将在列表末尾插入的数字

-newElem:指向内存中我将存储新元素的位置(数据字段)

我的问题是我不断覆盖寄存器而不是典型的链表.例如,如果我给它一个数组{2,3,1,8,3,9}我的链表将返回第一个元素(头部)并且只返回最后一个元素,因为元素在头部之后会相互覆盖不再为空.

所以这里我的链表看起来像:2 - > 9而不是2 - > 3 - > 1 - > 8 - > 3 - > 9

我觉得我没有掌握如何组织和处理寄存器.newElem在EBX中,并且不断被重写.提前致谢!

Mar*_*tin 7

没有看过你的asm代码就很难给出答案.我的第一个想法是在处理链表时不需要递归函数.

无论如何,在函数调用中保留寄存器的一般方法是将它们推入堆栈并随后弹出它们:

;
; ebx = current element
;
TraverseList:

   ; If this is the end of the list we can skip the recursive invocation
   cmp [ebx+next], 0
   je NoNextElement

   push ebx               ; Save current element (ebx) on stack
     mov ebx, [ebx+next]  ; Put next element in ebx
     call TraverseList    ; Recursive invocation
   pop ebx                ; Restore current element (ebx) from stack

NoNextElement:

   ; Do stuff with the current element (ebx)
   ...
   ret
Run Code Online (Sandbox Code Playgroud)