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

时间:2015-04-14 21:59:10

标签: assembly masm32

我有一个河内的assembly32代码,但我无法编译它,我得到错误: hanoi.asm(9):错误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

你能帮助我吗,我该怎么做才能做到这一点?

1 个答案:

答案 0 :(得分:-1)

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

所以,这是另一个真正有用的河内塔解决方案。它是用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

还记得我对初始化数据的看法吗?好吧,这个有它!也许这就是它起作用的原因。