2010-09-29 18 views
11

Por ejemplo:¿Cómo puedo traducir el ensamblaje a binario?

 .text 
     .align 2 
     .global main 
     .equ val,0x4712   # 16-bit binary code for 0x4712: 0100 0111 0001 0010 
           # Program code starts now 
main:       # This label must be main:, not MAIN: 
     movi r16,val   # WHAT WOULD THIS LINE BE IN BINARY? 
     movi r17,0 
loop: addi r17,r17,1 
     subi r16,r16,1 
     bne r16,r0,loop 
stop: br stop 
.end 
+1

¿Qué arquitectura? –

+0

CPU es NIOS2. ¿Importa? – JustinBieber

Respuesta

20

Es decir, con la mano?

A mano, toma la hoja de conjunto de instrucciones para su microprocesador, comprende sus modos de direccionamiento y otros problemas de representación de datos, y luego conviértalo en algo conveniente, como una notación hexadecimal.

Luego necesitaría obtener esa información en la memoria del dispositivo, usando algún proceso específico del dispositivo (archivo del disco, archivo de la línea serie, ingresado desde un panel frontal con un grupo de interruptores).

Obviamente, no puede haber todo tipo de problemas en la cadena de herramientas que necesitará para averiguar para obtener su binario en una máquina. Si solo lo hace para reírse, el hexadecimal, un lápiz y un bloc de notas se han adaptado a muchos durante años.

Editar -

Tienes que saber varias cosas.

Primero, los códigos de operación, y junto con los códigos de operación, necesita conocer los modos de direccionamiento.

consideran este 6502:

LDA #$00 
LDA $00 
LDA $1234 

Esos son tres instrucciones diferentes en el 6502.

Las primeras cargas del acumulador (A) con $ 00 0 en hexadecimal. El símbolo # le dice al ensamblador que está utilizando el modo de direccionamiento "inmediato" (el 6502 tiene 13 modos de direccionamiento en total).

La segunda carga del acumulador con el valor de la posición de memoria ubicado en la dirección $ 0000. En el 6502, tiene un modo de "página cero", por lo que puede acceder más fácilmente a la memoria desde la primera página de la memoria (direcciones $ 0000- $ 00FF).

La tercera carga el acumulador con el valor de la posición de memoria ubicado en la dirección $ como 1234. Se trata de direccionamiento absoluto, simplemente especificando la dirección real de la memoria le interesa.

Resalto este ejemplo, ya que, a simple vista, los tres de estos tienen el mismo aspecto. Pero, en verdad, todos compilan a 3 instrucciones distintas, o códigos de operación. Por lo tanto, es importante comprender lo que le dice su ensamblaje para que pueda seleccionar el código de operación correcto para su procesador.

Ahora, si mira un opcode guide para el 6502, y busca la instrucción LDA, verá los diferentes valores binarios para cada instrucción.

Por lo tanto, en este caso se podrían obtener:

$A9 $00 
$A5 $00 
$AD $12 $34 

Esa es la representación binaria (en hexadecimal) de esos 3 instrucciones.

El primero, $ A9, es para el modo de direccionamiento "inmediato", el segundo, $ A5, para el direccionamiento de Página cero, y finalmente $ AD para Absoluto.

También tenga en cuenta que después de los operandos, son los argumentos. Para el 6502, simplemente siguen en la secuencia de bytes. Diferentes procesadores hacen cosas diferentes.Tenga en cuenta que para Absolute, tenemos 2 bytes, $ 12 y $ 34, representando cada uno la mitad de la dirección total de 16 bits. Creo que esto es correcto, que el Byte más significativo de la dirección es lo primero, pero podría revertirse ($ A9 $ 34 $ 12).

Por lo tanto, ese es el fundamento de ensamblar a mano.

Otras cosas a tener en cuenta son problemas como la ubicación en la que se cargará el ensamblado. Eso afectará los valores para cosas como tus etiquetas.

En 6502:

label: LDA #$00 
     JMP label 

Si su conjunto está empezando en la dirección $ 1000, este esta ensamblará a:

$A9 $00 
$4C $10 $00 

Si el montaje está empezando en la dirección $ 5555 entonces:

$A9 $00 
$4C $55 $55 

Vea, la instrucción JMP (Jump) ($ 4C) necesita una dirección para saltar, y la etiqueta en su assem bly es relativo a su ubicación en el programa. Convenientemente, en este caso, la etiqueta está al principio. Pero puede ver cómo la dirección está codificada en el código de máquina final.

6502 es FÁCIL (realmente fácil) ensamblaje. Los procesadores modernos, bueno, no lo son. Los ensambladores modernos hacen mucho trabajo para usted, y usted tiene CPUs más complicadas con conjuntos de instrucciones más grandes, y cosas como problemas de alineación. Todos estos faltan en el 6502. Pero como ensamblador manual, usted es responsable de todos esos matices.

Se supone que su manual de microprocesador le indica estos matices. Pero con las modernas CPU complicadas, es probable que no sea trivial de hacer y aprender.

No necesariamente quiere disuadirlo de esto, pero tenga en cuenta que puede ser mucho trabajo.

Pero esta es la esencia de lo que debe hacer.

+0

Ya existe una notación hexadecimal. Pero no puedo hacerlo bien. Por ejemplo: 0x40000 = 00000100000100011100010010000100 y ni siquiera entiendo cómo lo obtuvieron. – JustinBieber

+1

no, 0x40000 = 01000000000000000000. binario 00000100000100011100010010000100 = 0x0411c484. –

+0

El 6502 es realmente pequeño endian; LDA $ 1234 -> AD 34 12. Pero eso es solo una liendre. – Avi

1

Todos los ensambladores con los que he trabajado tenían una función para incluir el binario en la lista de salida junto al código al realizar un ensamblaje.

Cuestiones relacionadas