为了学习的目的,我试图写任何整数除法在玛丽。
这是标准的(希望是正确的)代码,它将X除以Y除以余数,但只使用正整数。
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和一些比特面具,但我不知道如何正确地做到这一点。
发布于 2017-02-03 14:21:33
取决于你如何定义它..。D/d=[q,r] (股息/除数=商,余数)
(在x86 CPU上,剩余r的符号总是与股息D的符号相同)
如果您查看上面的结果,在每种情况下绝对值都是相同的:
余数有红利的符号,商有除数的符号([+, +] == [-, -] == + vs [+, -] == [-, +] == -)。
因此,您可以在例程开始时添加一个准备部分,它将测试每个值,并将其标记为正或负标记,将其转换为正,进行除法,然后在当前的END通过标志对结果进行修补。
类似的东西(这是我第一次使用Marie Assembly,所以把它看作是一个提示,并在需要的地方纠正它,希望只有语法,但是可能甚至逻辑错误也可能存在,我没有验证代码工作!):
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中有所不同,这将为每种情况执行更少的指令(更好的性能),但是会有更多的代码行,加上上面的代码可能会给您一些新的想法,即如何在程序集中完成一些事情。
https://stackoverflow.com/questions/41989768
复制相似问题