JZ2440 desnuda desarrollo de juntas Ejercicio # 2 - LED de iluminación compilación del programa, el análisis

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    
Se han publicado 19 artículos originales · ganado elogios 7 · vistas 6928

Supongo que te gusta

Origin blog.csdn.net/G_METHOD/article/details/104156501
Recomendado
Clasificación