ARM左移或算术右移,具体取决于移位计数的符号,以有效乘以2的任意幂

时间:2019-03-01 02:23:22

标签: assembly arm

我们最近开始学习汇编代码,并且我们已经完成了有关该主题的作业。我们一直在研究ARM,必须在Raspberry Pi中进行编码。我的作业问题之一是这样的:

编写实现以下C函数的汇编函数:

  

int32_t shiftS32(int32_t x,int32_p)//返回x * 2 ^ p for p = -31..31

这是我对问题的回答:

.global shiftS32  
.text  

shiftS32:  

PUSH {R0}   
CMP R0, #0   
BMI ENDA 
PUSH {R1}  
CMP R1, #0    

BMI END1   
POP {R1}  
MOV R0, R0, LSL R1  

BX LR

END1:
POP {R1}
SUB R1, #0
NEG R1, R1
MOV R0, R0, LSR R1 

BX LR

ENDA: 
PUSH {R1}
CMP R1, #0

BMI END 
POP {R1}
MOV R0, R0, LSL R1

BX LR

END:
POP {R1}
SUB R1, #0
NEG R1, R1
MOV R0, R0, ASR R1 

BX LR

此代码有效,但我认为我已经过分了。 有没有办法做到这一点,但行数更少?

1 个答案:

答案 0 :(得分:1)

是的,这有点太多代码。

您想要使用this trick来实现移位的有符号整数除,同时仍保持n / 2的舍入语义(向0),这与向-infinity舍入的移位不同。

您可能想使用条件执行。

您的代码可能短于this

shiftS32:
        cmp     r1, #0
        asrlt   r2, r0, #31
        addlt   r3, r1, #32
        lslge   r0, r0, r1
        rsblt   r1, r1, #0
        addlt   r0, r0, r2, lsr r3
        asrlt   r0, r0, r1
        bx      lr

还有一点测试here