gpt4 book ai didi

汇编中的递归?

转载 作者:行者123 更新时间:2023-12-01 09:38:53 25 4
gpt4 key购买 nike

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

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

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

insertElem (struct elem *head, struct elem *newElem, int data) 

-head:列表的头部

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

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

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

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

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

最佳答案

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

关于汇编中的递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com