手把手教你分析C语言if架构代码最终如何用arm汇编实现

发布时间:2026/8/5 7:39:50

手把手教你分析C语言if架构代码最终如何用arm汇编实现
汇编语言是最接近机器语言的一门语言汇编指令是最微观它与大型软件关系类似于细胞核器官的关系c语言程序最终都要翻译成汇编代码按照一定规则组织成可执行程序然后才可以在硬件上执行。只有真正理解了汇编代码才能清楚的知道如何编写c代码效率才能最高才能真正写出高质量的c代码。掌握了汇编代码会让大家更快的成为真正的编程大师。本文通过一个基于arm裸机开发工程的简单实例给大家讲解if else架构的代码最终翻译成什么样的arm汇编代码。测试环境参考下面文章《linux驱动、ARM学习环境搭建》《4. 从0开始学ARM-ARM汇编指令其实很简单》《7. 从0学ARM-汇编伪指令、lds详解》1、c代码废话不多说直接上c代码这个代码非常简单就不多说了。/* * main.c * * Created on: 2025-10-23 * Author: pengdan */ int main(void) { int sum 0; int a 10; int b 22; int flag 15; if(flag 11) { sum ab; }else{ sum a-b; } return 0; }2、编译代码最终编译城的程序gcd.bin就可以烧录到arm板子上运行为方便理解我们可以用arm-linux-gnueabihf-objdump去掉程序中符号信息生成程序gcd.disgcd.dis1 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: ea00000f b 40008048 __main_from_arm 10 11 40008008 : 12 40008008: b480 push {r7} 13 4000800a: b085 sub sp, #20 14 4000800c: af00 add r7, sp, #0 15 4000800e: 2300 movs r3, #0 16 40008010: 60fb str r3, [r7, #12] 17 40008012: 230a movs r3, #10 18 40008014: 60bb str r3, [r7, #8] 19 40008016: 2316 movs r3, #22 20 40008018: 607b str r3, [r7, #4] 21 4000801a: 230f movs r3, #15 22 4000801c: 603b str r3, [r7, #0] 23 4000801e: 683b ldr r3, [r7, #0] 24 40008020: 2b0b cmp r3, #11 25 40008022: dd04 ble.n 4000802e 26 40008024: 68ba ldr r2, [r7, #8] 27 40008026: 687b ldr r3, [r7, #4] 28 40008028: 4413 add r3, r2 29 4000802a: 60fb str r3, [r7, #12] 30 4000802c: e003 b.n 40008036 31 4000802e: 68ba ldr r2, [r7, #8] 32 40008030: 687b ldr r3, [r7, #4] 33 40008032: 1ad3 subs r3, r2, r3 34 40008034: 60fb str r3, [r7, #12] 35 40008036: 2300 movs r3, #0 36 40008038: 4618 mov r0, r3 37 4000803a: 3714 adds r7, #20 38 4000803c: 46bd mov sp, r7 39 4000803e: f85d 7b04 ldr.w r7, [sp], #4 40 40008042: 4770 bx lr 41 40008044: 0000 movs r0, r0 42 ... 433、 汇编代码分析1变量压栈11 40008008 : 12 40008008: b480 push {r7} 13 4000800a: b085 sub sp, #20 14 4000800c: af00 add r7, sp, #0这几行代码为我们在栈顶预留了20字节的空间r7指向分配的栈顶。并且为变量flag、b、a、sum分配了对应的栈空间对应的栈地址如下分配过程参考下图2if代码块if分支代码对应的汇编代码块详见下图从上图可以得出if代码块翻译成汇编代码的思路就是23行先将变量从栈中读取到寄存器r324行通过汇编指令cmp比较r3和立即数11该指令会影响寄存器cpsr状态位25、30行通过汇编指令b.n 根据cpsr的n状态位决定执行那一段代码块26-27、31-32行进入if分治后从栈中取出a、b的值分别到r2/r328、29行flag大于11r3r2r3然后将和存入到栈中sum对应的位置32、33行flag小于11r3r2-r3然后将差存入到栈中sum对应的位置完整分析如下4、其他编译文件gcd.s.text .global _start _start: ldr sp,0x70000000 /*get stack top pointer*/ b mainMakefileTARGETgcd TARGETCmain 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 *.binmap.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) } }

相关新闻

揭秘Marvis Agent六大隐藏功能与四种高效组合工作流

揭秘Marvis Agent六大隐藏功能与四种高效组合工作流

2026/8/5 7:39:50

1. 从工具到伙伴:重新认识Marvis中的Agent如果你已经用了一段时间Marvis,可能觉得它就是个帮你写写代码、查查资料的智能助手。但当你开始深入使用它的Agent功能时,你会意识到,这玩意儿远不止于此。它更像是一个可以深度定制、协同…

游戏开发中的方法重写:构建可扩展角色能力系统

游戏开发中的方法重写:构建可扩展角色能力系统

2026/8/5 7:39:50

在实际游戏开发中,我们常常会遇到一个经典需求:如何让一个角色在特定条件下,比如吃到某种道具后,临时获得一种全新的、与基础行为逻辑不同的能力?例如,一个普通的平台跳跃角色,在吃到“火焰花”…

Windows权限管理:Guest账户与Everyone组的本质区别与安全实践

Windows权限管理:Guest账户与Everyone组的本质区别与安全实践

2026/8/5 7:29:50

1. 项目概述:从两个“特殊”用户说起在Windows的日常管理和故障排查中,我们经常会遇到一些与权限相关的“拦路虎”。比如,想删除一个系统文件,却弹出“你需要来自TrustedInstaller的权限”;想共享一个文件夹给同事&…

突破阿里云OSS图片20MB限制:客户端压缩、异步处理与替代方案实战

突破阿里云OSS图片20MB限制:客户端压缩、异步处理与替代方案实战

2026/8/5 8:50:02

1. 问题缘起:当20MB成为图片处理的隐形门槛 那天下午,运营同事急匆匆地跑过来,说后台又卡住了,用户上传的一张产品全景图死活处理不了。我一看报错日志,熟悉的“ The image size exceeds the limit ”赫然在目。这已…

【2027最新】基于SpringBoot+Vue的大学生竞赛管理系统管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的大学生竞赛管理系统管理系统源码+MyBatis+MySQL

2026/8/5 8:50:02

💡实话实说:CSDN上做毕设辅导的都是专业技术服务,大家都要生活,这个很正常。我和其他人不同的是,我有自己的项目库存,不需要找别人拿货再加价。我就是个在校研究生,兼职赚点饭钱贴补生活费&…

VMware虚拟机中Windows 10无损升级至Windows 11全流程指南

VMware虚拟机中Windows 10无损升级至Windows 11全流程指南

2026/8/5 8:50:02

1. 项目概述:为什么要在VMware里从Win10升级到Win11?如果你手头有一台性能还不错的电脑,但主力系统是Linux或者macOS,又或者你是个开发者、测试工程师,需要在不同版本的Windows之间反复横跳,那么虚拟机&…

国家超算互联网DeepSeek-V4-Flash API一键接入与生产级调用实践

国家超算互联网DeepSeek-V4-Flash API一键接入与生产级调用实践

2026/8/5 8:50:02

1. 先搞清楚“一键接入”到底意味着什么 看到“国家超算互联网”和“一键接入”这两个词放在一起,很多人的第一反应可能是“门槛很高”或者“流程复杂”。但这次上线的 DeepSeek-V4-Flash 正式版 API,核心价值恰恰在于 降低高性能计算资源的调用门槛 。…

负二项回归结果解读:离散参数alpha与发生率比IRR

负二项回归结果解读:离散参数alpha与发生率比IRR

2026/8/5 8:50:02

负二项回归分析结果解读一、方法概述负二项回归(Negative Binomial Regression)是处理计数型因变量(过离散数据)的广义线性回归方法。当因变量的方差显著大于均值(即存在过离散现象)时,Poisson回…

HarmonyOS 7 / API 26 依赖版本漂移怎么查:oh-package、锁文件和 CI 拦截怎么拆

HarmonyOS 7 / API 26 依赖版本漂移怎么查:oh-package、锁文件和 CI 拦截怎么拆

2026/8/5 8:40:01

先说问题:依赖版本漂移,通常不是编译器突然坏了 HarmonyOS 7 / API 26 项目升级时,除了 SDK 和 build-profile,依赖版本也很容易出问题。最常见的现象是:A 电脑能构建,B 电脑失败;昨天 CI 通过&…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/4 15:23:37

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/5 6:02:27

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/5 8:19:55

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

Go + 云原生微服务架构实战:2026 企业级开发完整指南

Go + 云原生微服务架构实战:2026 企业级开发完整指南

2026/8/5 0:09:22

Go 云原生微服务架构实战:2026 企业级开发完整指南 CNCF 最新数据显示,2026 年云原生相关岗位增速同比上涨 62%。Kubernetes、Docker、Etcd、Prometheus 等云原生基础设施全部由 Go 语言编写。Go 语言凭借简洁的语法、出色的并发模型、极快的编译速度和…

LangChain项目上线就翻车?团队接手的拦路虎从来不是代码

LangChain项目上线就翻车?团队接手的拦路虎从来不是代码

2026/8/5 0:09:22

聊《一个LangChain项目上线后,最先暴露的并不是代码问题》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。 摘要 摘要:我见过太多LangChain Demo能跑的项目,一交出去就崩。不是模…

3步轻松实现音乐格式自由:ncmdump网易云NCM解密完整指南

3步轻松实现音乐格式自由:ncmdump网易云NCM解密完整指南

2026/8/5 0:09:22

3步轻松实现音乐格式自由:ncmdump网易云NCM解密完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却发现只能在特定客户端播放?当你想在车载音响、…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/4 13:34:51

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/4 14:25:14

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/4 15:11:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…