Assembly MASM32模块划分
我这里有一个程序,它应该打印一个用“~”初始化的数组。因为我想要一个12x12的游戏板,所以我在144乘12上使用模块化除法,当余数为0时打印一条新行。我肯定有一个问题,虽然,我的第一个提示是,它只是崩溃的第二次去打印电路板Assembly MASM32模块划分,assembly,masm,masm32,Assembly,Masm,Masm32,我这里有一个程序,它应该打印一个用“~”初始化的数组。因为我想要一个12x12的游戏板,所以我在144乘12上使用模块化除法,当余数为0时打印一条新行。我肯定有一个问题,虽然,我的第一个提示是,它只是崩溃的第二次去打印电路板 displayBoard PROC lea esi, dArray mov eax, 144 .while eax > 0 xor edx, edx mov ecx, 12 div ecx .if edx == 0 p
displayBoard PROC
lea esi, dArray
mov eax, 144
.while eax > 0
xor edx, edx
mov ecx, 12
div ecx
.if edx == 0
print 0DH, 0AH
.endif
print esi
sub eax, 1
.endw
mov eax, input()
显示板ENDP问题在于
div
指令同时设置edx
和eax
-它执行以下操作:
eax := edx:eax DIV ecx
edx := edx:eax MOD ecx
因此,它会覆盖eax
寄存器并中断循环
此外,
eax
是一个临时寄存器,对print
的调用也将覆盖它。请参阅目标平台的ABI文档或调用约定,了解哪些寄存器在函数调用中保留,哪些不保留
最后,我不知道
print
的作用是什么,但将它与即时CR/LF值0DH、0AH
和esi
(指向某个数组的指针)一起使用,似乎有点可疑。好的,我根据您的评论获得了帮助。最后一个问题是,使用print esi将打印阵列中的全部144个元素。对于每个循环,我想打印下一个元素,我猜这意味着我必须打印esi+1,因为它是一个字节数组?您需要指定“地址esi
处的一个字节”,它以MASM语法编写为print BYTE ptr[esi]
。