Advertisement
Guest User

Untitled

a guest
Jul 25th, 2014
576
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
  104.  
  105. saved-
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement