"You can specify that an imported variable be mutable—that is, read-write— by applying the __block storage type modifier."文档已经清楚说明了它的作用。反汇编就是要看个究竟。

__block类型有着它自己的storage,是blocks编程的一部分,今天先来看一下它如何做storage的。

我们定义如下:

NSString* c = [@"ab" stringByAppendingString:@"c"];
__block NSInteger bi = ;
__block NSString* bc = c;

得到反汇编代码:

0x10699054a <+>:  movq   0x14bf7(%rip), %rsi       ; "stringByAppendingString:"
0x106990551 <+>: leaq 0x13da8(%rip), %rdi ; @"ab"
0x106990558 <+>: leaq 0x13dc1(%rip), %rdx ; @"'c'"
0x10699055f <+>: movq -0xf0(%rbp), %rcx
0x106990566 <+>: movq %rax, -0xf8(%rbp)
0x10699056d <+>: callq *%rcx
0x10699056f <+>: movq %rax, -0x28(%rbp)
-> 0x106990573 <+>: movq $0x0, -0x48(%rbp)
0x10699057b <+>: leaq -0x48(%rbp), %rax
0x10699057f <+>: movq %rax, -0x40(%rbp)
0x106990583 <+>: movl $0x20000000, -0x38(%rbp)
0x10699058a <+>: movl $0x20, -0x34(%rbp)
0x106990591 <+>: movq $0x0, -0x30(%rbp)
0x106990599 <+>: movq $0x0, -0x78(%rbp)
0x1069905a1 <+>: leaq -0x78(%rbp), %rax
0x1069905a5 <+>: movq %rax, -0x70(%rbp)
0x1069905a9 <+>: movl $0x52000000, -0x68(%rbp)
0x1069905b0 <+>: movl $0x30, -0x64(%rbp)
0x1069905b7 <+>: leaq -0x21e(%rip), %rax ; __Block_byref_object_copy_ at ViewController.mm:74
0x1069905be <+>: movq %rax, -0x60(%rbp)
0x1069905c2 <+>: leaq -0x1e9(%rip), %rax ; __Block_byref_object_dispose_ at ViewController.mm:74
0x1069905c9 <+>: movq %rax, -0x58(%rbp)
0x1069905cd <+>: movq -0x28(%rbp), %rax
0x1069905d1 <+>: movq %rax, -0x50(%rbp)

很容易就看到两处构造对像的地方,没有错就是__block NSInteger bi和__block NSString* bc。这样就可以写出反c++伪代码:

__Block_byref_object_copy_的汇编简单不贴了,_Block_object_assign就是根据最后一个标志参数选择执行_Block_retain,_Block_assign。此方法是被Block定义(就是NSBlock的一种),在构造私有调用栈时调用的。
另一个__Block_byref_object_dispose_就是__block在析构里调用的。
__block storage的地址被压入NSBlock的私有调用栈,地址不能改变,但是__block storage不在私有栈中,所以被它包装起来的真正的变量可以被修改。
例如NSString*, int在NSBlock的私有调用栈中分别是NSString* const, int count, 而__block NSString*, __block int则是__block<NSString*>* const, __block<int>* const。 上一篇介绍了《逆向分析objc,所有类的信息都能在动态调试中获取》。 最后,多谢大家观看本篇文章。下一篇将分析block的反汇编,还会看到__block变量是如何被block使用的。 更正修改:20150116
    :伪代码中少了一个成员,这个成员作用是__block变量从stack-based中脱离后,真实的指向(,或叫做重定向)。

反汇编objc分析__block的更多相关文章

  1. C++反汇编代码分析--函数调用

    推荐阅读: C++反汇编代码分析–函数调用 C++反汇编代码分析–循环结构 C++反汇编代码分析–偷调函数 走进内存,走进汇编指令来看C/C++指针 代码如下: #include "stdl ...

  2. C++反汇编代码分析–函数调用

    转载:http://shitouer.cn/2010/06/method-called/ 代码如下:#include “stdlib.h” int sum(int a,int b,int m,int ...

  3. 自制反汇编逆向分析工具 与hopper逆向输出对比

    经过一个阶段5次迭代之后,本逆向分析工具功能基本成形.工具的基本功能介绍请参看前面的posts. 现在就和hopper的逆向函数伪代码的功能对比一下效果.在这里并非定胜劣,因为差异可以拿来对比参照,通 ...

  4. objc反汇编分析__strong和__weak

    如题所说反汇编看__strong和__weak的真实样子,代码列举自然多,篇幅长不利于阅读,我就先搬出结论,后面是分析. 在NON-ARC环境,__strong和__weak不起作用.相反在ARC环境 ...

  5. 反汇编看c++引用

    继续反汇编系列,本次使用vc2008在x86体系下分析c++中的引用. 定义一个引用类型和将一个变量转换成引用类型一样吗? 引用比指针安全,真的是这样吗,对引用不理解的话比指针还危险. 为什么要用常量 ...

  6. 逆向分析objc,所有类的信息都能在动态调试中获取。

    因为objc是动态绑定的,程序运行时必须知道如何绑定,依靠的就是类描述.只要知道类描述是如何组织的就可以获取一切有用的信息.不知道是幸运还是不幸,这些信息全部都在运行的程序中.即使没有IDA这样的工具 ...

  7. objc反汇编分析,block函数块为何物?

    上一篇向大家介绍了__block变量的反汇编和它的伪代码,本篇函数块block,通常定义成原型(^){},它在反汇编中是什么东西. 我们先定义将要反汇编的例子,为减少篇幅例子采用non-arc环境. ...

  8. 反汇编分析NSString,你印象中的NSString是这样吗

    我们先来定义三个NSString -(void) testNSString { NSString* a = @"abc"; NSString* b = [NSString stri ...

  9. mingw32 exception在sjlj与dwarf差别-反汇编分析

    sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现.sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用d ...

随机推荐

  1. VS2017-Linux项目-使用第三方库如何配置

    1.虚拟机Ubuntu 16.04,安装第三方库,perftools::tcmalloc. 2.Win10下vs2017创建linux项目. 3.项目>>属性>>VC++ 目录 ...

  2. moloch1.8.0简单操作手册

    moloch1.8.0简单操作手册 Sessions 页面:Sessions主要通过非常简单的查询语言来构建表达式追溯数据流量,以便分析. SPIView 页面: SPIGraph页面:SPIGrap ...

  3. 实践开发:vue框架重点知识分析

    一个VUE项目的主树: assets文件夹是放静态资源: components是放组件: router是定义路由相关的配置; view视图: app.vue是一个应用主组件: main.js是入口文件 ...

  4. 还在重复写空指针检查代码?考虑使用 Optional 吧!

    一.前言 如果要给 Java 所有异常弄个榜单,我会选择将 NullPointerException 放在榜首.这个异常潜伏在代码中,就像个遥控炸弹,不知道什么时候这个按钮会被突然按下(传入 null ...

  5. node项目发布+域名及其二级域名配置+nginx反向代理+pm2

    学习node的时候也写了一些demo.但是只是限于本地测试,从来没有发布.今天尝试发布项目. 需要准备的东西 node 项目:为了突出重点,说明主要问题.我只是拿express 写了很简单的demo. ...

  6. 基于 HTML5 + Canvas 实现的 PID 可视化系统

    前言 随着工业物联网和互联网技术的普及和发展,人工填料的方式已经逐渐被机械设备取代.工业厂商减小误操作.提升设备安全以及追求高效率等制造特点对设备的要求愈加高标准.严要求.同时机械生产以后还需遵从整个 ...

  7. K8s 还是 k3s?This is a question

    本文来自:Rancher Labs 自k3s问世以来,社区里有许多小伙伴都问过这样的问题"除了中间的数字之外,k3s和K8s的区别在哪里?","在两者之间应该如何选择?& ...

  8. Java自动化测试框架-06 - 来给你的测试报告化个妆整个形 - (下)(详细教程)

    简介 经过上一次的化妆和整形,有客户提出需求能不能将那个普通会员的套餐再升级一下,再漂亮一点.所以这次咱们就来看看从哪里下刀可以使它变得再漂亮一点点. 上一篇文章修改了一些基本的ReportNG信息, ...

  9. 学习笔记28_MVC异步请求

    *微软的MVC异步请求 使用一下方式,就能生成完整的<from>标签,以及对应的表单元素,提交时能达到异步提交的效果 <%using(Ajax.BeginForm( "Co ...

  10. C/c.pp:贪心,二分答案

    说是贪心有点牵强. 其次,答案满足单调性,如果在k次操作能完成那么在k+1次操作内也能完成. 因为大不了你就把多的一次对方操作再进行一次就好了. 怎么操作呢? 我们从头扫这个序列,遇到每一个不匹配位置 ...