首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误A2070:无效指令操作数

错误A2070:无效指令操作数
EN

Stack Overflow用户
提问于 2013-12-17 11:28:28
回答 2查看 5.1K关注 0票数 0

错误出现在“mov,edi”行的AfterLoop skope中。如何解决此问题?;用于节点删除的函数(headptr,nodeToremove)

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 11:41:16

mem, mem不是操作数的有效组合。使用登记册作为中间程序,例如:

代码语言:javascript
运行
复制
mov eax,[edi]
mov [esi],eax

或者,如果您可以交换esiedi,您可以使用movsd

代码语言:javascript
运行
复制
movsd        ; dword [edi] = dword [esi]; esi += 4; edi += 4

(注:假定方向标志是清楚的,则+= 4为真。否则,它将是-= 4。在您的情况下应该不重要,因为您随后立即使用了popesiedi )。

票数 3
EN

Stack Overflow用户

发布于 2013-12-17 11:40:02

在大多数情况下,x86指令最多只能使用一个内存操作数。对于内存内存移动,请使用临时寄存器:

代码语言:javascript
运行
复制
mov [reg1], [reg2] # illegal

mov tmp, [reg2] # ok
mov [reg1], tmp
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20632907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档