汇编与C/C++/Objective-C混用,分两种类型:外联汇编、内联汇编。 LLDB的一些常用指令可以协助我们更好的读取分析OC反编译,看懂汇编代码。

1、外联汇编

sum.h 声明:

#ifndef sum_h

#define sum_h

int sum(int a, int b);

#endif /* sum_h */

sum.s 实现:

.global _sum

_sum:

movq %rdi, %rax

addq %rsi, %rax

retq

main.m 调用:

#import

#import "sum.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

NSLog(@"%d", sum(1, 2));

}

return 0;

}

2、内联汇编

#import

int main(int argc, const char * argv[]) {

@autoreleasepool {

int num1 = 1;

int num2 = 2;

int result;

__asm__(

"addq %%rbx, %%rax"

: "=a"(result)

: "a"(num1), "b"(num2)

);

NSLog(@"%d", result);

}

return 0;

}

LLDB常用指令

1.1、读取寄存器的值

register read/格式 register read/x

1.2、修改寄存器的值

register write 寄存器名称 数值 register write $rax 0

2.1、读取内存中的值

x/数量-格式-字节大小 内存地址 x/3xw 0x0000010

2.2、修改内存中的值

memory write 内存地址 数值 memory write 0x0000010 10

3.1、格式

x是16进制,f是浮点,d是十进制

3.2、字节大小

b – byte 1字节 h – half word 2字节 w – word 4字节 g – giant word 8字节

4、expression 表达式

可以简写:expr 表达式 expression $rax expression $rax = 1

5、po 表达式 6、print 表达式

7、po/x

r

a

x

8

p

o

(

i

n

t

)

rax 8、po (int)

rax8、po(int)rax

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: