M68000 Assembly,如何循环减法

M68000 Assembly, how do I loop a subtraction

我想做一个减法循环。我的任务是找出总计 100 美元钞票的数量。例如,用户输入 $950。里面有 9 张一百美元的钞票。我首先做的是将用户输入存储在日期寄存器 1 中,并将其与 100 进行比较。

cmpi.w      #100,D1

我基本上想做 "if D1 is less than 100, subtract another 100"。我怎样才能实现这个循环?我想使用大于和小于指令的分支,但不确定如何使用。

正常算法是除以100。M68K DIVU/DIVS指令同时提供结果和余数:

MOVE #950,D1
DIVU #100,D1

会在D1寄存器中留下0x00320009,即0x9(9)作为结果,0x32(50)作为余数。

如果你真的想要一个循环,看看下面的代码(在EASy68K(http://www.easy68k.com/)上汇编和运行)。这是非常标准的汇编代码,其他架构上的循环看起来非常相似。 (事实上​​,这是我第一次写M68K汇编代码。)

START:
    MOVE #950,D1
Loop:
    CMP #100,D1
    BPL OverEqual100
    BRA Under100
OverEqual100:
    SUB #100,D1
    ADD #1,D0
    BRA Loop
Under100:
    SIMHALT

(另请参阅此答案所附的评论。)