Assembly 我不熟悉ARM汇编语言,您能帮我解释一下为什么我没有在正确的寄存器中获得正确的平均摄氏度吗?
问题陈述要求获取16个温度值,以摄氏度为单位,范围为0-45,并取其平均值,将它们存储在一个数组中。(我们将组成数组中的值) 当我运行我的程序时,我在寄存器r2中没有得到正确的平均值 这是使用带有BeagleBone Black和TI XDS 100V2 JTAG仿真器的ARM汇编语言。我用CCS运行所有的程序Assembly 我不熟悉ARM汇编语言,您能帮我解释一下为什么我没有在正确的寄存器中获得正确的平均摄氏度吗?,assembly,arm,Assembly,Arm,问题陈述要求获取16个温度值,以摄氏度为单位,范围为0-45,并取其平均值,将它们存储在一个数组中。(我们将组成数组中的值) 当我运行我的程序时,我在寄存器r2中没有得到正确的平均值 这是使用带有BeagleBone Black和TI XDS 100V2 JTAG仿真器的ARM汇编语言。我用CCS运行所有的程序 .text .global _start _start: .EQU NUM,8 LDR R1,=CELSIUS_TEMPS @ l
.text
.global _start
_start:
.EQU NUM,8
LDR R1,=CELSIUS_TEMPS @ load pointer to array
LDR R2,=CELSIUS_AVG @ load pointer to Celsius_Av array
MOV R3,#NUM @ initialize counter
NEXT: LDRB R6,[R1],#1 @ get first cels_temp byte, increment pointer
LDRB R7,[R1],#1 @ get second cels_temp byte, increment pointer
ADDS R4,R7,R6 @ add sum in R6
ADDS R8,R8,R4 @ add sum in R4
SUBS R3,R3,#1 @ decrement element counter
BNE NEXT @ repeat loop
MOVS R8,R8,LSR #4 @ divide by 16 LSB to carry
ADC R8,R8,#0 @ add contents of carry flag to sum in R6 to round result up if carry=1
STRB R8,[R2] @ copy resulted byte to Celsius_Av array
.DATA
CELSIUS_TEMPS: .byte 0x00,0x03,0x06,0x9,0x0C,0x0F,0x12,0x15,0x18,0x1B,0x1E,0x21,0x24,0x27,0x2A,0x2D
CELSIUS_AVG: .byte 0x00
.end
正如我在问题中所说的,我对这一点还不熟悉,我得到了一个很大的平均值(0x10200000),对于我选择的温度,我应该得到22或23的平均值。(十六进制为0x16或0x17)您得到了什么?说明您需要显示实际输出以及所需输出。(理想情况下,还可以使用调试器检查代码以观察寄存器值的变化。)@fuz:imm不是后增量吗?我认为这只是展开2,这部分看起来不错。(我想你同意,因为你已经删除了你之前的评论)@PeterCordes是的,我对语法有过一段时间的思考。在它运行完之后,我得到了0x10200000。你的问题,而不是将信息隐藏在评论中。