大家好我是新来的,但无论如何这里是我的问题: 我试图在Assembly中编写一个无符号整数除法的子程序,但我真的无法搞清楚。如果有人能告诉我该怎么做,那就太好了。
我将调用子程序DIVU。 R1将是股息。除数将在R0中。商将在RO中,并且保留在R1中。
基本上,我试图做这样的事情:R1÷R0 = R0remainderR1
如果R0 = 0,我想保持输入参数不变,并在返回时设置C标志。否则,我只想清除C标志。我不想在返回后更改任何其他寄存器的值。
提前感谢您的帮助!
答案 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
如果代码显示不正确,我很抱歉,我是新手,所以我仍然想找出将其复制到浏览器并在此处正确显示的最佳方法。