2012-08-02 41 views
21

He estado tratando de usar this page, así como varias otras guías para descubrir cómo expresar instrucciones ARM muy simples como binarias y hexadecimales. Parece que debería ser un proceso sencillo para mí, pero todavía no entiendo. Aquí hay algunos ejemplos.Conversión de instrucciones ARM muy simples a binario/hex

NOP básica:

 what goes here?   what goes here? 
      _↓_     _____↓____ 
      | |    |   | 
mov r0, r0 ; ????00?1101????????????????????? 
         |__||__| 
          ↑ ↑ 
       how do I express registers? 

pregunta básica Lo mismo para los demás.

La comparación de dos registros:

cmp r1, r0 

la adición inmediata para registrar el valor:

add r0, #0x1a 

Todos estos tutoriales en línea son excelentes en la que describe cómo utilizar las instrucciones de este tipo, pero ninguno he podido para encontrar en realidad, repase cómo convertir una instrucción ARM en el código binario/hexadecimal/máquina en el que se ensambla.

Gracias de antemano por su ayuda.

+2

gran pregunta; desafortunadamente el enlace está muerto. para las personas que pasan, aquí hay un enlace rápido de [web archive] (https://web.archive.org/web/20150426195854/http://www.nyx.net/~troddis/ARM.html) – Asu

Respuesta

29

Aquí es cómo se codifican instrucciones de procesamiento de datos:

ARM data processing instructions

Tienes condición tabla de códigos en la página de los suyos. Los registros están codificados 0000 hasta 1111.

Todos sus ejemplos pertenecen a la misma categoría. La imagen se extrae de algún documento en mi HDD, pero también pude encontrarla en google. Codificar esas instrucciones es un trabajo tedioso.

Así, mov r0, r0 debe ir como esto:

1110 00 0 0 1101 0000 0000 00000000 

puse Rn a 0, ya que en realidad no es aplicable a MOV. En el caso de CMP, creo que S es siempre 1.

5

Debe obtener una copia del ARM ARM que describe la codificación de todas las instrucciones.

La mayoría de las instrucciones ARM utilizan los 4 bits superiores para un código condicional. Si no desea ejecutar la instrucción condicionalmente, simplemente use la pseudocondición AL (1110).

El primer registro (Rn) en la codificación no se utiliza para la instrucción MOV y se debe establecer en 0000 como se define en ARM ARM.

El segundo registro es el destino, aquí se acaba de codificar el número de registro, por lo que en su caso también sería 0000 porque estás utilizando r0 como destinal, para R4 sería 0100.

El resto es el llamado operando de cambio que es muy flexible. Podría ser un registro simple como en su caso (r0), entonces es solo 0000 0000 0000 donde los últimos 4 bits nuevamente codifican el registro. También puede codificar diferentes tipos de turnos y gira con registro o valores inmediatos para el procesamiento de datos.

Pero también podría ser un inmediato donde 8 bits están codificados en los bits inferiores y los primeros 4 bits definen un giro a la derecha en pasos de 2 bits. En este caso, bit25 también será 1, en todos los demás casos es 0.

+5

ARM ARM es un acrónimo de diversión, pero es terriblemente difícil hacer una búsqueda en Google para obtenerlo. La expansión es 'ARM Architecture Reference Manual' y están disponibles [aquí] (http://infocenter.arm.com/help/topic/com.arm.doc.subset.architecture.reference/index.html#reference) después de una inscripción gratuita. –

+0

@Kevin No, la expansión es en realidad ** Avanzado (reducir la computación del conjunto de instrucciones) Manual de referencia de la arquitectura de la máquina **. Pero esa no es una buena búsqueda en Google :) –

9

Primero, necesita el ARM Architectural Reference Manual (ARM ARM) en infocenter.arm.com, manuales de referencia, obtenga el más antiguo (armv5 o lo que sea). el conjunto de instrucciones está bien definido allí.

En segundo lugar, ¿por qué no ensamblas algunas instrucciones y ves qué pasa?

;@test.s 
cmp r1, r0 
add r0, #0x1a 

lo ensamblador cruzado que tiene (ver http://github.com/dwelch67/raspberrypi en el directorio de construcción gcc para una secuencia de comandos, basta con ejecutar a través de binutils en ese guión)

arm-none-linux-gnueabi-as test.s -o test.o 
arm-none-linux-gnueabi-objdump -D test.o 

brazo-ninguno-linux-gnueabi vs brazo- ninguno-Elf vs brazo-elf, etc dont importa para esto, todos hacen lo mismo

Disassembly of section .text: 

00000000 <.text>: 
    0: e1510000 cmp r1, r0 
    4: e280001a add r0, r0, #26 

los cuatro primeros bits de una instrucción completa de 32 bits brazo (no el pulgar) son el código de condición, ver el campo de condición sección en ARM ARM. un 0xE significa siempre, siempre ejecute esta instrucción. 0b0000 eq solo se ejecuta si se establece el indicador z, 0b0001 ne solo se ejecuta si z es claro, etc.

En ARM ARM, presione en el conjunto de instrucciones del brazo, luego en la lista alfabética de instrucciones del brazo, luego encuentre cmp. con cond 00I10101 rn sbz shifter

De nuestra instrucción cmp anterior, vemos 1110 000101010001 ... entonces, yo soy un cero bits 15:12 son cero bits 27:26 son cero y 24:21 son 1010, así que esto es un cmp

Los bits 19 a 16 anteriores son 0b001 que es rn así rn = 1 (r1) para el operando shifter en ARM ARM le dice que mire operandos de procesamiento de datos en Modo 1 y tiene un enlace en el pdf para la página

sabemos que queremos que el segundo operando sea simplemente un registro, que se denomina operandos de procesamiento de datos - registro, y un número de página, vaya a esa página en esa página 15:12 es rd 11: 4 son ceros y 3 : 0 es rm. sabemos por la instrucción cmp que dice que 15:12 debe ser cero, me pregunto si le importa, un cmp no almacena un resultado en un registro para que no se use rd. rm se usa y en este caso queremos r0, entonces 0b0000 va en 3: 0 también tenga en cuenta que muestra bits 27:25 como ceros, en la instrucción cmp 25 es I, ahora sabemos que queremos cero allí entonces

entre la página cmp y esto procesamiento de datos - registro página tenemos el cuadro completo

1110 condition 
000 
1010 opcode 
1 S (store flags, that is a 1 for a cmp to be useful) 
0001 rn 
0000 rd/dont care/sbz 
00000 
000 
0000 rm 

cmp rn,rm 
cmp r1,r0 

el complemento es similar, pero utiliza una inmediata, por lo que ir a la instrucción de suma en la lista alfa de instrucciones. ahora sabemos por el cmp que 24:21 para esta clase de instrucción es el código de operación, podemos ir directamente al operando de la palanca de cambios para continuar desde allí

esta vez estamos haciendo add rd, rn, # immediate

a fin de buscar la página para #immediate

y la codificación es

1110 condition, always 
001 (note the immediate bit is set) 
0100 (opcode for add for this type of instruction) 
0 (S not saving the flags, it would be adds r0,r0,#26 for that) 
0000 (rn = r0) 
0000 (rd = r0) 

ahora viene la parte interesante, que puede codificar las 26 formas diferentes.los bits 7: 0 son los inmediatos y los bits 11: 8 permiten que se roten los inmediatos, 26 es 0x1A, simplemente podemos poner 0x1A en los 8 bits inferiores y establecer la rotación en 0, y eso es lo que hizo el ensamblador gnu. probablemente podría poner un 0x68 en los 8 bits inferiores y un 1 en el campo rotar_imm 1101000 rotar a la derecha 1 * 2 bits es 11010 = 0x1A = 26.

Cuestiones relacionadas