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

(学习笔记)3.6 控制(3.6.8 switch语句)

文章目录线索栏笔记栏1.跳转表高效多重分支的核心2. 编译实现通用步骤以图3-22/3-23示例 switch_eg为例3. 跳转表数据结构汇编片段4. GCC对C语言的扩展计算goto5. 练习题练习题3.30练习题3.31 图3-24总结栏线索栏核心机制编译器在什么条件下会使用跳转表 (jump table)​ 来实现 switch语句相比一长串if-else跳转表的主要优势是什么实现三步曲实现一个基于跳转表的 switch语句汇编代码通常遵循哪三个关键步骤偏移、检查、跳转索引转换为什么在汇编代码中通常先对 switch的变量做一次减法例如 subq $100,%rdi这步操作在C语言扩展实现中对应什么边界检查技巧汇编代码如何高效地检查转换后的索引是否在跳转表范围内为什么可以使用无符号比较跳转表结构跳转表在汇编代码.rodata段中是如何声明的它如何编码不同 case值包括连续、重复、缺失的情况对应的目标地址逆向工程给定一个 switch语句的汇编代码片段和其跳转表如何系统地逆向推导出原始C代码中所有case的值和对应的代码块练习题3.30 3.31笔记栏1.跳转表高效多重分支的核心1适用条件当 case数量较多如4个且值相对密集时GCC会使用跳转表。2优势执行时间与 case数量无关仅为一次数组索引和一次间接跳转。这是典型的“以空间换时间”。3数据结构一个地址数组表项 i是当开关索引值等于 i时应跳转的代码地址。2. 编译实现通用步骤以图3-22/3-23示例 switch_eg为例C函数long switch_eg(long n, long v) { … switch(n) { … } }1计算索引index n - 100。将原 case值范围 (100-106) 平移至以0为起点 (0-6)。汇编subq $100, %rdi 结果在 %rsi2边界检查比较 index是否 6。利用无符号比较当 index为负数即原 n 100时会因其巨大的无符号表示而判定为 6从而跳转到默认 (default) 块。汇编cmpq $6, %rsi; ja .L83间接跳转通过 index从跳转表 jt中取出目标地址并跳转。汇编jmp *.L4(,%rsi,8)3. 跳转表数据结构汇编片段.section.rodata.align8.L4:# 跳转表基地址.quad.L3 # index0(n100):跳转到.L3(loc_A).quad.L8 # index1(n101):跳转到.L8(default,缺失case).quad.L5 # index2(n102):跳转到.L5(loc_B).quad.L6 # index3(n103):跳转到.L6(loc_C).quad.L7 # index4(n104):跳转到.L7(loc_D).quad.L8 # index5(n105):跳转到.L8(default,缺失case).quad.L7 # index6(n106):跳转到.L7(loc_D 与case104相同)1处理重复casecase 104和 case 106指向同一代码块 (.L7)。2处理缺失casecase 101和 105指向默认块 (.L8)。3处理fall throughcase 102的代码块 (.L5) 末尾没有​ jmp指令执行会“落入” case 103的代码块 (.L6)。4. GCC对C语言的扩展计算goto在教材提供的等价的C扩展代码 switch_eg_impl中使用 运算符获取代码标签的地址从而构造跳转表并使用 goto *jt[index]进行间接跳转。这帮助我们理解汇编指令 jmp *.L4(,%rsi,8)的含义。5. 练习题练习题3.30已知1x在 %rdi。2首条指令addq $1, %rdi。这意味着索引计算为 index x 1。3比较指令cmpq $8, %rdi。检查 index是否 8。4跳转表有9项索引0~8。解答A. case值因为 index x 1 且 ja .L2对应默认所以有效的 index是 0~8对应 x为 -1 ~ 7。但 case值通常是合理的整数所以应为 0~7​ 以及可能的 -1。结合跳转表结构推断case值为0 (index1), 1(index2), 2(index3), 3(index4), 4(index5), 5(index6), 6(index7)。index0和 index8对应默认分支。B. 多标号情况跳转表第6、7行相同 (.L7)第3、10行相同 (.L5)。因此case 2和 case 6共享同一个代码块 (.L7)。case 0和 case 4? 等等需要映射index1对应 x0跳 .L5index5对应 x4跳 .L2(默认)不对。index9对应 x8超范围。仔细看.L40是 .L9(可能对应某个case) .L48 * 8是 .L5。所以 index0(x-1) 和 index8(x7) 都跳 .L5不.L4表第1项是 .L9。所以多标号是case -1和 case 7共享代码块 .L9​ (如果 .L40对应 x-1)但更合理的推断是 case值为 0-6 其中 case 1和 case 5共享代码块 .L5 case 3和 case 4共享代码块 .L7。练习题3.31 图3-24已知汇编代码逻辑和跳转表。逆向推导1计算索引a在 %rdi。指令 subq $50, %rdi index a - 50。2边界检查cmpq $6, %rdi; ja .L2。索引范围 0~6 有效对应原 a为 50~56。3分析跳转表​ (7项).L8:.quad.L3 # index0(a50).quad.L2 # index1(a51)-default.quad.L5 # index2(a52).quad.L6 # index3(a53).quad.L7 # index4(a54).quad.L7 # index5(a55)-与54相同.quad.L5 # index6(a56)-与52相同4映射代码块.L3(a50): movq %rdx, %rdi; jmp .L4 此块修改了参数 c(%rdx)且无 break(jmp)会 fall through。.L5(a52, 56): movq %rdx, %rax; xorq $15, %rax; movq %rax, %rdx; 计算 c ^ 15并赋回 c? 不看后面 movq %rax, (%r9)是赋值给 *dest。所以这是计算 val。.L6(a53): movq %rdx, %rax; movq %rax, (%r9); ret 计算 val c。.L7(a54, 55): movq $2, %rax; … 计算 val 2。.L2(default): movq $0, %rax; … val 0。voidswitcher(longa,longb,longc,long*dest){longval;switch(a){case50:/* Case A */cb;/* 对应 movq %rsi, %rdx *//* Fall through */case52:/* Case B (与56共享) */valc^15;/* 对应 xorq $15, %rax */break;case53:/* Case C */case54:/* Case D (与55共享) */val2;/* 对应 movq $2, %rax */break;case51:/* Case E (默认项之一) */val0;break;default:val0;}*destval;}总结栏本节深入剖析了 switch语句最高效的实现方式——跳转表揭示了编译器将高级语言多路分支映射到底层硬件的精巧过程。核心是数组跳转编译器将 switch编译为“计算偏移索引→检查边界→间接跳转”的固定模式。跳转表就是一个地址数组间接跳转 (jmp*) 是执行的关键。巧妙的范围平移通过将case值减去最小值化为从0开始的连续索引使得跳转表访问成为可能。同时利用无符号比较一举两得地处理了索引下溢原值太小和上溢原值太大的情况。跳转表编码语义跳转表的内容直接编码了 switch的语义1连续 case连续的表项。2重复 case多个表项指向同一地址。3缺失 case对应表项指向默认块地址。4fall through前一个 case的代码块末尾没有跳出指令。逆向工程心法给定汇编首先找到索引计算sub指令和边界检查cmp/ja这决定了case的原始值范围。然后分析跳转表每个表项对应一个 case值。最后将各个目标代码块.Lx与case行为匹配。练习题3.31是此方法的完整演练。最终启示switch的跳转表实现是编译器优化的典范它通过引入少量静态数据跳转表来换取稳定的、快速的执行时间。理解这一点对于编写高效代码和进行底层调试至关重要。同时这也展示了数据跳转表如何有效地控制程序流。

相关文章:

(学习笔记)3.6 控制(3.6.8 switch语句)

文章目录线索栏笔记栏1.跳转表:高效多重分支的核心2. 编译实现通用步骤(以图3-22/3-23示例 switch_eg为例)3. 跳转表数据结构(汇编片段)4. GCC对C语言的扩展(计算goto)5. 练习题练习题3.30练习题…...

Qwen-Image开源模型教程:RTX4090D镜像支持Qwen-VL与Whisper多模态对齐

Qwen-Image开源模型教程:RTX4090D镜像支持Qwen-VL与Whisper多模态对齐 1. 环境准备与快速部署 1.1 硬件与系统要求 在开始之前,请确保您的设备满足以下基本要求: GPU型号:RTX 4090D(24GB显存)操作系统&…...

Agentic AI技术挑战的人工智能治理,提示工程架构师如何参与?

当AI学会自己做决定:Agentic AI的治理挑战与提示工程架构师的破局之路关键词:Agentic AI、人工智能治理、提示工程、自主智能体、价值对齐、风险防控、决策透明性 摘要:Agentic AI(自主智能体)的崛起,标志着…...

Spring容器启动流程解析

lookup注解源码分析 核心功能概述lookup注解用于解决原型(prototype)作用域Bean在单例Bean中的依赖注入问题,每次调用带有lookup注解的方法时都会从Spring容器中获取一个新的Bean实例。实现原理Spring在创建Bean的过程中会检查方法是否标注Lookup。若存在该注解&…...

1985-2026.3人工智能专利数据库

参考《数量经济技术经济研究》乔刚(2025)关于人工智能专利识别与筛选的研究思路,本文依据国家知识产权局办公室印发的《关键数字技术专利分类体系(2023)》所界定的人工智能专利国际专利分类号(IPC&#xff…...

2001-2025年全国各省、市、县最低工资标准数据

数据简介 最低工资标准数据库是基于中国各省市人力资源和社会保障厅各年度所公布的最低工资标准文件整理而成的,反映我国各省市最低工资标准情况的专业数据库。 最低工资标准是劳动者在法定工作时间内提供正常劳动的前提下,企业用人单位依法支付给劳动…...

Spring Aop底层源码实现(一)

动态代理基础与实现 动态代理的作用在不修改目标类的前提下,为目标类的方法添加额外逻辑。两种代理方式:JDK动态代理与CGLIB代理JDK动态代理:基于接口,使用java.lang.reflect.Proxy。CGLIB代理:基于继承,适…...

智能排班系统在不同行业中的应用实践与价值分析

在现代企业管理体系中,排班管理是运营管理的重要组成部分。 无论是零售业、服务业还是制造业,科学合理的排班都是确保企业高效运营的基础。 然而,传统的手动排班方式由于效率低下、容易出错等问题,已经难以满足现代企业的管理需求…...

Qwen3智能字幕对齐系统Ubuntu20.04部署教程:从环境配置到一键启动

Qwen3智能字幕对齐系统Ubuntu20.04部署教程:从环境配置到一键启动 你是不是也遇到过这样的烦恼?下载了一部精彩的海外剧集或者技术分享视频,但字幕文件总是对不上口型,要么快几秒,要么慢半拍,手动调整起来…...

m3u8live.cn 在线M3U8播放器,免安装高效验流排错

在直播、点播、Web视频、在线教育、IPTV等流媒体业务常态化的今天,HLS(HTTP Live Streaming)协议已成为跨平台流媒体传输的主流选择,而M3U8作为HLS协议的核心载体,其地址有效性、播放稳定性的快速验证,成为…...

leetcode 1437. 是否所有 1 都至少相隔 k 个元素-耗时100

Problem: 1437. 是否所有 1 都至少相隔 k 个元素 耗时100%,统计连续0的个数,若存在11返回false, 若k0返回false,若前后是10则频次1,若前后是00则频次累加cnt,若前后是01则计算最小值 Code class Solution …...

Wan2.1视频生成新手必看:常见问题解答与最佳实践指南

Wan2.1视频生成新手必看:常见问题解答与最佳实践指南 你是不是也曾经对AI视频生成充满好奇,但一看到复杂的参数和不确定的结果就望而却步?或者已经尝试过Wan2.1,但生成的视频总是不尽如人意,不是画面模糊就是内容跑偏…...

移动端录音APP集成FRCRN SDK效果演示:前后录音质感飞跃

移动端录音APP集成FRCRN SDK效果演示:前后录音质感飞跃 最近在折腾一个安卓录音应用的原型,核心目标很简单:让手机录出来的声音,能干净得像在专业录音棚里处理过一样。我们都知道,手机录音最大的敌人就是环境噪音——…...

如何通过淘宝API接口根据商品ID获取商品评论

淘宝开放平台(Taobao Open Platform)为开发者提供了丰富的API接口,允许开发者通过商品ID获取商品评论数据。这在电商分析、用户反馈收集等场景中非常有用。本文将逐步介绍如何实现这一功能,包括注册平台、调用API、处理响应等。整…...

Nanbeige 4.1-3B快速上手:树莓派5+USB GPU部署轻量像素终端可行性实测

Nanbeige 4.1-3B快速上手:树莓派5USB GPU部署轻量像素终端可行性实测 1. 项目背景与目标 Nanbeige 4.1-3B是一款轻量级的大语言模型,其独特的像素游戏风格对话界面让AI交互变得生动有趣。本文将探索如何在树莓派5这样的小型设备上,通过外接…...

美食点评平台测试用例

本文档基于项目需求,针对基于SpringBoot搭建的美食点评平台编写了100个测试用例(包含功能、安全、性能等方面)。测试用例覆盖了用户登录、商户查询、优惠券秒杀、用户关注/点赞、收藏等核心功能模块,并运用等价类划分边界值分析、…...

AI绘画新选择:Z-Image-Turbo镜像一键部署与使用指南

AI绘画新选择:Z-Image-Turbo镜像一键部署与使用指南 1. 镜像核心优势与适用场景 Z-Image-Turbo是阿里达摩院推出的高性能文生图模型,基于DiT(Diffusion Transformer)架构开发。本镜像已预置完整的32.88GB模型权重文件&#xff0…...

【从零开始实现STM32步进电机驱动】(二)搭建硬件环境

1. 硬件准备全程自费无广,你买任何家的产品都可以,代码完全通用,只用到几个IO引脚而已。野火STM32F103C8T6核心板双USB野火小智DAP下载器模块42电机A4988电机驱动板A4988扩展板直流可调电压源洞洞板杜邦线2. 连接PA4→DIRPA5→STEPPA6→EN要点…...

ZigBee开发环境实战 -- IAR for 8051 10.30.1 安装与避坑指南

1. 为什么选择IAR for 8051开发ZigBee? 说到ZigBee开发环境搭建,很多新手都会纠结工具链的选择。我当年从STM32转向ZigBee开发时,花了整整两周时间对比各种方案,最终发现IAR for 8051 10.30.1这个版本在稳定性和兼容性上表现最好。…...

ESP32编码器驱动实战:SIQ-02FVS3硬件滤波与中断优化(附完整代码)

ESP32编码器驱动实战:SIQ-02FVS3硬件滤波与中断优化(附完整代码) 在嵌入式开发中,旋转编码器作为一种常见的人机交互输入设备,其稳定性和精确度直接影响用户体验。SIQ-02FVS3作为一款迷你型编码器,虽然体积…...

开箱即用!Qwen3-ForcedAligner镜像体验:无需配置,直接开启音文对齐之旅

开箱即用!Qwen3-ForcedAligner镜像体验:无需配置,直接开启音文对齐之旅 1. 音文对齐技术简介 你有没有遇到过这样的场景:手里有一段录音和对应的文字稿,但需要精确知道每个词在音频中出现的时间点?传统方…...

从大彩换到迪文串口屏,DMG80480C070_03WTC上手避坑全记录

从大彩到迪文串口屏:DMG80480C070_03WTC实战迁移指南 当项目预算收紧时,硬件选型往往成为降本的关键突破口。去年我们团队在工业HMI项目上遇到了这样的转折点——原本使用的大彩串口屏由于成本上涨,使得整机BOM成本超出预期15%。经过多方比对…...

mmdetection实战:5个隐藏工具让你的目标检测效率翻倍(附避坑指南)

mmdetection实战:5个隐藏工具让你的目标检测效率翻倍(附避坑指南) 当你已经熟悉了mmdetection的基础训练和测试流程后,是否感觉效率提升遇到了瓶颈?实际上,这个强大的目标检测框架还隐藏着一批鲜为人知但极…...

从 99.8% 到 14.9%!PaperZZ 降重 / 降 AIGC 双引擎:适配知网 / 维普的学术文本净化方案

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 降重/降AIGChttps://www.paperzz.cc/weight 当论文检测报告上的 AIGC 疑似度与重复率双双亮起红灯,当知网 2.13 严苛版、维普 2.26 版的检测规则让修改无从下手,毕业生往往…...

RVC WebUI变声器实战:从AI翻唱到直播实时变声的完整指南

RVC WebUI变声器实战:从AI翻唱到直播实时变声的完整指南 1. 认识RVC WebUI:声音转换的新纪元 在数字内容创作领域,声音转换技术正经历着革命性的变化。RVC WebUI(Retrieval-based Voice Conversion WebUI)作为一款基于…...

OWL ADVENTURE模型原理浅析:从卷积神经网络到视觉Transformer演进

OWL ADVENTURE模型原理浅析:从卷积神经网络到视觉Transformer演进 最近在星图GPU平台上部署和测试一些视觉模型时,我经常被问到:“这个OWL ADVENTURE模型到底用了什么技术?和传统的卷积神经网络有什么区别?” 这确实是…...

LUT(Look-Up-Table)

目录 1、1D LUT 2、3D LUT 3、手动创建LUT 3.1 准备调色素材‌ 3.2 ‌进行创意调色‌ 3.3 ‌导出为LUT文件‌ 3.4 测试与优化‌ 4、AI LUT 4.1 使用AI调色App 4.2 使用开源项目 4.3 训练专属AI模型 4.3.1 使用预训练AI模型 LUT提取工具 4.3.2 端到端 5、其他工作…...

YOLOv11实战:手把手教你用DBB改进C3k2块(附完整代码)

YOLOv11实战:DBB模块深度改造C3k2块的完整指南 1. 理解DBB模块的核心价值 在计算机视觉领域,Diverse Branch Block(DBB)作为卷积结构的创新设计,正在重新定义特征提取的方式。这种多分支结构的核心思想源于对神经网络特…...

别只抄代码!用SWUST OJ这两道C语言题,真正搞懂printf和数据类型转换

从SWUST OJ两道C语言题看printf与类型转换的深层逻辑 在编程学习的起步阶段,很多同学容易陷入"只求结果正确"的误区,却忽视了语言特性背后的设计哲学。SWUST OJ的1283和1284这两道看似简单的题目,恰恰是理解C语言输出机制和数据类型…...

3月20日紧急修复|Spring AI双漏洞CVE-2026-22730/22729实战防护方案

文章目录前言这俩漏洞到底是个啥"鬼东西"CVE-2026-22730:SQL注入的"借尸还魂"CVE-2026-22729:JSONPath的"暗度陈仓"快看看你是不是"中枪"了受影响的版本范围紧急修复:三步走战略第一步:升…...