最近对Arm 汇编很感兴趣,就找到了《Instruction Set Assembly Guide for Armv7》学习一下,特此记录2个实例分析。
实例一
0001108c <out_standby>:// 函数start address 是0x0001108c
out_standby():
vendor/novatek/proprietary/audio/hal/audio_stream_deepbuf.c:309//source code:
//struct stream_out *out = (struct stream_out *)stream;
1108c: b5b0 push {r4, r5, r7, lr}//Push registers onto a full descending stack.
//Registers are stored on the stack in numerical order, with the lowest numbered register at the lowest address.
//r4, r5, r7, lr register 入栈 (lr register is r14 register)
1108e: 4604 mov r4, r0//move r0 content to r4, r4 backup for 入参
//r0 记录的是入参,也就是r0 content 是stream 指向的address, 也即out 指向的address
vendor/novatek/proprietary/audio/hal/audio_stream_deepbuf.c:312//source code:
//pthread_mutex_lock(&out->dev->lock);
11090: f8d0 00ec ldr.w r0, [r0, #236] ; 0xec//load r0 from the address (r0 content + 236)
//得到dev 的address, 当前r0 content 记录的是dev 的address
11094: 30a8 adds r0, #168 ; 0xa8//r0 content + #168 后,再放入r0
//r0 content 记录的是lock 对应的address
11096: f002 eac4 blx 13620 <__ThumbV7PILongThunk_compress_write+0x158>/