【问题标题】:MASM32 modular divisionMASM32模块化划分
【发布时间】:2014-05-09 22:33:07
【问题描述】:

所以我在这里有一个程序应该打印一个用“~”初始化的数组。因为我想要一个 12x12 的游戏板,所以我在 144 x 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

【问题讨论】:

    标签: assembly masm masm32


    【解决方案1】:

    问题在于div 指令同时设置了edxeax - 它这样做:

    eax := edx:eax DIV ecx
    edx := edx:eax MOD ecx
    

    所以它会覆盖eax 寄存器并中断你的循环。


    另外,eax 是一个临时寄存器,对print 的调用也会覆盖它。请参阅目标平台的 ABI 文档或调用约定,了解哪些寄存器在函数调用中保留,哪些未保留。


    最后,我不知道 print 做了什么,但是将它与立即 CR/LF 值 0DH, 0AHesi(指向某个数组的指针)一起使用似乎很可疑。

    【讨论】:

    • 好吧 tyvm 的帮助,我根据你的 cmets 让它工作了。我的最后一个问题是使用 print esi 将打印数组中的全部 144 个元素。对于每个循环,我想打印下一个元素,我猜这意味着我必须打印 esi+1,因为它是一个 BYTE 数组?
    • 你需要指定“地址esi的一个字节”,用MASM语法写成print byte ptr [esi]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2012-01-25
    • 2012-01-06
    相关资源
    最近更新 更多