6.4 ARM

6.4.1 keil优化+thumb mode

  1. .text:00000042 scanf_main
  2. .text:00000042
  3. .text:00000042 var_8 = -8
  4. .text:00000042
  5. .text:00000042 08 B5 PUSH {R3,LR}
  6. .text:00000044 A9 A0 ADR R0, aEnterX ; "Enter X:
  7. "
  8. .text:00000046 06 F0 D3 F8 BL __2printf
  9. .text:0000004A 69 46 MOV R1, SP
  10. .text:0000004C AA A0 ADR R0, aD ; "%d"
  11. .text:0000004E 06 F0 CD F8 BL __0scanf
  12. .text:00000052 00 99 LDR R1, [SP,#8+var_8]
  13. .text:00000054 A9 A0 ADR R0, aYouEnteredD___ ; "You entered %d...
  14. "
  15. .text:00000056 06 F0 CB F8 BL __2printf
  16. .text:0000005A 00 20 MOVS R0, #0
  17. .text:0000005C 08 BD POP {R3,PC}

必须把一个指向int变量的指针传递给scanf(),这样才能通过这个指针返回一个值。Int是一个32位的值,所以我们在内存中需要4字节存储,并且正好符合32位的寄存器。局部变量x的空间分配在栈中,IDA把他命名为var_8。然而并不需要分配空间,因为栈指针指向的空间可以被立即使用。所以栈指针的值被复制到R1寄存器中,然后和格式化字符串一起送入scanf()。然后LDR指令将这个值从栈中送入R1寄存器,用以送入printf()中。

用ARM-mode和Xcode LLVM编译的代码区别不大,这里略去。