当前位置: 首页 > 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.jsqmd.com/news/469855/

相关文章:

  • Instagram视频高效下载解决方案:零门槛掌握的内容保存技术
  • MarkdownViewer++:Notepad++插件中的Markdown预览解决方案,让文档创作所见即所得
  • SiameseAOE模型参数详解与效果调优实战
  • 如何用Chinese-STD-GB-T-7714轻松搞定学术参考文献格式
  • Qwen3-ForcedAligner在司法领域的应用:庭审录音智能标记系统
  • 多模型对比:Qwen3-ASR-1.7B与Whisper的实测性能分析
  • StructBERT零样本分类-中文-base科研辅助:学术论文摘要自动归类至CCF分类体系
  • Z-Image-Turbo-rinaiqiao-huiyewunv开源镜像部署:辉夜大小姐微调权重本地化落地实践
  • 文脉定序应用场景:高校图书馆数字资源检索增强,支持古籍OCR文本重排序
  • Fish Speech 1.5声音克隆教程:如何用手机录音打造专属AI声线
  • Qwen3-ASR-1.7B惊艳效果:粤语新闻联播→带时间轴的全文本+关键事件标记
  • 立创EDA开源实战:STM32核心板“原神雷电将军”彩色丝印设计与硬件解析
  • 弦音墨影完整教程:从Qwen2.5-VL模型加载到水墨UI定制全流程
  • StructBERT模型在嵌入式设备上的轻量化部署探索
  • 01 立创开源:1.8W 太阳能楼道灯DIY,基于ET5120A驱动与RA97 RG0低蓝光灯珠
  • Qwen3-TTS在嵌入式系统的轻量化部署方案
  • 基于BERT文本分割的Java应用集成实战:SpringBoot服务开发指南
  • Wan2.1-umt5快速上手教程:Anaconda虚拟环境配置详解
  • C++开发者指南:高效集成Cosmos-Reason1-7B推理引擎
  • 3D Face HRN模型与Blender集成:3D建模工作流优化
  • Nano-Banana创意设计实战:基于Vue3的前端展示系统开发
  • 医学影像着色应用:cv_unet_image-colorization助力病理切片分析
  • 使用ComfyUI搭建水墨江南模型工作流:可视化节点式创作
  • SenseVoice-Small ONNX广播应用:节目内容分析
  • Stable Yogi Leather-Dress-Collection 结合 Cursor 智能编码:自动生成设计说明文档
  • 3大核心价值:taskt如何通过开源自动化工具实现流程优化
  • GLM-OCR与卷积神经网络(CNN)结合:提升图像文档特征提取能力
  • 3种零代码方案实现企业级图片自动化处理
  • 李慕婉-仙逆-造相Z-Turbo Java八股文学习助手:面试题深度解析与知识串联
  • 造相Z-Image模型v2建筑可视化应用:从草图到效果图全流程