xcode反汇编调试iOS模拟器程序(二)看懂反汇编

这里当然不会从零开始讲汇编代码了,零基础的话可以看看 王爽 写的书《汇编语言》,请自己找度娘或谷哥要了。其实只为了iOS调试的话并不需要学多少,懂几个命令和明白寄存器的作用就行。建议遇到不懂的时候再搜索看看。

这一节主要讲讲书上没有的东西。


在xcode中看到的汇编语法不是熟悉的intel格式,而是叫AT&T汇编。基本上只要懂intel,at&t会很快上手。两者的区别请参考这篇文章:

AT&T汇编http://blog.csdn.net/bigloomy/article/details/6581754

例如,在前一节的截图中,会看到movl这样的指令,比熟悉的mov多了个l。这个l表示本次操作是长字型(4字节)数据,操作数是32bit。

这里要注意,lldb和gdb看到的结果会有些差别,下面是对同一个C++函数的截图:

这个是lldb:

xcode反汇编调试iOS模拟器程序(二)看懂反汇编

这个是gdb:

xcode反汇编调试iOS模拟器程序(二)看懂反汇编

可以看到lldb会比gdb在AT&T的格式表示上更规范化,gdb只会在一些特定的地方才加l。

lldb以十进制表示常量;左侧内存地址省略了0;

gdb在尖括号内多显示了函数内的偏移。

其实最新版的gdb又会显示得不同,但是apple在强推lldb,不再升级gdb了……


如果实际的代码是在处理浮点数,则在反汇编中会看到xmm0,xmm1等的寄存器,如:

xcode反汇编调试iOS模拟器程序(二)看懂反汇编

这些寄存器叫xmm寄存器,是为SSE指令服务的,所以也叫sse寄存器。操作他们的指令会有ss后缀。度娘给出了更多信息:http://baike.baidu.com/view/2679650.htm

sse寄存器是一组128bit的寄存器,其值有很多种可能性,可通过gdb查看,详情请查看下一节


总结一下,主要明白这几个概念就行:

1. mov xxx, yyy 表示把xxx的值赋给yyy

2. call xxx 表示调用某函数

3. jmp xxx 表示直接跳转到某内存地址,一般是函数的入口地址

4. ret 表示要返回下一层堆栈了,如果函数有返回值,会存在eax寄存器里。

上一篇:GDB调试fork+exec创建的子进程的方法


下一篇:Spark入门