Recursion 汇编中的递归?

Recursion 汇编中的递归?,recursion,x86,linked-list,Recursion,X86,Linked List,我正试图更好地掌握汇编,当我必须处理寄存器、弹出/推送等时,我对如何递归调用函数有点困惑 我在C++中嵌入x86程序集。在这里,我尝试创建一个方法,给定一个整数数组,它将构建一个包含这些整数的链表,这些整数按它们在数组中出现的顺序排列 我通过调用递归函数来实现这一点: insertElem (struct elem *head, struct elem *newElem, int data) -头:名单的头 -数据:将插入列表末尾的数字 -newElem:指向内存中存储新元素的位置(数据字段

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

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

我通过调用递归函数来实现这一点:

insertElem (struct elem *head, struct elem *newElem, int data) 
-头:名单的头

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

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

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

因此,我的链接列表如下所示: 2-->9而不是2-->3-->1-->8-->3-->9


我觉得我不知道如何组织和处理登记册。newElem处于EBX状态,只是不断被重写。提前谢谢

对于任何与汇编程序相关的“如何”问题,最通用的答案是:gcc-S。如果您对任何东西有疑问,只需看看一个像样的C编译器是如何将其转换为较低级别的代码的


在本例中,您需要在堆栈框架上维护本地变量。仅对在任何外部子例程调用后不需要保留的值使用寄存器。

如果没有看到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

尝试使用类似这样的代码作为asm代码

__asm{
        mov ebx, dword ptr[esp+4] //head
        mov ecx, dword ptr[esp+8] //newElem
        mov edx, dword ptr[esp+12] // data

    cmp [ebx+4], 0
    je NO_NEXT_ELEMENT

    mov ebx, [ebx+4]
    mov ecx, [ecx+4]

    push edx
    push ecx
    push ebx
    call insertElem
    pop ebx
    pop ecx
    pop edx


NO_NEXT_ELEMENT:


    mov dword ptr[ebx+4], ecx 
    mov dword ptr[ecx], edx
    mov [ecx+4], 0

    ret
}
编辑:只是运行了这个,并意识到这是行不通的。它提供访问冲突读取/写入位置错误。但希望它能给你一个开始,也许有人能清理一下