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

3 Comentarios

  1. 32

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

    La conversión de muy simple BRAZO de instrucciones en binario/hexadecimal

    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 de 1111.

    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í:

    1110 00 0 0 1101 0000 0000 00000000
    

    Pongo Rn a 0, porque no es realmente aplicable a MOV. En caso de CMP, creo, S es siempre 1.

  2. 10

    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?

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

    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-as test.s  -o test.o
    arm-none-linux-gnueabi-objdump -D test.o
    

    arm-none-linux-gnueabi vs arm-none-elf vs arm-elf, etc no importa para esto, todos hacen la misma

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

    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

    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 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

    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, 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.

  3. 6

    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.

    • Brazo BRAZO es un divertido acrónimo, pero es tremendamente difícil hacer una búsqueda en Google para ello. La expansión es «Arquitectura ARM Manual de Referencia’, y están disponibles aquí después de un registro gratuito.
    • No, la expansión es en realidad Avanzado (Reducir Instruction Set computing) Arquitectura de la Máquina Manual de Referencia. Pero esa no es una buena búsqueda en google 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here