Assembly MASM32模块划分

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

我这里有一个程序,它应该打印一个用“~”初始化的数组。因为我想要一个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
        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]