View difference between Paste ID: JnQAEsMk and RJgApDJ5
SHOW: | | - or go back to the newest paste.
1
void fopen(char* filename){
2
	/* Coloca do registrador
3
	R3 ao R7 e o LR na pilha */
4
	asm("PUSH {R3-R7, LR}");
5
	/* SP = SP - 0x30 */
6
	/* SP = Stack Pointer */
7
	asm("SUB SP, SP, #0x30");
8
	/* R5 = 0x0809797C */
9
	asm("LDR R5, =0x809797C");
10
	/* R5 = *R5 ? */
11
	asm("LDR R5, [R5]");
12
	/* R5 += 8 */
13
	asm("ADDS R5, #8");
14
	/* R1 = 0x2EA0 */
15
	asm("LDR R1, =0x2EA0");
16
	/* R0 = R5 + R1 ? */
17
	asm("ADDS R0, R5, R1");
18
	/* R1 = SP + #0x48 - var_40(0x40) */
19
	asm("ADD R1, SP, #0x48-#0x40");
20
	/* R4 = 0x08061451 */
21
	asm("LDR R4, =0x8061451");
22
	/* JUMP 0x08061451 */
23
	/* Basicamente isso é uma chamada de função, ele tá colocando
24
	os argumentos e depois da um jump pra R4, provavelmente para ir
25
	para a SUBb-rotina */
26
	asm("BLX R4");
27
28
	/* R3 = 0 */
29
	asm("MOVS R3, #0");
30
	/* (SP, #0x48 - #0x2C) = R3 */
31
	asm("STR  R3, [SP, #0x48-#0x2C]");
32
	/* (SP, #0x48 - #0x48) = R3 */
33
	asm("STR  R3, [SP, #0x48-#0x48]");
34
	/* (SP, #0x48 - #0x44) = R3 */
35
	asm("STR  R3, [SP, #0x48-#0x44]");
36
	/* R0, SP + #0x48-0x38 */
37
	asm("ADD  R0, SP, #0x48-#0x38");
38
	/* R1 = R5 */
39
	asm("MOVS R1, R5");
40
	/* R2 = [SP, #0x48-#0x40] */
41
	asm("LDR R2, [SP, #0x48-#0x40]");
42
	/* R3 = [SP, #0x48-#0x3C] */
43
	asm("LDR R3, [SP, #0x48-#0x3C]");
44
	/* R4 = 0x08063F91 */
45
	asm("LDR R4, =0x8063F91");
46
	/* Jump 0x08063F91 */
47
	asm("BLX R4");
48
	/* Aqui fica a mesma explicação lá de cima
49
	é argumentos + chamada de rotina */
50
51
52
	/* R6 = [SP, #0x48 - #0x2C] */
53
	asm("LDR R6, [SP, #0x48 - #0x2C");
54
	/* R0 = SP + #0x48-#0x2C */
55
	asm("ADD R0, SP, #0x48-#0x2C");
56
	/* R1 = 4 */
57
	asm("MOVS R1, #4");
58
	/* [R0] = R1(4) */
59
	asm("STR R1, [R0]");
60
	/* R1 = 1C */
61
	asm("MOVS R1, #0x1C");
62
	/* [R0, #8] = R1 ? */
63
	asm("STR R1, [R0, #8]");
64
	/* AQUI EU NUM ENTENDI BEM PRA SER SINCERO
65
	ADR É UMA PSEUDO-OP */
66
	asm("ADR R1, FILENAME ?");
67
	/* [R0, #4] = R1 */
68
	asm("STR R1, [R0, #4]");
69
	/* R0 = #0 */
70
	asm("MOVS R0, #0");
71
	/* [SP, #0x48-0x28] = R0 */
72
	asm("STR R0, [SP, #0x48-#0x28");
73
	/* R3 = 1 */
74
	asm("MOVS R3, #1");
75
	/* [SP, #0x48-#0x48] = R3 */
76
	asm("STR R3, [SP, #0x48-#0x48]");
77
	/* [SP, #0x48-#0x44] = R0 */
78
	asm("STR R0, [SP, #0x48-#0x44]");
79
	/* R1 = SP + 0x48-0x28 */
80
	asm("ADD R1, SP, #0x48-#0x28");
81
	/* MOVS R2, #0 */
82
	asm("MOVS R2, #0");
83
	/* R3 = SP + #0x48-#0x24 */
84
	asm("ADD R3, SP, #0x48-#0x24");
85
	/* R0 = R6 */
86
	asm("MOVS R0, R6");
87
	/* R4 = [R0] */
88
	asm("LDR R4, [R0]");
89
	/* R4 = [R4, #8] */
90
	asm("LDR R4, [R4, #8]");
91
	/* JUMP R4 */
92
	asm("BLX R4");
93
	/* Aqui entra o contexto das outras
94
	duas explicadas, uma chama de função xD */
95
	
96
	/* R0 = [SP, #0x48-#0x28] */
97
	asm("LDR R0, [SP, #0x48-#0x28]");
98
	/* SP = SP + 0x30 */
99
	asm("ADD SP, SP, #0x30");
100
	/* Retira da pilha tudo que foi colocado no início
101
	e K.O :] */
102
	asm("POP {R3-R7, PC}");	
103-
}
103+
}
104
105
saved-