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