Plataforma: JZ2440 placa de desarrollo --cpu: S3C2440 (ARM920)
prefacio
El ejercicio anterior, utilizando un programa de lenguaje C luces LED, este ejercicio va a hacer un análisis del programa de archivos desmontado, y aprovechar el conocimiento de ellos.
preliminares
registro ARM
ATPCS (brazo-thumb llamada a procedimiento estándar)
propósito
Para que el lenguaje C y ensamblador reglas de llamada designado puede llamar a los demás, siempre y cuando el idioma utilizado para cumplir con la norma, pueden llamar a los demás y en funcionamiento.
contenido
1. Registro reglas de uso
Un registro puede ser utilizado en un total de 16 modo ARM como R0-R15.
Paso de parámetros R0-R3, Funciones después de su uso no puede restaurar el valor original.
variables locales R4-R11, si el valor original de la necesidad de guardar y restaurar el valor original en el valor de retorno.
R12 subrutina como registro de trabajo, alias IP, que se utiliza para almacenar otros registros hacer ahorro de pila, etc., como se describe en IP mov, operación sp
R13 como el puntero de pila, SP, esto es todas las arquitecturas, incluyendo ARM, IA-32 están presentes en el registro, es necesario guardar y restaurar precisa, de lo contrario afectará el funcionamiento normal, también conocida como la pila para mantener el equilibrio.
R14 guarda la dirección del remitente, LR, instrucción bl volverá al valor almacenado de direcciones, el uso común es: lr guardar la dirección en la pila para guardar, y luego, cuando se cierra la función LR asignados al registro de la PC, ejecutar para lograr el propósito de la dirección de retorno.
Dirección R15, PC, contador de programa, el registro en el domicilio para que el programa sea ejecutado, basado en el mecanismo de protección retroactiva ARM, en el caso de tuberías de tres etapas, PC apuntará a la dirección de la instrucción 8 dirección actualmente en ejecución. El otro registro se utiliza para guardar los bits de estado del programa, tales como desbordamiento, acarreo, 0 y similares. PC no se puede utilizar en adición a lo anterior funciones descritas, la arquitectura IA-32 con la diferencia de que el registro se puede asignar directamente, pero sólo modificar indirectamente el IA-32 y similares por instrucción JMP.
2. Los datos de la pila reglas de uso
Las disposiciones de la dirección de crecimiento de una pila buena, esto por lo general es descendente pila. Al descender la pila, por ejemplo, cuando la pila, sp necesita db (disminución antes) o da (disminución después), sp necesita IA (aumento después) o ib (aumento antes), se trata de la necesidad de la unidad, para que la pila cuando la pila uso normal.
3. Las normas de paso de parámetros
llamada a la función, los parámetros que pasan a R0-R3, el número de parámetros excede 4, los parámetros restantes pasaron por la pila, y devuelve el valor devuelto es el uso de R0-R3.
4. guardar y restaurar la regla
Se va a destruir algunos de los valores almacenados en los registros u otras llamadas a funciones, la necesidad de la protección del sitio con el fin de funcionar en un funcionamiento normal después de la función devuelve. Debemos restaurar el sitio de conformidad con las normas acordadas sale de la función correspondiente. Funciones utilizadas actualmente registros necesitan utilizar el registro de acuerdo con el (registro de orden superior a la pila, tal como R15) de orden de apilamiento, cuando la pila es entonces a su vez puede ser de apilado.
análisis
led.elf: file format elf32-littlearm
Disassembly of section .text:
00008074 <_start>:
8074: e3a00000 mov r0, #0 ; 0x0
8078: e5901000 ldr r1, [r0]
807c: e5800000 str r0, [r0]
8080: e5902000 ldr r2, [r0]
8084: e1520000 cmp r2, r0
8088: e59fd00c ldr sp, [pc, #12] ; 809c <.text+0x28>
808c: 03a0da01 moveq sp, #4096 ; 0x1000
8090: 05801000 streq r1, [r0]
8094: eb000001 bl 80a0 <main> //bl跳转main,返回地址lr=8098
00008098 <halt>:
8098: eafffffe b 8098 <halt>
809c: 40001000 andmi r1, r0, r0
000080a0 <main>:
80a0: e1a0c00d mov ip, sp
80a4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
80a8: e24cb004 sub fp, ip, #4 ; 0x4
80ac: e24dd008 sub sp, sp, #8 ; 0x8
80b0: e3a03456 mov r3, #1442840576 ; 0x56000000
80b4: e2833050 add r3, r3, #80 ; 0x50
80b8: e50b3010 str r3, [fp, #-16]
80bc: e3a03456 mov r3, #1442840576 ; 0x56000000
80c0: e2833054 add r3, r3, #84 ; 0x54
80c4: e50b3014 str r3, [fp, #-20]
80c8: e51b2010 ldr r2, [fp, #-16]
80cc: e51b3010 ldr r3, [fp, #-16]
80d0: e5933000 ldr r3, [r3]
80d4: e3c33c3f bic r3, r3, #16128 ; 0x3f00
80d8: e5823000 str r3, [r2]
80dc: e51b2010 ldr r2, [fp, #-16]
80e0: e51b3010 ldr r3, [fp, #-16]
80e4: e5933000 ldr r3, [r3]
80e8: e1e03003 mvn r3, r3
80ec: e2033c15 and r3, r3, #5376 ; 0x1500
80f0: e1e03003 mvn r3, r3
80f4: e5823000 str r3, [r2]
80f8: e51b2014 ldr r2, [fp, #-20]
80fc: e51b3014 ldr r3, [fp, #-20]
8100: e5933000 ldr r3, [r3]
8104: e3c33070 bic r3, r3, #112 ; 0x70
8108: e5823000 str r3, [r2]
810c: e3a03000 mov r3, #0 ; 0x0
8110: e1a00003 mov r0, r3
8114: e24bd00c sub sp, fp, #12 ; 0xc
8118: e89da800 ldmia sp, {fp, sp, pc}
Disassembly of section .comment:
00000000 <.comment>:
0: 43434700 cmpmi r3, #0 ; 0x0
4: 4728203a undefined
8: 2029554e eorcs r5, r9, lr, asr #10
c: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}
10: Address 0x10 is out of bounds.
Desmontaje anteriormente, se supone en este modo de realización nandflash activado, sp se establece en 4.096. BL salto a la función principal de archivos de arranque principal en el programa C, esta vez lr registro contiene la dirección 8098 regresado.
Después de introducir el principal, primer salvamento de la necesidad de preservar el sitio, usted tendrá que usar una pila de registros Guardar
80a0: e1a0c00d mov ip, sp //fp=? ip=4096 sp=4096 lr=8098 pc=80A8
80a4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
dirección de pila | valor | comentario | ||
4092 | 0x80A8 | ordenador personal | ||
4088 | 0x8098 | lr | ||
4084 | 4096 | IP = edad sp | ||
4080 | unknowvalue | fp | <-SP |
Fp A continuación se ajusta al primer campo de dirección almacenada, basado en el uso de la FP hacia atrás, registros fp y yo creo que es el IA-32 EBP arquitectura de registro de efecto similar, como los marcos de pila de referencia, añadiendo el valor de desplazamiento sobre la base de abordar cualquier marco de pila variable. A continuación, SP - 8 es una compilación de memoria común es una variable local, que es el mismo punto de la arquitectura IA-32, que se corresponde con el programa C es nuestros dos registros señalan los punteros.
80a8: e24cb004 sub fp, ip, #4 ; 0x4 //fp = ip - 4 =4096-4 =4092
80ac: e24dd008 sub sp, sp, #8 ; 0x8 //sp =sp -8 = 4072 //两个int 局部变量
dirección de pila | valor | comentario | ||
4092 | 0x80A8 | ordenador personal | ||
4088 | 0x8098 | lr | ||
4084 | 4096 | IP = edad sp | ||
4080 | unknowvalue | fp | ||
4076 | ||||
4072 | <-SP |
Después de la memoria de referencia FP dirigida a la dirección de la memoria que acaba de asignación de valor de registro
80b0: e3a03456 mov r3, #1442840576 ; 0x56000000//r3=0x56000000
80b4: e2833050 add r3, r3, #80 ; 0x50 //r3=0x56000050
80b8: e50b3010 str r3, [fp, #-16] //fp - 16 = 4092 - 16 = 4076
80bc: e3a03456 mov r3, #1442840576 ; 0x56000000
80c0: e2833054 add r3, r3, #84 ; 0x54
80c4: e50b3014 str r3, [fp, #-20]
dirección de pila | valor | comentario | ||
4092 | 0x80A8 | ordenador personal | ||
4088 | 0x8098 | lr | ||
4084 | 4096 | IP = edad sp | ||
4080 | unknowvalue | fp | ||
4076 | 0x56000050 | |||
4072 | 0x56000054 | <-SP |
Seguido de un programa ubicado en una variable local de procesamiento corresponde a los programas en C pueden entender con claridad, no hay conocimiento, y por lo tanto no se describen.
//*pGPFCON &= ~((3<<8) | (3<<10) | (3<<12));
80c8: e51b2010 ldr r2, [fp, #-16]
80cc: e51b3010 ldr r3, [fp, #-16]
80d0: e5933000 ldr r3, [r3]
80d4: e3c33c3f bic r3, r3, #16128 ; 0x3f00
80d8: e5823000 str r3, [r2]
//*pGPFCON |= ~((1<<8) | (1<<10) | (1<<12));
80dc: e51b2010 ldr r2, [fp, #-16]
80e0: e51b3010 ldr r3, [fp, #-16]
80e4: e5933000 ldr r3, [r3]
80e8: e1e03003 mvn r3, r3
80ec: e2033c15 and r3, r3, #5376 ; 0x1500
80f0: e1e03003 mvn r3, r3
80f4: e5823000 str r3, [r2]
//*pGPFDAT &=~((1<<4) | (1<<5) | (1<<6));
80f8: e51b2014 ldr r2, [fp, #-20]
80fc: e51b3014 ldr r3, [fp, #-20]
8100: e5933000 ldr r3, [r3]
8104: e3c33070 bic r3, r3, #112 ; 0x70
8108: e5823000 str r3, [r2]
El último es el valor de retorno de la asignación, según muestra ATPCS que el registro R0 se utiliza aquí como un valor de retorno almacenado en el registro, el valor de retorno es 0, donde el desmontaje de ningún daño especial es decir, no a través de R3 como intermediario, si el compilador debe ser inteligente punto la distancia optimizada aquí.
810c: e3a03000 mov r3, #0 ; 0x0
8110: e1a00003 mov r0, r3
De este modo, al final de la función principal se ejecuta, la dirección de izquierda a derecha listo para volver al punto, en cuyo caso la necesidad de restaurar el valor guardado en el registro en la pila, mientras que la restauración sp. En primer lugar asignado a la recuperación de espacio de pila variable local, donde sólo el extremo superior del punto de recuperación sp dirección variable asignada local, no hacer la operación de recuperación adecuada montón, debido a la necesidad de utilizar la dirección de memoria siguiente con destino será cubierto, y por lo tanto no requieren procesamiento adicional.
8114: e24bd00c sub sp, fp, #12 ; 0xc //局部变量退栈
dirección de pila | valor | comentario | ||
4092 | 0x80A8 | ordenador personal | ||
4088 | 0x8098 | lr | ||
4084 | 4096 | IP = edad sp | ||
4080 | unknowvalue | fp | <-SP | |
4076 | 0x56000050 | |||
4072 | 0x56000054 |
Correspondiente al inicio de la última STMDb ldmia, los datos almacenados en la pila se devuelve al registro {}. tablas de comparación se pueden ver en una pila, el FP pila salvado será restaurado a los registros fp, ip preservar el valor de edad sp, por lo tanto sp sp para volver a la principal pre-llamada, excepto la última lr se almacena en la dirección de retorno, justo restaurar PC de dar de alta, por lo que la siguiente instrucción ejecutada puntos de dirección del PC al valor de retorno, la salida normal de la función principal. (Ldmia mediante la cesión a sp, pero todavía seguirá funcionando sp ia normal, debido a que la instrucción de la operación es ia sp tmp no los detalles de la operación, se refieren a https://blog.csdn.net/G_METHOD/article/ detalles / 104126283 descritas para la LDM)
8118: e89da800 ldmia sp, {fp, sp, pc}
dirección de pila | valor | comentario | ||
4092 | 0x80A8 | ordenador personal | <-SP | |
4088 | 0x8098 | lr ====== "pc | ||
4084 | 4096 | IP = edad sp === "sp | ||
4080 | unknowvalue | fp ======= "fp | ||
4076 | 0x56000050 | |||
4072 | 0x56000054 |