无符号整数除法ARM Cortex-M0 +汇编

时间:2016-09-14 01:00:30

标签: assembly arm division cortex-m

大家好我是新来的,但无论如何这里是我的问题: 我试图在Assembly中编写一个无符号整数除法的子程序,但我真的无法搞清楚。如果有人能告诉我该怎么做,那就太好了。

我将调用子程序DIVU。 R1将是股息。除数将在R0中。商将在RO中,并且保留在R1中。

基本上,我试图做这样的事情:R1÷R0 = R0remainderR1

如果R0 = 0,我想保持输入参数不变,并在返回时设置C标志。否则,我只想清除C标志。我不想在返回后更改任何其他寄存器的值。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

到目前为止,我已经提出了这个问题。你们都觉得怎么样?看起来它会起作用吗?对新手的建设性批评会很好,以及一些改变它的例子。谢谢:))

DIVU
      CMP   R1,#0       ;compares R1 to 0
      BEQ   AnsZero     ;if R1=0, it branches to AnsZero (the final answer will be 0)
      CMP   R0,#0       ;compares R0 to 0
      BEQ   EndFlag     ;if R0=0, it will go to the end to set C flag
      PUSH  {R3}        ;saves R3 so it can used as a counter for quotient
      MOV   R3,#0       ;sets R3 to 0
While CMP   R0,R1       ;start of while loop 
      BLT   EndWhil     ;Branches to end of while when dividend < divisor, otherwise goes through loop
      SUB   R1,R1,R0    ;R1=R1-R0 , dividend=dividend-divisor
      ADD   R3,R3,#1    ;R3=R3+1, quotient=quotient+1 (init is zero, so 0+1=1 if one successful loop)
      B While       ;continues loop
EndWhil MOV R0,R3       ;R0=R3, the register that had the divisor gets the quotient
      PULL  {R3}        ;R3's original value is returned
      B Return      ;goes to end of subroutine labeled return
EndFlag PUSH {R0}       ;saves original R0 value
      PUSH  {R1}        ;saves original R1 value
      MRS   R0,APSR     ;this line and the next few down all set the C flag without changing other flags
      MOVS  R1,#0x20    
      LSLS  R1,R1,#24   
      ORRS  R0,R0,R1    
      MSR   APSR,R0
      PULL  {R1}        ;gets original R1 value
      PULL  {R0}        ;gets original R0 value
      B Return      ;goes to end of subroutine
AnsZero MOV R0,#0       ;sets R0=0 because R1=1, 0/X=0r0
      B Return      ;goes to end of subroutine
Return  BX  LR      ;returns from subroutine

如果代码显示不正确,我很抱歉,我是新手,所以我仍然想找出将其复制到浏览器并在此处正确显示的最佳方法。