错误出现在“mov,edi”行的AfterLoop skope中。如何解决此问题?;用于节点删除的函数(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发布于 2013-12-17 11:41:16
mem, mem不是操作数的有效组合。使用登记册作为中间程序,例如:
mov eax,[edi]
mov [esi],eax或者,如果您可以交换esi和edi,您可以使用movsd
movsd ; dword [edi] = dword [esi]; esi += 4; edi += 4(注:假定方向标志是清楚的,则+= 4为真。否则,它将是-= 4。在您的情况下应该不重要,因为您随后立即使用了pop、esi和edi )。
发布于 2013-12-17 11:40:02
在大多数情况下,x86指令最多只能使用一个内存操作数。对于内存内存移动,请使用临时寄存器:
mov [reg1], [reg2] # illegal
mov tmp, [reg2] # ok
mov [reg1], tmphttps://stackoverflow.com/questions/20632907
复制相似问题