Assembly MASM32错误A2070:指令操作数无效

Assembly MASM32错误A2070:指令操作数无效,assembly,masm32,Assembly,Masm32,我有一个用于Hanoi的assembly32代码,但我无法编译它,我得到了错误: hanoi.asm9:错误A2070:指令操作数无效 我使用MASM32 完整代码: .586 .MODEL FLAT PUBLIC _towers EXTERN _printf:NEAR .CODE _towers:PUSH EBP MOV EBP, ESP SUB ESP, 4 CMP [EBP+8], 1 ;E

我有一个用于Hanoi的assembly32代码,但我无法编译它,我得到了错误: hanoi.asm9:错误A2070:指令操作数无效 我使用MASM32

完整代码:

        .586
.MODEL  FLAT
PUBLIC        _towers
EXTERN  _printf:NEAR
.CODE
_towers:PUSH  EBP
        MOV   EBP, ESP
        SUB   ESP, 4
        CMP   [EBP+8], 1   ;ERROR
        JNE   L1
        MOV   EAX, [EBP+16]
        PUSH  EAX
        MOV   EAX, [EBP+12]
        PUSH  EAX
        PUSH  OFFSET FLAT:format;
        CALL  _printf
        ADD   ESP, 12
        JMP   Done
L1:     MOV   EAX, 6
        SUB   EAX, [EBP+12]
        SUB   EAX, [EBP+16]
        MOV   [EBP-4], EAX
        PUSH  EAX
        MOV   EAX, [EBP+12]
        PUSH  EAX
        MOV   EAX, [EBP+8]
        DEC   EAX
        PUSH  EAX
        CALL  _towers
        ADD   ESP, 12
        MOV   EAX, [EBP+16]
        PUSH  EAX
        MOV   EAX, [EBP+12]
        PUSH  EAX
        PUSH   1
        CALL   _towers
        ADD   ESP,12
        MOV   EAX, [EBP+16]
        PUSH  EAX
        MOV   EAX, [EBP-4]
        PUSH  EAX
        MOV   EAX, [EBP+8]
        DEC   EAX
        PUSH  EAX
        CALL  _towers
        ADD   ESP, 12
Done:   MOV   ESP,EBP
        POP   EBP
        RET   0
.DATA
format  DB "Move from %d to %d\n"
END

你能帮帮我吗,我该怎么做呢?

你的代码对我不起作用,我运行了它,但算法出了问题,它从来没有找到解决方案

所以,这里是另一个河内塔的解决方案,实际上是可行的。它采用EMU8086 MASM Intel语法,您只需复制粘贴并运行:

.model small
.stack 300H
.data
x dw 3
text db "Move from peg "
d1 db ?
text2 db " to peg "
d2 db ?
newline db 0AH, 0DH, '$'

.code
main proc

    mov ax, @data
    mov ds, ax

    mov ax, 1
    push ax
    mov ax, 3
    push ax
    mov ax, 2
    push ax
    mov ax, x
    push ax
    call solve

    mov ax, 4C00H
    int 21h


main endp

solve proc
   push bp
   mov bp, sp
   cmp word ptr ss:[bp+4], 0
   je down

   push word ptr ss:[bp+0AH]
   push word ptr ss:[bp+6]
   push word ptr ss:[bp+8]
   mov ax, word ptr ss:[bp+4]
   dec ax
   push ax
   call solve

   push word ptr ss:[bp+0AH]
   push word ptr ss:[bp+08]
   call print

   push word ptr ss:[bp+06H]
   push word ptr ss:[bp+8]
   push word ptr ss:[bp+0AH]
   mov ax, word ptr ss:[bp+4]
   dec ax
   push ax
   call solve

   pop bp
   ret 8
down:
   pop bp
   ret 8

solve endp

print proc
   push bp
   mov bp, sp
   mov d1, '0'
   mov al, byte ptr ss:[bp+06]
   add d1, al
   mov d2, '0'
   mov al, byte ptr ss:[bp+4]
   add d2, al
   lea dx, text
   mov ah, 09
   int 21h
   pop bp
   ret 4

print endp
end

还记得我说过的初始化数据吗?好吧,这个有了!也许这就是它工作的原因。

不清楚数据的大小。使用cmp dword ptr[ebp+8],1。您确定这就是全部代码吗?Hanoi towers需要三张光盘的起点,该代码启动非常突然,没有任何数据被初始化。这个算法对我不适用,我的意思是,它不能解决hanoi问题。正如你在我的回答中看到的,代码使用了16位寄存器,它工作得很好。您可以更改32位AX->EAX的所有16位寄存器,并测试它是否仍然有效。谢谢,它工作起来很有魅力!我不明白的是:为什么要返回8和4,这行打印的是什么:mov啊,09RET n不返回n;它在返回时从堆栈中弹出n个字节。mov ah,09h是int 21h设置的一部分。INT21H是DOS程序中使用的中断,子功能9是将字符串写入标准输出。