c++ goto & label 机制汇编探索

深入虚幻引擎:调试Sequence节点字节码生成与KCST_PushState原理 在游戏开发与实时交互应用领域,异步编程和状态管理是核心技术挑战。理解底层执行机制,尤其是字节码生成与虚拟机工作原理,对于调试复杂逻辑和性能优化至关重要。字节码作为高级脚本语言编译后的中间表示,直接控制程序的执行流和状态切换。其核心价值在于提供了一种跨平台、高效且可调试的运行时环境,广泛应用于游戏脚本、可视化编程工具等场景。以虚幻引擎蓝图系统为例,KCST_PushState和Goto等操作码是实现协程式异步操作的关键,它们通过状态栈管理执行上下文,确保延迟、事件等异步逻辑的正确调度。掌握这些底层指令的生成逻 阅读详情

本文将从汇编的层面来探索 goto 机制,提起 goto 可能会引起程序员的恐惧,但面对恐惧才能战胜恐惧,以致可以利用未曾尝试的点。

arm gcc 实测

void fun(){
    label:
        printf("\n");
        goto label;
}
  • 使用 gcc -E 即只走预处理看看:
// 只多了一些头文件的预处理
void fun(){
    label:
        printf("\n");
        goto label;
}
  • 使用 gcc -S 即走到编译这一步看看:
fun():
        push    {fp, lr}
        add     fp, sp, #4
.L4:
        mov     r0, #10
        bl      putchar
        b       .L4

可以看到 goto 的 label 变成了汇编里的 label (.L4),大体逻辑一致。

解释一下 “\n” 去哪了:正是指令当中的 #10,用 ASCII 码可查出对应的是换行符

0000 1010100ALF␊换行键
  • 使用 gcc -c 即走到汇编(这里指的是动作,是把汇编文件进行汇编解释)这一步看看:
                     ltmp0:
0000000000000000         stp        x29, x30, [sp, #-0x10]!        ; DATA XREF=ltmp2
0000000000000004         mov        x29, sp

                     loc_8:
0000000000000008         adrp       x0, #0x0                       ; 0x18@PAGE, CODE XREF=ltmp0+20
000000000000000c         add        x0, x0, #0x18                  ; 0x18@PAGEOFF
0000000000000010         bl         _printf                        ; _printf
0000000000000014         b          loc_8


        ; Section __cstring
        ; Range: [0x18; 0x1a[ (2 bytes)
        ; File offset : [488; 490[ (2 bytes)
        ; Flags: 0x2
        ;   S_CSTRING_LITERALS

                     l_.str:
0000000000000018         db         "\n", 0

由于已经是二进制的形式了,所以用的是反汇编来看。这里文件格式是 MachO 格式,是苹果所用的,不同平台可能会有些许不同。

同样也是通过 loc_8 这个汇编的 label 来实现,但这个 label 在二进制中长什么样呢?

先看下 b 汇编指令的模样:

image.png

然后在二进制里找 __TEXT,__text 段里的这条指令,在 arm 上是 4 个字节一条指令,注意不是在上面代码的 0x14 来找,因为反汇编显示的是相对于 __TEXT,__text 段的偏移,MachO 文件前面还有一大堆记录文件属性的东西。

二进制中长这样: FDFFFF17
在 iOS 是小端,所以读为 17FFFFFD
则 imm26 = 0x3FFFFFD
这个 imm26 在 b 指令是作为偏移的计算,需要再左移两位,得到 0xFFFFFF4
而且是有符号的,首位为1,前面都是 0xF 不用管,
看最后的 0x4 即 0b0100 (先忽略符号位1),现在是补码,等于反码 0b0011 加 1,则原码为 0b1100,
加上符号位,转换为十进制即 -12,也即 -0xC,
即当前PC地址要减去 0xC,正好就是汇编的 label 即 loc_8 的开头地址

由此可得:汇编的 label 其实就是基于 PC 偏移寻址。当然不同平台可能不一样,x86 里绝对寻址也是可行的。

一点没用的性能的分析:b 指令的偏移范围为 +/-128MB,跳转体最好不要写超过这个范围(虽然应该不会有人写这么大范围的),即 128 * 1024 * 1024 / 4 条指令数,超出则会增加指令辅助跳转。

NOTE

没必要过分妖魔化 goto,在本文的例子中,汇编指令与下面这种写法是一样的:

void fun(){
    while(1)
        printf("\n");
}

在 linux、cpython 等源码中都可以看到 goto 的身影。

另外提示一个用法:goto 不能跨越函数来写,只能跳转到自己函数内的 label。在 C 中可以使用 setjmp 和 longjmp 来跨函数跳转。

label应用 symbian c++label应用 立即下载

相关推荐

电源设计之路-Buck电源环路设计(Type IIIA&Type IIIB)

在对Buck 环路补偿Type II拓扑进行仿真测试后,对瞬态波形以及伯德图已经有感官上的认知;然后再进一步对Type IIIA & IIIB进一步的学习;进一步了解Cout电容量和ESR对环路补偿的影响;认识到一个电源,不是参考Datasheet上的参数进行选值就行;更需要根据实际情况,功率电感值、输出电容值以及不同电容会有不一样的ESR,这些都会对环路参数产生一定的影响

2503_92839756的博客 752

C++ 标签

1.先来说下标签(label)。如下一段代码: #include using namespace std; int main() { http://www.youkuaiyun.com cout<<"hello world!"<<endl; return 0; } 这段代码是否可以编译通过呢?答案是可以。双斜杠之后的www.youkuaiyun.com被当做注释了,

Zender 6486

StarRocks慢查询排查实战:从Query Plan到Profile的保姆级调优指南

本文提供StarRocks慢查询排查的实战指南,从Query Plan解析到Profile诊断,详细讲解如何识别执行计划中的危险信号和优化关键指标。通过物化视图优化、分布式执行调整和资源管控方案,帮助DBA快速定位并解决查询性能问题,提升数据库效率。

weixin_42568801的博客 379

C++内存分配的三种方式

不同的内存分配方式,有不同的内存调度机制。C++ 语言的三种内存分配方式分别是:静态存储区分配、栈内存分配和堆内存分配。 静态存储区分配 静态分配方式下的内存在程序编译的时候就已经分配好了且存在于程序的整个运行过程。例如 static 变量,其生命周期随程序的结束而结束,而非像一般变量随函数或作用域的结束而结束。 除了 static 变量,还有一种全局对象 static object,也可以存放在静态存储区。 栈内存分配 栈内存分配方式下的内存是存在于某作用域的一块空间。例如调用某个函数时,函数内局部变量的

qq_35120460的博客 2108

DESeq2实战:利用LRT检验解析时间序列基因表达动态变化

本文详细介绍了如何使用DESeq2中的LRT检验分析时间序列基因表达数据,揭示基因表达动态变化模式。通过构建完整模型与简化模型比较,LRT检验能有效识别处理效应随时间变化的基因,适用于发育过程、疾病进展等研究。文章提供了从数据准备、模型构建到结果可视化的完整实战指南,并分享了高级技巧与常见问题排查方法。

weixin_29062671的博客 439

基于知识图谱的智能工作流引擎

随着大数据和人工智能技术的快速发展,企业和组织对数据的依赖程度日益增加。为了更好地管理和利用这些数据,知识图谱逐渐成为一种重要的工具。知识图谱不仅能够以结构化的方式表示复杂的知识,而且能够通过推理和查询提供深层次的信息。然而,如何将知识图谱应用于实际业务场景中,尤其是如何构建智能工作流引擎,仍然是一个具有挑战性的问题。智能工作流引擎是一种能够自动化执行复杂业务流程的系统,它可以通过对业务规则和数据的分析,自动生成和优化工作流,从而提高工作效率和准确性。

AI天才研究院 1870

Label的用法

发现UILabel好像没有点击事件之类的,今天算是搜到了一点点我想要的,还有要设置那个下划线之类的,还没有去查找呢,慢慢来吧 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIButton *btn; @property (weak, nonatomi

趁着年轻,多学学 4145

APP爬虫:Airtest的使用和爬取实战详解

Airtest是一个跨平台的自动化测试工具,主要用于移动应用和游戏的UI自动化测试。它支持图像识别、触摸操作、文本输入等功能,能够模拟真实用户的操作行为。此外,Airtest还具备强大的日志记录和报告生成功能,方便开发者进行调试和分析。图像识别:通过截图匹配元素,无需依赖 UI 层次结构。跨平台支持:支持 Android、iOS 和 Windows 应用。简单易用:提供 IDE 和脚本录制功能,降低使用门槛。

数据知道的博客 9619

g++编译goto语句出现:[error:jump to label XXX]

1,错误信息 TsMultiCast.cpp:51: error: jump to label ‘_FAIL_LABEL1’ TsMultiCast.cpp:34: error:   from here TsMultiCast.cpp:37: error:   crosses initialization of ‘int iOptVal’ 2,原因 g++下的goto语句

wusoule的专栏 1万+

基于YOLO26深度学习框架的文档表格识别系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的文档表格识别系统实现方法。系统采用YOLO26网络架构,通过数据预处理、模型训练、检测推理和表格分析四个模块实现高效表格识别。研究详细阐述了数据归一化、增强等技术处理,以及采用迁移学习策略优化模型训练过程。实验表明,该系统能有效识别多种表格结构并生成结构化数据,为文档自动化处理提供了可靠解决方案。

一键难忘的博客 972

HBase学习二:RegionServer详解

RegionServer是HBase系统中最核心的组件,主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系,包含多个各司其职的核心模块:HLog、MemStore、HFile以及BlockCache。一个RegionServer由一个(或多个)HLog、一个BlockCache以及多个Region组成。其中,HLog用来保证数据写入的可靠性;BlockCache可以将数据块缓存在内存中以提升数据读取性能;

qwerty1372431588的博客 747

arcgis 中label feature太长换行_c++ goto &amp; label 机制汇编探索

本文将从汇编的层面来探索 goto 机制,提起 goto 可能会引起程序员的恐惧,但面对恐惧才能战胜恐惧,以致可以利用未曾尝试的点。arm gcc 实测void fun(){ label: printf("n"); goto label; } 使用 gcc -E 即只走预处理看看:// 只多了一些头文件的预处理 void fun(){ label: ...

weixin_33849758的博客 137

地统计插值学习心得(一)

(创建地统计图层工具用于根据现有的地统计图层或者地统计模型来创建包含新要素数据集的地统计图层,也就是使用构建好的地统计模型用到新的数据集中)这表明,远离极值的区域预测不受极值的影响,并且还表明,包括极值会导致钼元素浓度高的区域周围的预测明显变高。通常,我们使用同一个数据集进行建模和预测,但是在实际插值过程中,这两步的数据可以是不同的,这就是处理极值的诀窍。如果你的数据集有无法忽略的极值时(比如这些钼元素浓度),一种常见的方法是首先显式移除极值进行建模,然后在预测中使用整个数据集(包括极值)。

JData_Engineer的博客 286

linux命令行中的goto_c++ goto &amp; label 机制汇编探索

本文将从汇编的层面来探索 goto 机制,提起 goto 可能会引起程序员的恐惧,但面对恐惧才能战胜恐惧,以致可以利用未曾尝试的点。arm gcc 实测void fun(){ label: printf("\n"); goto label;}使用 gcc -E 即只走预处理看看:// 只多了一些头文件的预处理void fun(){ label: ...

weixin_39897505的博客 250

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++之goto陈述

关键字 goto用于控制程式执行的顺序,使程式直接跳到指定标签(lable) 的地方继续执行。此例按标签的顺序,在每个标签下方都用大括弧围住一个程式区块,概念满简单的,上面利用标签顺序执行,下面我们另举一个例子,使。标签可以是任意的识别字,后面接一个冒号。到了指定标签,就会执行标签下方的程式区块。编译后执行,结果如下。编译后执行,结果如下。

hdtmd的博客 289

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

QtC++与QLabel详解

QLabel 类是Qt中的一个用于显示文本或图像的控件类,通常用于用户界面中以提供静态文本或图片显示的功能

LuXiaoXin1999的博客 817

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

goto语句_关于结构化并发的笔记 —— Go 语言中有害的声明语句

前言每一个并发的 API 背后的代码都需要允许并发运行的,以下是使用不同 API 的例子:go myfunc(); // Golang pthread_create(&amp;thread_id, NULL, &amp;myfunc); /* C with POSIX threads */ spawn(modulename, my...

weixin_39647180的博客 1060

汇编语言--标签(label)

在汇编语言中,标签(label)是一个用于标识代码位置的符号以下是一个简单的汇编代码示例,展示了如何使用标签和跳转指令:start:;初始化寄存器mov r0, #0loop:;执行一些操作;检查循环条件cmp r0, r1bne loopend:;循环结束后执行的代码;...```在这个示例中,`start`、`loop`和`end`是标签。程序从`start`标签开始执行,然后顺序执行到`loop`标签。

MHD0815的博客 3594

为什么不给用goto_如果现在只能用汇编和Goto编程......

上世纪五六十年代,高级语言还没普及,很多人用汇编写程序,汇编代码运行效率高,但是有个致命的缺点:不容易看懂,维护困难。程序设计是少数聪明人干的事情,他们智力超群, 写代码也不讲什么规则,可以随意使用灵活而又强大的Goto,写出只有自己能懂的代码。但是到了六十年代中后期,事情就慢慢不对了,计算机的计算能力提升速度远远超过程序员,软件规模和数量随之急剧上升, 出现了一堆问题:项目预算超支,项...

weixin_39686192的博客 318

C++ goto 编译出错问题

C++ goto 编译出错 error: jump to label ‘discard_packet’ [-fpermissive] ××××××× goto discard_packet; ×××××××× crosses initialization of ‘cv::Mat ppp’

kunyXu的博客 2099

error: jump to label ‘xxxxx’ [-fpermissive] linux下C++编译错误

linux中C++中使用goto语句可以跳到指定的函数末端,在使用g++编译时,要注意在goto语句出现之后是不允许出现新申明的变量,所以需要申明变量需要放在所有goto语句之前。而windows的VisutalStudio编译无此问题 ...

肥尾鱼(嵌入式) 544

C++ goto语句详解

在我看来,C++中让人又爱又恨的,莫过于goto语句了,它功能强大,简答易懂,但是使用多了,容易造成程序诸多问题,今天就带大家来了解一下吧。 目录 一、概念 二、两种观点 三、使用建议 四、个人对待goto观点 五、应用举例 1、代码 2、运行结果 一、概念 goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某...

水亦心的博客 4万+

c++ goto语句

这是一种不提倡的做法,它会使得程序的执行循序变得混乱,cpu需要不停地进行跳转,效率比较低,而且goto语句任何程序可以修改,程序中如果出现多处相同的标签会使得程序逻辑变得复杂,因此,在开发中时慎用goto语句。如果程序中出现上述情况,可以在标签后面添加一个可执行的语句就行了,以解决编译错误,比如添加一行打印输出语句。如果添加goto语句后,改变程序的执行顺序,例如运行完cout...

Restless Breeze 1万+

前端学习02

2.儿子选择器 两个选择器之间大于号隔开 查找前面选择器获取到的标签内部第一层级符合大于号后面选择器要求的标签。1.后代选择器: 两个选择器之间空格隔开 查找前面选择器获取到的标签内部所有符合空格后面选择器要求的标签。form表单在朝后端发送数据的时候 标签必须要有name 否则不会发送该标签的值。所有的标签除了有自己默认的属性之外 还可以拥有自定义的任意属性。当多个选择器查找到相同的标签修改不同的样式 那么标签该听谁的。当多个选择器查找到的标签需要调整相同的样式 那么可以合并。...

m0_72611192的博客 344

反汇编技术

当jz与jnz的目地地址相同时,此时相当于jmp,但是IDA会将jnz后面的指令(实际上不会执行的指令)进行反汇编,这个时候如果加上比如call(E8),jmp(E9)等字节指令,那么势必会导致反汇编出现问题。当条件一定满足时说明这条判断语句指令后面的代码一定处于可执行状态,那么false对应的指令一定不会执行,这个时候倘若出现反汇编错误就可以对false对应的指令进行修改。由于SEH存放在栈中,最后放入的函数最先进行调用,所以可以通过压栈实现加入对应的函数,通过FS:[0]寄存器来进行寻址。

qq_67181251的博客 893

使用goto语句和Linux命令实现关机整蛊小程序

温馨提示:记得提前跟同学打个招呼,免得同学正在写着作业或者有什么重要文件没保存,关机导致丢失,那就尴尬了😅把代码编写好后,我们不可能直接把源码发给同学吧,这样就太没意思!我们先把代码编写好,然后编译运行之后,就会生成一个.exe可执行文件,将该文件发送即可!🤪效果显著🤣。

QZW的博客 2374
上一篇: 量子比特的构造
下一篇: MacOS 链接特性:Two-Level Namespace
流左沙
博客等级 码龄11年 46粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值