Assembly 计算链表中的值之和(masm)*跟进

Assembly 计算链表中的值之和(masm)*跟进,assembly,masm,Assembly,Masm,所以我对汇编语言很陌生,我希望能得到一些帮助。我编写了一个函数,它将整数数组中的所有值相加,并生成总和。现在我想修改函数,使其使用链表,从而返回链表中所有值的总和。我还是个初学者,所以我还在学习MASM,但这是我为查找数组中所有值之和的函数编写的: PUSH EBX PUSH ECX PUSH EDX PUSH ESI PUSH EDI MOV EBX, Arr MOV ECX, len

所以我对汇编语言很陌生,我希望能得到一些帮助。我编写了一个函数,它将整数数组中的所有值相加,并生成总和。现在我想修改函数,使其使用链表,从而返回链表中所有值的总和。我还是个初学者,所以我还在学习MASM,但这是我为查找数组中所有值之和的函数编写的:

 PUSH EBX
        PUSH ECX
        PUSH EDX
        PUSH ESI
        PUSH EDI

        MOV EBX, Arr
        MOV ECX, len




        mov eax, 0; sum
        mov ecx, 0; i
        mov ESI, len

FOR_EXPR:
        cmp ecx, esi
        jge END_FOR

        mov edx, dword ptr[ebx+ecx*4]
        add eax, edx

        inc ecx
        jmp FOR_EXPR
END_FOR:


        POP EDI
        POP ESI
        POP EDX
        POP ECX
        POP EBX

新函数将链接列表的头作为参数传入:int function(struct Node*start)

对于数组示例,可以将固定跳转放在循环之前,将条件跳转放在循环末尾:

        .model  FLAT
        .data
array   dd      1,2,3,4
len     dd      4

        .code
_main   proc    near
;       ...    
        push    ebx
        push    ecx
        push    edx
        push    esi
        push    edi
        lea     ebx, array
        mov     esi, len
        mov     eax, 0  ; sum
        mov     ecx, 0  ; i
        jmp     for1
for0:   mov     edx, [ebx+ecx*4]
        add     eax, edx
        inc     ecx
for1:   cmp     ecx, esi
        jl      for0
        pop     edi
        pop     esi
        pop     edx
        pop     ecx
        pop     ebx
;       ...    

对于链表,以下示例足以说明语法:

        .model FLAT
node    struct
next    dd      ?
value   dd      ?
node    ends

        .data
list0   node    {offset list1,1}
list1   node    {offset list2,2}
list2   node    {offset list3,3}
list3   node    {0           ,4}

        .code
_main   proc    near
;       ...
        push    ebx
        push    ecx
        push    edx
        push    esi
        push    edi
        lea     ebx, list0
;       ...
        add     eax,node.value[ebx]
;       ...

这是一个怎样的后续行动呢?人们问上一篇文章中链接列表是如何呈现的。我应该写“*修订”而不是后续。可能是重复的否,你应该编辑原始问题。