一、实验概述
本次程序不使用 ARM 硬件乘除指令,仅依靠基础 MOV、ADD、SUB、CMP、分支跳转指令,通过循环迭代实现四类运算子程序:区间求和、乘法、整除、取模。
遵循 ARM 汇编子程序规范:R0、R1 作为入口参数,运算结果存入 R0 返回;子程序入口STMFD保护现场,出口LDMFD恢复现场并返回。 主程序测试:计算70 % 3,调用取模函数后停机。
二、功能 1:区间求和 sum (a,b)
C 语言源码
int sum(int a, int b) { int s = 0; for(int i = a; i <= b; i++) s += i; return s; }对应 ARM 汇编子程序
; int sum(int a, int b) __sum STMFD SP!,{R4-R12,LR} ; 保护现场 MOV R4,#0 ; int s=0; MOV R5,R0 ; int i=a; __sum_for_i ; for循环入口 CMP R5,R1 ; 判断 i<=b BGT __sum_end_for_i ; i>b 退出循环 ADD R4,R4,R5 ; s += i; ADD R5,R5,#1 ; i++; B __sum_for_i ; 回到循环判断 __sum_end_for_i MOV R0,R4 ; return s; LDMFD SP!,{R4-R12,PC} ; 恢复现场返回三、功能 2:乘法 mul (a,b) 累加实现
C 语言源码
int mul(int a, int b) { int s = 0; for(int i = 0; i < b; i++) { s += a; } return s; }对应 ARM 汇编子程序
; int mul(int a, int b) __MUL STMFD SP!,{R4-R12,LR} ; 保护现场 MOV R4,#0 ; int s=0; MOV R5,#0 ; int i=0; __MUL_for_i ; for循环入口 CMP R5,R1 ; 判断 i<b BGE __MUL_end_for_i ; i>=b 退出循环 ADD R4,R4,R0 ; s += a; ADD R5,R5,#1 ; i++; B __MUL_for_i ; 回到循环判断 __MUL_end_for_i MOV R0,R4 ; return s; LDMFD SP!,{R4-R12,PC} ; 恢复现场返回四、功能 3:整除 div (a,b) 连续减法求商
C 语言源码
int div(int a, int b) { int s = 0; while(a >= b) { a -= b; s++; } return s; }对应 ARM 汇编子程序
; int div(int a, int b) __DIV STMFD SP!,{R4-R12,LR} ; 保护现场 MOV R4,#0 ; int s=0; __DIV_while ; while循环入口 CMP R0,R1 ; 判断 a>=b BLT __DIV_end_while ; a<b 退出循环 SUB R0,R0,R1 ; a -= b; ADD R4,R4,#1 ; s++; B __DIV_while ; 回到循环判断 __DIV_end_while MOV R0,R4 ; return s; LDMFD SP!,{R4-R12,PC} ; 恢复现场返回五、功能 4:取模 mod (a,b) 连续减法求余数
C 语言源码
int mod(int a, int b) { while(a >= b) { a -= b; } return a; }对应 ARM 汇编子程序
; int mod(int a, int b) __MOD STMFD SP!,{R4-R12,LR} ; 保护现场 __MOD_while ; while循环入口 CMP R0,R1 ; 判断 a>=b BLT __MOD_end_while ; a<b 退出循环 SUB R0,R0,R1 ; a -= b; B __MOD_while ; 回到循环判断 __MOD_end_while LDMFD SP!,{R4-R12,PC} ; return a; 恢复现场返回六、完整主程序(测试入口)
; 主函数:测试 70 % 3 MOV R0,#70 ; 传入参数a=70 MOV R1,#3 ; 传入参数b=3 BL __MOD ; 调用取模函数,结果存入R0 B . ; 程序停机死循环 ; 下方粘贴上面四个子程序代码即可 END七、代码对应关系说明
- 每一段 C 代码紧跟专属汇编块,函数名、循环标签一一对应;
- C 语言每行逻辑,汇编注释直接标注对应 C 语句,无错位;
- 循环结构完全对齐:for/while 入口标签、跳出分支、循环体、循环自增 / 自减位置严格匹配;
- 变量映射统一标注:R4 存结果、R5 存循环变量,R0/R1 固定为传入参数。
八、运算测试结果
主程序执行70 mod 3: 70 连续减 3,最后剩余 1,函数返回后 R0=1,运算正确。