ARM汇编器BCD转换为不带乘法指令的整数

对于我的类,我必须编写一个汇编函数,它从一个矢量的特定索引中获取一个BCD代码作为参数,并返回等效的整数值。 我只能使用一个基本的ARM指令集,如:

AND,EOR,SUB,RSB,ADD,CMP,CMN,TST,TEQ,ORR,MOV,BIC,MVN,LSL,LSR,ASR,ROR

并且不能使用乘法指令。

我知道转换通常是如何工作的,但我不明白如何在不增加单个半字节的情况下工作。 它是否与位移有关?

每一个提示都会很棒。

如果缺少一些信息,请原谅我,我对这个领域非常陌生。 如果有任何遗漏,这可能很重要 - 请让我知道,我会丰富它。


那么,应该发生在你身上的微不足道的是,乘法是重复加法,你可以使用ADD

一个稍微复杂的方法是,如果你意识到10*x = 8*x + x + x并且乘以8是一个3的移位,所以你可以使用移位和两个加法来做到这一点。


10 * x = 5 * 2 * x =(4 + 1)* 2 * x =(4x + x)* 2 =((x << 2)+ x)<< 1;

编辑

是的,你必须做单个BCD数字。

10 = 1010b
100 = 1100100b
1000 = 1111101000b

等等。

所以10以上可以是Jester所说的(只要看一下比特)(x << 3)+(x << 1)。 或者你可以把它看作5 * 2和5是101b或(x << 2)+ x并乘以2((x << 2)+ x)<< 1

100是(x << 6)+(x << 5)+(x << 2)或者取每个2((x << 4)+(x << 3)+ x)<< 2

或者用小学数学看这个,其中k,l,m,n是任意位。

    klmn
 *  1010
 =======
    0000 
   klmn
  0000
+klmn
=========
(klmn<<1)+(klmn<<3)

100倍的情况下,你可以做10 *(10 * x),也许这是少移动和添加,也许不是。 或者将它分解出来5 * 5 * 2 * 2 * x可以做5x然后5次,然后转换结果。 基本上所有这些我们在小学都学过,基数2只是简单一点,因为你只需要知道零表时间和表时间表。

链接地址: http://www.djcxy.com/p/72559.html

上一篇: ARM Assembler BCD to integer w/o multiply instruction

下一篇: Simple Assembly Language doubts