sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现.sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用dwarf-2版,那么两者之间有多少差异,本文就这问题对两版的异常代码的反汇编进行分析比较. 我使用mingw-w65-i686-810的sjlj与dwarf-2两个版本对下面异常代码编译. __attribute__((dllimport)) int dllfunc(); int main() {…
韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOOC相关课程而写的作业,如有疏漏,还请指出. 选了一门Linux内核分析课程,因为阅读内核代码中或多或少要涉及到At&T汇编代码的阅读,所以这里写下一个对一个简单C命令行程序的反汇编分析过程,一方面完成作业,另一方面当作练手.下面开始: 1.编写我们的C语言小程序 这里我们使用简单的例子,代码如下: #…
在分析objc_msgSend之前,先来搞清楚另一个问题. 函数是什么?可能会答 void foo(void) {} 像这样就是一个函数.或者函数包括函数原型和函数定义,是一段执行某样功能的机器代码. 调用函数时必须要准备两个要素,函数原型和函数入口地址. 函数原型的作用是什么?答声明了函数调用的方式.不够具体.函数原型是函数调用方和函数定义之间的关于参数传递和结果返回的协议约定.这个协议分别作用在函数入口两边的代码,一边是调用方在调用处协议的构建,另一边是函数定义对协议的访问解释.传统地就是调…
上一篇向大家介绍了__block变量的反汇编和它的伪代码,本篇函数块block,通常定义成原型(^){},它在反汇编中是什么东西. 我们先定义将要反汇编的例子,为减少篇幅例子采用non-arc环境. NSString* a = @"abc"; NSString* b = [NSString stringWithUTF8String:"abc"]; NSString* c = [@"ab" stringByAppendingString:@&quo…
C++代码如下:.h头文件 #pragma once#ifdef DLLTestAPI#else#define DLLTestAPI _declspec(dllimport)#endifint DLLTestAPI __stdcall add(int, int);int DLLTestAPI __cdecl subtract(int, int); .cpp代码文件 #define DLLTestAPI _declspec(dllexport)#include "Test.h"int _…
如题所说反汇编看__strong和__weak的真实样子,代码列举自然多,篇幅长不利于阅读,我就先搬出结论,后面是分析. 在NON-ARC环境,__strong和__weak不起作用.相反在ARC环境中会自动生成许多代码,__strong和__weak将生成指针引用这样的C++类,它们会在离开生命周期作用的范围(可以推广到作为实例的成员的情况)之前析构.而ARC中指针默认带__strong属性,也就是__strong完成了auto reference count.它们的伪代码如下: templa…
我们先来定义三个NSString -(void) testNSString { NSString* a = @"abc"; NSString* b = [NSString stringWithUTF8String:"abc"]; NSString* c = [@"ab" stringByAppendingString:@"c"]; } 大家都明白,a, b, c 都equalsToString:@"abc"…
上一篇<block函数块为何物?>介绍了在函数中定义的block函数块的反汇编实现,我在文中再三指出__block变量和block函数块自始还都是stack-based的,还不完全适合在离开定义它们的范围之外使用,包括异步回调.本篇贴上我手工逆向的函数 libsystem_blocks.dylib`_Block_copy_internal.从名字可以看出blocks编程由系统提供的编程框架,_Block_copy_internal也就是block函数块的copy方法,是令block函数块适合用…
1. 实验任务1 教材「实验9 根据材料编程」(P187-189)编程:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串'welcome to masm!'. 解题思路:根据学习的知识,我知道该页在显示缓冲区的位置从B8000H开始,要在屏幕中间,对照表格,我输出的三行应是11,12,13行.11行的起始地址为1760,我的输入内容占16bytes*2=32.(160-32)/2=64.所以我的初始地址偏移量是1760+64=1824,转换为十六进制是720h.B8000H+720H=B872…
编译环境:Windows 10 + VS2015 1.问题引入 在Win32环境下,CPU小端模式,参数用栈来传递,写出输出结果. 代码如下: int main() { long long a = 1; long long b = 2; long long c = 3; printf("%d%d%d", a, b, c);//输出结果102 return 0; } 反汇编代码如下: int main() { 010C2AB0 push ebp 010C2AB1 mov ebp,esp…