Assembly MASM32错误A2070:指令操作数无效
我有一个用于Hanoi的assembly32代码,但我无法编译它,我得到了错误: hanoi.asm9:错误A2070:指令操作数无效 我使用MASM32 完整代码: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
.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是将字符串写入标准输出。