我正在尝试在Assembly中构建BMI计算器。我很遗憾,所以如果这一点没有任何意义,我会提前道歉。我正在使用预定义的值,所以我甚至不需要请求用户输入。
我正在使用uVision5,而Legacy Device是NXP,LPC2104。我认为这是ARM,如果这有用的话。
这是我到目前为止所做的,我正在努力做这个等式:
BMI =(weightInPounds * conversionFactor)/(heightInInches * heightInInches)
规则是我必须具有以下数据定义:
这是我到目前为止所做的:
AREA File1, CODE, READONLY
ENTRY
LDR r1,weightInPounds ;loads weight into r1
LDR r2,heightInInches ;loads height into r2
LDR r3,=conversionFactor ;loads conversion into r3
MUL r4,r1,r3 ;mult weight by conv factor
MUL r5,r2,r2 ;square height
MOV r0,r5, LSR #r4 ;divide previous 2 and store in r0
stop B stop ;force infinite loop by branching to this line
weightInPounds DCD 150 ;defines weight
heightInInches DCD 64 ;defines height
conversionFactor EQU 703 ;defines conversion factor for BMI calc
END ;end of program
以下是我的问题
由于前面提到的错误,第一条MUL线无效。
我不知道怎么用寄存器划分...在“MOV r0,r5,LSR#r4”这一行我想要做的就像在等式中那样划分。
非常感谢任何帮助。
答案 0 :(得分:1)
检查在ARM程序集中实现的此除法算法,将R1除以R2:
CMP R2, #0
BEQ stop
;check for divide by zero!
MOV R0,#0
MOV R3,#1
;clear R0 to accumulate result
;set bit 0 in R3, which will be
;shifted left then right
start
CMP R2,R1
MOVLS R2,R2,LSL#1
MOVLS R3,R3,LSL#1
BLS start
;shift R2 left until it is about to
;be bigger than R1
;shift R3 left in parallel in order
;to flag how far we have to go
next
CMP R1,R2 ;carry set if R1>R2 (don't ask why)
SUBCS R1,R1,R2 ;subtract R2 from R1 if this would
;give a positive answer
ADDCS R0,R0,R3 ;and add the current bit in R3 to
;the accumulating answer in R0
MOVS R3,R3,LSR#1 ;Shift R3 right into carry flag
MOVCC R2,R2,LSR#1 ;and if bit 0 of R3 was zero, also
;shift R2 right
BCC next ;If carry not clear, R3 has shifted
;back to where it started, and we
;can end
stop B stop ;exit routine
原始链接:https://www.virag.si/2010/02/simple-division-algorithm-for-arm-assembler/
答案 1 :(得分:-1)
如何划分寄存器的答案是
DIV destination-register, nominator-register, denominator-register
我可以混合我的提名者和分母,所以检查结果。
如果可能的话,你应该避免使用MOV,因为它只能在加载常量时在ONE寄存器的前8位操作,或者它可以将两个完整寄存器作为操作数,并且不会发生异常。这是由于手中的指令格式。原因是源有8位可用,目标地址有8位,当其中一位是数字时,它只能占用8位。