2015-04-14 1 views
0

J'ai un code assembly32 pour Hanoi, mais je ne peux pas le compiler, j'obtiens l'erreur: hanoi.asm (9): erreur A2070: opérandes d'instructions invalides J'utilise MASM32.Erreur MASM32 A2070: opérandes d'instructions invalides

Le code complet:

 .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 

Pouvez-vous s'il vous plaît aidez-moi, comment puis-je faire ce travail?

+1

La taille des données n'est pas claire. Utilisez 'cmp dword ptr [ebp + 8], 1'. – Jester

+0

Etes-vous sûr que c'est tout le code? Les tours de Hanoi nécessitent un point de départ pour les trois disques, ce code commence si soudainement, sans qu'aucune donnée n'ait été initialisée. L'algorithme ne fonctionne pas pour moi, je veux dire, il ne résout pas le problème de Hanoi. –

+0

Comme vous pouvez le voir dans ma réponse, le code utilise des registres 16 bits, et cela fonctionne très bien. Vous pouvez changer tous les registres de 16 bits pour 32 bits (AX -> EAX), et le tester pour voir s'il fonctionne encore. –

Répondre

-1

Votre code n'a pas fonctionné pour moi, je l'ai couru mais quelque chose ne va pas avec l'algorithme, il n'a jamais trouvé la solution. Donc, voici une autre solution de hanoi towers qui fonctionne réellement. Il est fait avec EMU8086 (MASM syntaxe Intel), vous copier-coller juste et exécutez:

.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 

Rappelez-vous ce que je disais au sujet des données d'initialisation? Eh bien, celui-ci l'a! Peut-être que c'est pour ça que ça fonctionne.

+0

Merci, ça fonctionne comme un charme! Ce que je ne comprends pas: Pourquoi devez-vous retourner 8 et 4, et quelle est cette ligne en cours d'impression: mov ah, 09 – paluskapter

+0

'RET n' ne retourne pas' n'; il saute 'n' octets de la pile en revenant. Le 'mov ah, 09h' fait partie de la configuration de' int 21h'. 'int 21h' est une interruption utilisée dans les programmes DOS, et la sous-fonction 9 est _WRITE STRING TO STANDARD OUTPUT_. – Michael

+0

Merci, Michael. –