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- |