资讯动态

ARM 汇编循环 实现四则运算(C 代码与汇编一一对应)

发布时间:2026/10/16 2:58:53 来源:尧图企业网站定制
一、实验概述本次程序不使用 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 s0; MOV R5,R0 ; int ia; __sum_for_i ; for循环入口 CMP R5,R1 ; 判断 ib BGT __sum_end_for_i ; ib 退出循环 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 s0; MOV R5,#0 ; int i0; __MUL_for_i ; for循环入口 CMP R5,R1 ; 判断 ib BGE __MUL_end_for_i ; ib 退出循环 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 s0; __DIV_while ; while循环入口 CMP R0,R1 ; 判断 ab BLT __DIV_end_while ; ab 退出循环 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 ; 判断 ab BLT __MOD_end_while ; ab 退出循环 SUB R0,R0,R1 ; a - b; B __MOD_while ; 回到循环判断 __MOD_end_while LDMFD SP!,{R4-R12,PC} ; return a; 恢复现场返回六、完整主程序测试入口; 主函数测试 70 % 3 MOV R0,#70 ; 传入参数a70 MOV R1,#3 ; 传入参数b3 BL __MOD ; 调用取模函数结果存入R0 B . ; 程序停机死循环 ; 下方粘贴上面四个子程序代码即可 END七、代码对应关系说明每一段 C 代码紧跟专属汇编块函数名、循环标签一一对应C 语言每行逻辑汇编注释直接标注对应 C 语句无错位循环结构完全对齐for/while 入口标签、跳出分支、循环体、循环自增 / 自减位置严格匹配变量映射统一标注R4 存结果、R5 存循环变量R0/R1 固定为传入参数。八、运算测试结果主程序执行70 mod 3 70 连续减 3最后剩余 1函数返回后 R01运算正确。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑