首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MARIE ASM Lang -整数上的除法(正/负)

MARIE ASM Lang -整数上的除法(正/负)
EN

Stack Overflow用户
提问于 2017-02-01 21:07:39
回答 1查看 1.2K关注 0票数 2

为了学习的目的,我试图写任何整数除法在玛丽。

这是标准的(希望是正确的)代码,它将X除以Y除以余数,但只使用正整数。

代码语言:javascript
复制
        LOAD X
        STORE REMAIN
WHILE   SUBT Y
        SKIPCOND 800
        JUMP CHECK
DO      STORE REMAIN
        LOAD RESULT
        ADD ONE
        STORE RESULT
        LOAD REMAIN
        JUMP WHILE
CHECK   SKIPCOND 400
        JUMP END
        STORE REMAIN
        LOAD RESULT
        ADD ONE
        STORE RESULT
END     HALT
X       HEX XXXX
Y       HEX YYYY
RESULT  HEX 0000
REMAIN  HEX 0000
ONE     HEX 0001

我怎么才能让它成为负片呢?可能是一些IFs和一些比特面具,但我不知道如何正确地做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-03 14:21:33

取决于你如何定义它..。D/d=[q,r] (股息/除数=商,余数)

  • 5/2 = 2,1
  • -5/-2 = 3,1或2,-1 (x86 way)
  • 5/-2 = -2,1 (x86)或-3,-1
  • -5/2 = -3,1或-2,-1 (x86)

(在x86 CPU上,剩余r的符号总是与股息D的符号相同)

如果您查看上面的结果,在每种情况下绝对值都是相同的:

  • \x{e76f}\\x{e76f}\\x{e76f}\x{e76f}2\x{e76f}\\x{e76f}\x{e76f}2

余数有红利的符号,商有除数的符号([+, +] == [-, -] == + vs [+, -] == [-, +] == -)。

因此,您可以在例程开始时添加一个准备部分,它将测试每个值,并将其标记为正或负标记,将其转换为正,进行除法,然后在当前的END通过标志对结果进行修补。

类似的东西(这是我第一次使用Marie Assembly,所以把它看作是一个提示,并在需要的地方纠正它,希望只有语法,但是可能甚至逻辑错误也可能存在,我没有验证代码工作!):

代码语言:javascript
复制
    CLEAR
    / init temporary/result variables to zero
    STORE    q_flag
    STORE    r_flag
    STORE    RESULT
    SUBT     X                / try (-Dividend) value
    SKIPCOND 800
    JUMP     DividendWasPositive    / positive or zero
    STORE    X                / (-Dividend) positive, rewrite original X
    STORE    q_flag           / set flags to positive value (X)
    STORE    r_flag
DividendWasPositive,
    CLEAR
    SUBT     Y                / try (-divisor) value
    SKIPCOND 400
    JUMP     DivisorNotZero
    HALT                      / division by zero detected, error
DivisorNotZero,
    SKIPCOND 800
    JUMP     DivisorWasPositive
    STORE    Y                / (-divisor) positive, rewrite original Y
    / flip quotient flag value (zero <-> nonzero) ("nonzero" == X)
    LOAD     X                / will not "flip" anything when 0 == X
    SUBT     q_flag           / but then q = 0, so it's harmless deficiency
    STORE    q_flag           / q_flag is now zero or positive (X) value
DivisorWasPositive,
    / here X and Y contain absolute value of input numbers
    / q_flag is positive value when quotient has to be negated
    / r_flag is positive value when remainder has to be negated

    / .. do your division here ..

    / patching results by the q/r flags from the prologue part
AdjustQuotientSign,
    LOAD     q_flag
    SKIPCOND 800
    JUMP     AdjustRemainderSign
    CLEAR
    SUBT     RESULT
    STORE    RESULT           / quotient = -quotient
AdjustRemainderSign,
    LOAD     r_flag
    SKIPCOND 800
    JUMP     SignsAdjusted
    CLEAR
    SUBT     REMAIN
    STORE    REMAIN           / remainder = -remainder
SignsAdjusted,
    HALT

q_flag,    DEC      0
r_flag,    DEC      0
... rest of your variables

其他选项可能是针对每种情况都有不同的例程变体(4种变体),因为它们仅在ADD/SUBT Y/ONE和终止条件1000 vs 800中有所不同,这将为每种情况执行更少的指令(更好的性能),但是会有更多的代码行,加上上面的代码可能会给您一些新的想法,即如何在程序集中完成一些事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41989768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档