【问题标题】:error A2070: invalid instruction operands错误 A2070:指令操作数无效
【发布时间】:2014-01-05 03:23:54
【问题描述】:

错误出现在“mov [esi], [edi]”行的 AfterLoop 范围内。我该如何解决这个问题? ;节点移除函数(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

【问题讨论】:

    标签: assembly x86 operands


    【解决方案1】:

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

    mov [reg1], [reg2] # illegal
    
    mov tmp, [reg2] # ok
    mov [reg1], tmp
    

    【讨论】:

      【解决方案2】:

      mem, mem 不是有效的操作数组合。使用寄存器作为中介,例如:

      mov eax,[edi]
      mov [esi],eax
      

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

      movsd        ; dword [edi] = dword [esi]; esi += 4; edi += 4
      

      (注意:+= 4 是 true,假设方向标志是明确的。否则它将是 -= 4。在你的情况下应该没关系,因为你紧接着是 pop esiedi) .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-15
        • 2016-09-01
        相关资源
        最近更新 更多