ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

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

一、实验概述

本次程序不使用 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

七、代码对应关系说明

  1. 每一段 C 代码紧跟专属汇编块,函数名、循环标签一一对应;
  2. C 语言每行逻辑,汇编注释直接标注对应 C 语句,无错位;
  3. 循环结构完全对齐:for/while 入口标签、跳出分支、循环体、循环自增 / 自减位置严格匹配;
  4. 变量映射统一标注:R4 存结果、R5 存循环变量,R0/R1 固定为传入参数。

八、运算测试结果

主程序执行70 mod 3: 70 连续减 3,最后剩余 1,函数返回后 R0=1,运算正确。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进