加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

深入iOS系统底层之程序中的汇编代码

发布时间:2019-05-30 00:07:15 所属栏目:业界 来源:欧阳大哥2013
导读:合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。--(老子道德经 ) 对于一个闭源系统来说如果想研究某些逻辑的内部实现就需要对汇编语言进行掌握和了解、对于某些需要高性能实现的逻辑来说用汇编语言实现可能是最好的选择、对于某些逻辑来说可能只

系统的特殊寄存器的值输出给高级语言的变量

  1. //打印当前指令的地址以及当前线程ID 
  2. void foo() 
  3.     unsigned long pc = 0; 
  4.     unsigned long threadid = 0; 
  5.       
  6. #if __arm64__ 
  7.       //arm64限制了直接读写PC寄存器的方式,而是改动相对偏移 
  8.       //TPIDRRO_EL0是指内核中的线程ID,用专门的指令mrs来读取 
  9.       __asm__( 
  10.               "adr x0, #0n" 
  11.               "stur x0, %0n" 
  12.               "mrs %1,TPIDRRO_EL0n" 
  13.               :"=m"(pc),"=r"(threadid) 
  14.               ); 
  15.       
  16. #elif __x86_64__ 
  17.     //x86体系的CPU没有专门的寄存器保存线程ID 
  18.     __asm__( 
  19.             "leaq (%%rip), %%rdin" 
  20.             "movq %%rdi, %0n" 
  21.             :"=m"(pc) 
  22.             ); 
  23. #else 
  24.     NSAssert(0, @"oops!"); 
  25. #endif 
  26.       
  27.      
  28.     NSLog(@"pc=%ld, threadid=%ld",pc, threadid); 
  29.       

无锁多线程变量访问假设程序中定义了两个变量x和y,现在A线程负责读取这两个变量的值进行处理,而B线程则负责写入这两个变量的最新值,这两个变量具有关联系,必须同时写入和读取。如果是用高级语言来实现为了保证同步则需要在两个线程的读写两个变量的地方进行加锁处理。而在arm体系结构下则可以借助ldp,stp两个条指令来实现指令级别上的原子操作,因为无需加锁从而达到最佳的性能。

  1. //假设x,y变量保存在全局变量critical数组中。 
  2. long critical[2]; 
  3.  
  4. void read(long *px, long *py) 
  5. #if __arm64__ 
  6.     __asm__( 
  7.             "ldp x9, x10, %2n" 
  8.             "stur x9,%0n" 
  9.             "stur x10,%1n" 
  10.             :"=m"(*px),"=m"(*py):"m"(critical) 
  11.            );   
  12. #else 
  13.     //其他体系结构在读取时必须要加锁处理。 
  14.     *px = critical[0]; 
  15.     *py = critical[1]; 
  16. #endif 
  17.  
  18. void write(long x, long y) 
  19. #if __arm64__ 
  20.     __asm__( 
  21.             "stp %1, %2, %0":"=m"(critical):"r"(x),"r"(y) 
  22.            ); 
  23. #else 
  24.     //其他体系结构在写入两个变量时必须要加锁处理。 
  25.     critical[0] = x; 
  26.     critical[1] = y; 
  27. #endif 

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读