装配中的BMI计算器

时间:2016-02-20 02:36:54

标签: assembly arm division

我正在尝试在Assembly中构建BMI计算器。我很遗憾,所以如果这一点没有任何意义,我会提前道歉。我正在使用预定义的值,所以我甚至不需要请求用户输入。

我正在使用uVision5,而Legacy Device是NXP,LPC2104。我认为这是ARM,如果这有用的话。

这是我到目前为止所做的,我正在努力做这个等式:

BMI =(weightInPounds * conversionFactor)/(heightInInches * heightInInches)

规则是我必须具有以下数据定义:

  • weightInPounds DCD 150
  • heightInInches DCD 64
  • conversionFactor EQU 703

这是我到目前为止所做的:

                    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

以下是我的问题

    <击>
  • 线LDR r3,conversionFactor;加载到r3的转换不起作用,因为EQU与DCD不一样但我不知道如何解决它而且我到处看都无法解决它
  • 由于前面提到的错误,第一条MUL线无效。

  • 我不知道怎么用寄存器划分...在“MOV r0,r5,LSR#r4”这一行我想要做的就像在等式中那样划分。

非常感谢任何帮助。

2 个答案:

答案 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&gt;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位。