我们最近开始学习汇编代码,并且我们已经完成了有关该主题的作业。我们一直在研究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
此代码有效,但我认为我已经过分了。 有没有办法做到这一点,但行数更少?
答案 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。