0

エラーは AfterLoop スコープの "mov [esi], [edi]" 行にあります。どうすればこの問題を解決できますか? ; ノードを削除する関数 (headptr、nodeToremove)

removeNode proc

headPtr = 8
nodeToRemove = headPtr + 4

push ebp
mov ebp, esp
push esi
push edi
push ebx

mov esi, headPtr[ebp]               ; esi = head of list
mov edi, [esi]                  ; edi = second item
cmp esi, nodeToRemove[ebp]              ; head = nodeToRemove?
jne NextNode

mov edi, esi                    ; edi ( = currNode) = head
mov esi, [esi]                  ; new head = head->next
jmp AfterLoop

NextNode:

cmp edi, nodeToRemove[ebp]                  ; currNode = node to remove?
je AfterLoop

mov esi, edi                    ; prev node = currNode
mov edi, [edi]                  ; currNode = currNode->next 
jmp NextNode            

AfterLoop:  

    mov [esi], [edi]            ; error!!! prev->next = curr->next
    pop ebx
    pop edi
    pop esi
    pop ebp
    ret 8
removeNode endp
4

2 に答える 2

4

ほとんどの場合、x86 命令は最大 1 つのメモリ オペランドを使用できます。メモリ間の移動には、一時レジスタを使用します。

mov [reg1], [reg2] # illegal

mov tmp, [reg2] # ok
mov [reg1], tmp
于 2013-12-17T11:40:02.330 に答える