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