He estado tratando de utilizar esta página así como varias otras guías para averiguar cómo expresar muy simple BRAZO de instrucciones como binario y hexadecimal. Parece que debería ser un proceso sencillo para mí, pero todavía no entiendo. He aquí un par de ejemplos.
Básica NOP:
what goes here? what goes here?
_↓_ _____↓____
| | | |
mov r0, r0 ; ????00?1101?????????????????????
|__||__|
↑ ↑
how do I express registers?
Misma pregunta básica para los demás.
Comparar dos registros:
cmp r1, r0
La adición de inmediato para registrar valor:
add r0, #0x1a
Todos estos tutoriales en línea son excelentes en la que describe cómo usar las instrucciones de como estos, pero en ninguno he sido capaz de encontrar realmente caminar a través de cómo convertir un BRAZO de la instrucción en el binario/hexadecimal/código máquina en la que se pone montado.
Gracias de antemano por su ayuda.
- la gran pregunta; lamentablemente, el enlace está muerto. para la gente que pasa, he aquí una rápida archivo web enlace
Aquí es cómo el procesamiento de datos instrucciones se codifican:
Usted tiene condición de la tabla de códigos en la página de la suya. Los registros están codificados
0000
a través de1111
.Todos sus ejemplos pertenecen a la misma categoría. La imagen está extraída de algún documento en mi disco duro, pero también me las arreglé para encontrar por google. La codificación de las instrucciones es un trabajo tedioso.
Así,
mov r0, r0
debería ir así:Pongo Rn a 0, porque no es realmente aplicable a
MOV
. En caso deCMP
, creo,S
es siempre 1.Primero apagado, usted necesita el BRAZO de Arquitectura Manual de Referencia (BRAZO) en infocenter.arm.com, manuales de referencia, obtener la más antigua (armv5 o lo que sea). el conjunto de instrucciones está bien definido en allí.
Segundo, ¿por qué no acaba de montar algunas instrucciones y a ver qué pasa?
lo de la cruz ensamblador tiene (ver http://github.com/dwelch67/raspberrypi en la compilación gcc directorio para una secuencia de comandos, ejecute a través de binutils en que la secuencia de comandos)
arm-none-linux-gnueabi vs arm-none-elf vs arm-elf, etc no importa para esto, todos hacen la misma
Los cuatro primeros bits de un total de 32 bits de instrucciones arm (no el pulgar) son la condición de código, vea la condición de campo de la sección en el BRAZO. un 0xE significa siempre, siempre se ejecuta esta instrucción. 0b0000 es eq sólo se ejecuta si el z bandera, 0b0001 ne ejecutar solo si z es claro, etc.
En el BRAZO de empuje en el brazo del conjunto de instrucciones, a continuación, la lista alfabética de brazo instrucciones, a continuación, encontrar cmp Se inicia con cond 00I10101 rn sbz de la palanca de cambios
De nuestro cmp instrucción anterior, podemos ver 1110 000101010001 … así que es un cero bits 15:12 bits cero 27:26 son cero y las 24:21 son 1010 así que esta es una instrucción cmp
bits de 19 a 16 de arriba son 0b001 que es rn entonces rn = 1 (r1) de la palanca de cambios operando en el BRAZO que le dice a usted para buscar en el Modo de Direccionamiento de 1 de Procesamiento de Datos de los operandos y tiene un enlace en el pdf a la página
sabemos que queremos que el segundo operando de ser simplemente un registro, que se llama de procesamiento de datos de los operandos a registrar, y un número de página, vaya a la página en la página 15:12 es de rd 11:4 ceros y 3:0 es la rm. sabemos de la instrucción cmp dice: 15:12 debe ser igual a cero, me pregunto si le importa, un cmp no almacena un resultado a un registro con el fin de rd no se utiliza. rm se utiliza y en este caso queremos r0, así 0b0000 va en 3:0 nota también de que muestra los bits de 27:25 como ceros, en la instrucción cmp 25 es que, ahora sabemos que queremos un cero no tan
entre el cmp página y este procesamiento de datos – registro de la página tenemos la imagen completa
el complemento es similar, pero utiliza de inmediato, así que ir a la instrucción add en el alfa lista de instrucciones. ahora sabemos de la cmp que 24:21 para esta clase de enseñanza es el código de operación, ya bastante podemos ir directamente a la palanca de cambios operando cosas para continuar desde allí
este momento estamos haciendo add rd,rn,#inmediata
a fin de buscar la página de #inmediata
y la codificación es
ahora viene la parte interesante, podemos codificar el 26 de maneras diferentes. los bits 7:0 son los inmediatos y los bits 11:8 permiten inmediata a girarse, 26 es 0x1A, se podría simplemente poner 0x1A en los 8 bits inferiores y establecer la rotación a 0, y eso es lo gnu assembler hizo. probablemente podría poner un 0x68 en el menor de 8 bits y un 1 en el rotate_imm campo 1101000 girado a la derecha 1*2 bits es 11010 = 0x1A = 26.
Usted debe obtener una copia del BRAZO se describe la codificación de todas las instrucciones.
La mayoría de BRAZO-Instrucciones de uso de la parte superior de 4 bits de un código condicional. Si usted no desea ejecutar la instrucción condicional sólo el uso de la pseudo-condición AL (1110).
El primer registro (Rn) en la codificación no es utilizado para el MOV-instrucción y esto debe ser 0000 como se define por el BRAZO.
El segundo registro es el destino, aquí solo se debe codificar el número de registro, por lo que en su caso también sería 0000, porque estás utilizando r0 como un destinal, para r4 sería 0100.
El resto es el llamado de la palanca de cambios operando que es muy flexible. Podría ser un simple registro como en su caso (r0), entonces es simplemente 0000 0000 0000 donde los últimos 4 bits codificar de nuevo el registro. También puede codificar diferentes tipos de turnos y gira con valores de registro o inmediatos para el procesamiento de datos.
Pero también podría ser una inmediata en donde los 8 bits se codifican en la parte inferior de los bits y los primeros 4 bits de definir un derecho de girar en 2 bits pasos. En este caso bit25 también será 1, en todos los otros casos es 0.