Model Me, Model World

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.out
000083f4 <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指针

Blog maintained by Tao J

No longer hosted on GitHub Pages — Theme by mattgraham