2015-04-14 2 views
0

У меня есть код assembly32 для Hanoi, но я не могу его скомпилировать, я получаю ошибку: hanoi.asm (9): ошибка A2070: неправильные операнды команд Я использую MASM32.Ошибка MASM32 A2070: неверные операнды команд

Полный код:

 .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

Непонятно, каков размер данных. Используйте 'cmp dword ptr [ebp + 8], 1'. – Jester

+0

Вы уверены, что это все код? Ханойские башни требуют начальной точки для трех дисков, этот код начинается настолько внезапно, без каких-либо инициализации данных. Алгоритм для меня не работает, я имею в виду, он не решает проблему ханоя. –

+0

Как вы можете видеть в моем ответе, код использует 16-битные регистры, и он отлично работает. Вы можете изменить все 16-битные регистры для 32-разрядного (AX-> EAX) и протестировать его, чтобы убедиться, что он работает. –

ответ

-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 

Помните, что я говорил о данных инициализации? Ну, это есть! Может быть, поэтому он и работает.

+0

Спасибо, это работает как шарм! Что я не понимаю: Зачем вам нужно возвращать 8 и 4, и что это за строка: mov ah, 09 – paluskapter

+0

'RET n' не возвращает' n'; он выводит «n» байты со стека при возврате. «Mov ah, 09h» является частью установки для 'int 21h'. 'int 21h' - это прерывание, используемое в программах DOS, а подфункция 9 - _WRITE STRING TO STANDARD OUTPUT_. – Michael

+0

Спасибо, Майкл. –