ARM汇编实现输入范围奇偶求和功能异常排查
ARM汇编1到N奇偶累加代码修复说明
现有代码核心问题
- 寄存器用途规划混乱:用户输入的上限值存入r1后被直接修改,未保留原始值,也未初始化循环计数器、偶数累加和、奇数累加和对应的寄存器,初始值随机导致运算错误
- 奇偶判断逻辑错误:原有判断语句无法识别数值奇偶性,正确奇偶判断需使用
TST指令将数值与1按位与,若Z标志位为1则是偶数,为0则是奇数 - 循环逻辑不匹配需求:原有循环是判断r1等于101退出,未按顺序遍历1到用户输入的上限值,也未在到达上限时停止循环
- printf调用参数错误:调用输出函数前未按要求设置对应参数,且未定义奇偶累加和的输出格式字符串
- 寄存器未初始化:用于累加、计数的寄存器未预先清0,初始随机值会导致计算结果错误
修正后完整代码
.equ READERROR, 0 @ 用于检查scanf读取错误 .global main @ 因使用C库需定义main入口 main: prompt: @ 提示用户输入数字 ldr r0, =strInputPrompt bl printf @ 读取用户输入 ldr r0, =numInputPattern ldr r1, =intInput bl scanf cmp r0, #READERROR beq readerror @ 读取错误则跳转处理 @ 回显用户输入 ldr r1, =intInput ldr r1, [r1] ldr r0, =strOutputNum bl printf @ 初始化寄存器:r4存上限值,r2存奇数累加和,r3存偶数累加和,r5存当前遍历数 mov r4, r1 mov r2, #0 mov r3, #0 mov r5, #1 loop: cmp r5, r4 @ 遍历数超过上限则退出循环 bgt calc_end @ 判断奇偶 tst r5, #1 beq even_add @ 是偶数跳转到偶数累加 @ 奇数累加 add r2, r2, r5 b loop_continue even_add: @ 偶数累加 add r3, r3, r5 loop_continue: add r5, r5, #1 b loop calc_end: @ 输出奇数累加和 ldr r0, =strOutputOddSum mov r1, r4 mov r2, r2 bl printf @ 输出偶数累加和 ldr r0, =strOutputEvenSum mov r1, r4 mov r2, r3 bl printf b myexit readerror: @ 清除输入缓冲区 ldr r0, =strInputPattern ldr r1, =strInputError bl scanf b prompt myexit: @ 退出程序返回OS mov r7, #0x01 svc 0 .data .balign 4 strInputPrompt: .asciz "Input a number between 1 and 100: \n" .balign 4 strOutputNum: .asciz "You entered: %d \n" .balign 4 strOutputOddSum: .asciz "The sum of odd numbers from 1 to %d is: %d \n" .balign 4 strOutputEvenSum: .asciz "The sum of even numbers from 1 to %d is: %d \n" .balign 4 numInputPattern: .asciz "%d" .balign 4 strInputPattern: .asciz "%[^\n]" .balign 4 strInputError: .skip 100*4 .balign 4 intInput: .word 0 .global printf .global scanf
内容的提问来源于stack exchange,提问作者MaciG
相关产品推荐
相关产品推荐

