当前位置: 首页 > news >正文

深度解析嵌入式for循环实现原理!

关注+星标公众,不错过精彩内容

来源 | 一口Linux

嵌入式代码for循环比较常见,今天来解析一下嵌入式C中for循环实现的原理。

1、c代码

废话不多说,直接上c代码,这个代码非常简单,就不多说了。

1 /* 2 * main.c 3 * 4 * Created on: 2025-11-26 5 * Author: pengdan 6 */ 7 8int main(void) 9 { 10 int i = 1; 11 int sum = 0; 12 13 for(i=0;i<=100;i++) 14 { 15 sum+=i; 16 } 17 18 return0; 19 }

2、编译代码


最终编译城的程序gcd.bin就可以烧录到arm板子上运行,

为方便理解,我们可以用arm-linux-gnueabihf-objdump去掉程序中符号信息,生成程序gcd.dis

gcd.dis

1 2 gcd.elf: file format elf32-littlearm 3 4 5 Disassembly of section .text: 6 7 40008000 <_start>: 8 40008000: e3a0d207 mov sp, #1879048192 ; 0x70000000 9 40008004: ea00000d b 40008040 <__main_from_arm> 10 11 40008008 <main>: 12 40008008: b480 push {r7} 13 4000800a: b083 sub sp, #12 14 4000800c: af00 add r7, sp, #0 15 4000800e: 2300 movs r3, #0 16 40008010: 607b str r3, [r7, #4] 17 40008012: 2300 movs r3, #0 18 40008014: 603b str r3, [r7, #0] 19 40008016: 2300 movs r3, #0 20 40008018: 607b str r3, [r7, #4] 21 4000801a: e006 b.n 4000802a <main+0x22> 22 4000801c: 683a ldr r2, [r7, #0] 23 4000801e: 687b ldr r3, [r7, #4] 24 40008020: 4413 add r3, r2 25 40008022: 603b str r3, [r7, #0] 26 40008024: 687b ldr r3, [r7, #4] 27 40008026: 3301 adds r3, #1 28 40008028: 607b str r3, [r7, #4] 29 4000802a: 687b ldr r3, [r7, #4] 30 4000802c: 2b64 cmp r3, #100 ; 0x64 31 4000802e: ddf5 ble.n 4000801c <main+0x14> 32 40008030: 2300 movs r3, #0 33 40008032: 4618 mov r0, r3 34 40008034: 370c adds r7, #12 35 40008036: 46bd mov sp, r7 36 40008038: f85d 7b04 ldr.w r7, [sp], #4 37 4000803c: 4770 bx lr 38 ...

3、 汇编代码分析

1)变量压栈

11 40008008 <main>: 12 40008008: b480 push {r7} 13 4000800a: b085 sub sp, #12 14 4000800c: af00 add r7, sp, #0

这几行代码,为我们在栈顶预留了12字节的空间,r7指向分配的栈顶。

并且为变量:i、sum分配了对应的栈空间,对应的栈地址如下:

分配过程参考下图:

2)for循环代码块

for循环代码,对应的汇编代码块,详见下图:

从上图可以得出,if代码块翻译成汇编代码的思路就是,

  1. 19-20行:初始化变量i值为0:将寄存器写入值0,然后将该值压入栈0x04位置,

  2. 22-23行:从栈中分别取出i,sum存入r2、r3

  3. 24行 :将i的值累加到sum:r2与r3相加结果存入r3

  4. 25行 :将sum写入栈中:将r3压栈

  5. 26-27行:i++ :从栈中i值到r3,然后将1累加到寄存器r3

  6. 28-29 行:将i的值写入到栈,然后再读出到r3

  7. 30行 :将i值和100比较,cmp指令会影响cpsr的状态位

  8. 31行 :通过b指令,判断cpsr中的状态位,如果小于等于(ble),则跳转到0x4000801c位置,否则往下执行

完整分析如下:


4、其他编译文件

gcd.s

.text .global _start _start: ldr sp,=0x70000000 /*get stack top pointer*/ b main

Makefile

TARGET=gcd TARGETC=main all: arm-linux-gnueabihf-gcc -lto -g -c -o $(TARGETC).o $(TARGETC).c arm-linux-gnueabihf-gcc -lto -g -c -o $(TARGET).o $(TARGET).s arm-linux-gnueabihf-gcc -lto -g -S -o $(TARGETC).s $(TARGETC).c arm-linux-gnueabihf-ld $(TARGETC).o $(TARGET).o -Tmap.lds -o $(TARGET).elf arm-linux-gnueabihf-objcopy -O binary -S $(TARGET).elf $(TARGET).bin arm-linux-gnueabihf-objdump -D $(TARGET).elf > $(TARGET).dis clean: rm -rf *.o *.elf *.dis *.bin

map.lds文件

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x40008000; . = ALIGN(4); .text : { gcd.o(.text) *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .bss : { *(.bss) } }

------------END------------

瑞萨推出用于MCU的智能工具:Renesas 365,MCU 选型、硬件设计到嵌入式软件开发等一站式服务!

MCU集成开发环境e² studio升级,解决了这些bug...

890元买个戴森吹风机,拆开后我懵了!

http://www.cnnetsun.cn/news/1247894.html

相关文章:

  • 使用PDF-Extract-Kit-1.0实现科研论文元数据自动提取
  • DeEAR语音情感识别避坑手册:采样率不匹配、通道数错误、静音过长导致的失败
  • DeepSeek-OCR-2部署教程:WSL2环境下Windows用户零配置运行深求·墨鉴
  • Qwen3-TTS语音合成进阶教程:情感强度、语速、停顿符的控制方法
  • Gemma-3-270m与MySQL数据库集成实战:高效数据处理方案
  • Realistic Vision V5.1 创意作品展:结合SolidWorks模型渲染的工业设计概念图
  • Qwen3-Reranker-4B性能优化:vLLM推理加速实践指南
  • 云容笔谈·东方红颜影像生成系统性能调优:针对STM32嵌入式设备展示的优化策略
  • 音乐流派分类Web应用保姆级教程:ViT模型+Gradio快速上手指南
  • 3个步骤解决OpenMV IDE在Raspberry Pi Bookworm上的兼容性问题
  • Qwen2.5-VL-7B-Instruct惊艳效果:漫画分镜图→剧情连贯性描述+角色关系推断
  • 如何摆脱平台依赖?yuque-exporter让语雀知识库完全自主掌控
  • Qwen3-VL-2B API接口安全设置:认证与限流配置
  • Phi-4-reasoning-vision-15B入门必看:如何规避click(x,y)输出?强约束提示词模板库
  • 内存故障排查全景图:从症状到解决方案的深度指南
  • Phi-3-Mini-128K算力利用率提升:多并发请求下GPU利用率稳定达82%实测
  • MusePublic资源监控教程:nvidia-smi实时跟踪显存与GPU利用率
  • Z-Image-Turbo-辉夜巫女对比评测:不同采样器生成效果与速度分析
  • AIGlasses OS Pro 面试宝典:攻克计算机视觉与深度学习常见八股文
  • Realistic Vision V5.1 赋能Java开发者:集成指南与面试题实战解析
  • Buildozer实战全攻略:突破Python跨平台打包技术瓶颈
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4与Web开发集成实战
  • 使用SeqGPT-560m增强IDEA开发体验:智能代码审查插件
  • 消息留存保卫战:RevokeMsgPatcher防撤回补丁解决微信4.0.3.36版本适配难题
  • 衡山派Luban-Lite GPIO驱动架构详解:HAL与Driver层设计及RT-Thread Pin设备驱动集成
  • Cosmos-Reason1-7B部署教程:Ubuntu 22.04 LTS系统依赖库版本兼容性清单
  • mPLUG视觉问答:专注图片理解+英文提问,轻量级图文交互工具
  • Chatbot App 注册功能开发指南:从零搭建到生产环境部署
  • Fish-Speech-1.5在Linux系统的性能优化:从安装到调优全流程
  • Qwen3-ASR-1.7B代码实例:Streamlit前端+Whisper-style后端识别逻辑拆解