Model Me, Model World
Blayground
ARM 汇编初见
准备 C 代码
#include <stdio.h>
main () {
int a = 1;
int b = 2;
printf("%d\n", a + b);
}编译并生成反汇编结果
gcc a+b.c
objdump -d a.out000083f4 <main>:
83f4: b580 push {r7, lr}
83f6: b082 sub sp, #8
83f8: af00 add r7, sp, #0
83fa: 2301 movs r3, #1
83fc: 603b str r3, [r7, #0]
83fe: 2302 movs r3, #2
8400: 607b str r3, [r7, #4]
8402: 683a ldr r2, [r7, #0]
8404: 687b ldr r3, [r7, #4]
8406: 4413 add r3, r2
8408: f248 4070 movw r0, #33904 ; 0x8470
840c: f2c0 0000 movt r0, #0
8410: 4619 mov r1, r3
8412: f7ff ef6a blx 82e8 <_init+0x20>
8416: 4618 mov r0, r3
8418: 3708 adds r7, #8
841a: 46bd mov sp, r7
841c: bd80 pop {r7, pc}
841e: bf00 nop将r7,lr压入stack
下移stack pointer 2*32bit (8Byte) 用来存放2个零时整数变量。
将使得r7指向栈顶。
将立即数1存入寄存器r3,
将r3存入以r7为基地址,0为偏移量的位置。
将立即数2存入寄存器r3,
将r3存入以r7为基地址,4为偏移量的位置。
r3低16位置0x841c
r3高16位置0
将a存入r1
将b存入r2
计算a+b
将r3存入r1
跳转到0x82e8执行,似乎没有切换到Thumb指令集
恢复sp指针
恢复pc指针