¿Qué es un buen microprocesador de arranque para aprender ensamblaje?

Así que quiero aprender a ensamblar primero en un MP, luego pasar a C (ya que parece que eso es lo que la mayoría de ellos usa).

Quiero ingresar a la programación integrada, realmente me encantan las cosas de C de bajo nivel (Kernels/Modules for Linux es principalmente lo que he hecho), pero me encanta la idea de poder programar un nivel incluso más bajo que ese (Microcontroladores/ microprocesadores).

Sé sobre Arduino, y eso es genial y todo, pero no puedo encontrar muchos recursos para usar Assembly con ellos. Los AVR de Atmel parecen ser muy populares (y baratos), pero cuando se trata de la parte real del hardware (conectarlos a una placa de prueba, etc.), no encuentro mucha información.

Cualquier sugerencia/información o recursos que ustedes conozcan, por favor háganmelo saber.

Editar: otra cosa: parece que todos los libros de microprocesadores que leo (generalmente AVR) hablan sobre el microprocesador en sí y su programación. Pero todavía tengo que ver un libro que realmente hable sobre la instalación de todos los componentes usted mismo (microprocesador, memoria, energía, etc.). Si pudiera encontrar algo que me guíe, estaría en el negocio. (Quiero aprender desde cero). Sin mencionar que no tengo idea de cómo se comunicarían entre ellos.

Odio enviarte a otro lado, pero si estás interesado en los AVR, debes conocer AVRfreaks.net .
Sí, me inclino por AVR... principalmente porque tienen MUCHA información sobre ellos, y son MUCHO más baratos que el TI-MPS430...
AVR es popular entre los aficionados, pero no estoy seguro de dónde obtiene los datos de costos. Ambas familias tienen algunas ofertas que cuestan menos de 1 USD y otras que alcanzan los 20 USD.
Bueno... cuando miraba el MPS430, parecía que el software (depuradores, etc.) era un poco caro cuando se añadía a las placas de desarrollo.
Mi consejo es que no elija MSP430 si es un principiante. Las herramientas oficiales son buenas, pero el soporte gratuito que encontrará en línea no coincide con PIC/AVR.
Esto es antiguo en este punto, pero debe tenerse en cuenta que Arduino es AVR. Arduino es solo una plataforma de desarrollo que utiliza el hardware AVR.

Respuestas (11)

Aprendí en un 68HC11 en la universidad. Es muy sencillo trabajar con ellos, pero, sinceramente, la mayoría de los microcontroladores de baja potencia serán similares (AVR, 8051, PIC, MSP430). Lo más importante que agregará complejidad a la programación ASM para microcontroladores es la cantidad y el tipo de modos de direccionamiento de memoria admitidos . Debe evitar los dispositivos más complicados al principio, como los procesadores ARM de gama alta.

Probablemente recomendaría el MSP430 como un buen punto de partida. Tal vez escriba un programa en C y aprenda reemplazando varias funciones con ensamblaje en línea. Comience simple, x + y = z, etc.

Después de haber reemplazado una función o algoritmo con ensamblador, compare y contraste cómo lo codificó y lo que generó el compilador de C. En mi opinión, esta es probablemente una de las mejores formas de aprender a ensamblar y, al mismo tiempo, aprender cómo funciona un compilador, lo cual es increíblemente valioso como programador integrado. Solo asegúrese de desactivar las optimizaciones en el compilador de C al principio o probablemente se sentirá muy confundido por el código generado por el compilador. Active gradualmente las optimizaciones y observe lo que hace el compilador.

RISC frente a CISC

RISC significa 'Computación de conjunto de instrucciones reducido', no se refiere a un conjunto de instrucciones en particular, sino solo a una estrategia de diseño que dice que la CPU tiene un conjunto de instrucciones mínimo. Pocas instrucciones que cada uno hace algo básico. No existe una definición estrictamente técnica de lo que se necesita para 'ser RISC'. Por otro lado, las arquitecturas CISC tienen muchas instrucciones pero cada una 'hace más'.

Las ventajas previstas de RISC son que el diseño de su CPU necesita menos transistores, lo que significa menos uso de energía (grande para los microcontroladores), más barato de fabricar y velocidades de reloj más altas que conducen a un mayor rendimiento. El menor uso de energía y la fabricación más barata son generalmente ciertas, el mayor rendimiento no ha estado a la altura de la meta como resultado de las mejoras de diseño en las arquitecturas CISC.

Casi todos los núcleos de CPU son diseños RISC o 'intermedios' en la actualidad. Incluso con la arquitectura CISC más famosa (o infame), x86. Las CPU x86 modernas son internamente núcleos similares a RISC con un decodificador atornillado en la parte frontal que descompone las instrucciones x86 en múltiples instrucciones similares a RISC. Creo que Intel las llama 'microoperaciones'.

En cuanto a cuál (RISC vs CISC) es más fácil de aprender en el ensamblaje, creo que es un error. Hacer algo con un conjunto de instrucciones RISC generalmente requiere más líneas de ensamblaje que hacer lo mismo con un conjunto de instrucciones CISC. Por otro lado, los conjuntos de instrucciones CISC son más complicados de aprender debido a la mayor cantidad de instrucciones disponibles.

La mayor parte de la razón por la que CISC tiene una mala reputación es que x86 es, con mucho, el ejemplo más común y es un poco complicado trabajar con él. Creo que eso se debe principalmente a que el conjunto de instrucciones x86 es muy antiguo y se ha ampliado media docena o más de veces manteniendo la compatibilidad con versiones anteriores. Incluso su Core i7 de 4,5 Ghz puede ejecutarse en modo 286 (y lo hace al arrancar).

En cuanto a que ARM sea una arquitectura RISC, lo consideraría moderadamente discutible. Sin duda, es una arquitectura de almacenamiento de carga. El conjunto de instrucciones base es similar a RISC, pero en revisiones recientes el conjunto de instrucciones ha crecido bastante hasta el punto en que personalmente lo consideraría más como un término medio entre RISC y CISC. El conjunto de instrucciones del pulgar es realmente el más 'RISCish' de los conjuntos de instrucciones ARM.

@Mark: los ARM también son procesadores RISC, el conjunto de instrucciones no es tan malo. En realidad, está bastante bien diseñado; hay algunas instrucciones para la diferenciación entre el espacio de usuario y el espacio del kernel y otras complejidades, pero se pueden ignorar mientras comienza.
@reemrevnivek Estaba más tratando de alejarlo de las complejidades de lidiar con múltiples modos de procesador y MMU cuando comenzó con ASM, razón por la cual mencioné los ARM de gama alta. La inicialización y configuración de los SoC ARM de gama alta también es sustancialmente más compleja que algo como un AVR/PIC/MSP430.
¿RISC? No estoy seguro de entender la diferencia entre eso y lo que sean los demás... ¿quieres explicarlo? ¿No son la mayoría de los microcontroladores RISC? solo significa menos conjuntos de instrucciones, ¿correcto?
@sauron Agregué a mi respuesta re:RISC vs CISC.
¿Son cosas como AVR/PICS generalmente RISC o CISC?
@sauron son RISC, no conozco ningún núcleo CISC en microcontroladores.
@Mark 8051 son CISC
Totalmente no actual, pero encuentro que aprender a ensamblar compilando C es muy difícil, ya que básicamente está tratando de aprender más sobre las convenciones de llamadas y cómo ese compilador genera asm que el ensamblador en sí ...
Empecé con el 68HC12! Hay libros realmente excelentes sobre el lenguaje ensamblador 6800 (que es muy similar a 68HC12 ASM). El texto de Leventhal comienza básicamente sin conocimiento de las computadoras.

Creo que los microcontroladores PIC de 8 bits son la mejor opción debido al reducido número de instrucciones.

El efecto secundario del número reducido de instrucciones es que tienes que reinventar la rueda en comparación con otros microcontroladores con más instrucciones.

Pero después de aprender con PIC, puede migrar a otros microcontroladores y ver cuál se adapta mejor a sus necesidades.

No estaría totalmente en desacuerdo ya que esto es lo que estoy explorando ahora, pero los núcleos de 8, 16 y 32 bits tienen estrategias asm totalmente diferentes.

Similar a la sugerencia de Mark del 68HC11, el conjunto de instrucciones de la familia Freescale 68HCS08 es una versión reducida del Motorola 6809, que pensé que tenía uno de los conjuntos de instrucciones de 8 bits más limpios de su tiempo. Puede obtener una placa de desarrollo con interruptores, LED, acelerómetro de 3 ejes y zumbador piezoeléctrico por $ 79 aquí .

La cantidad reducida de registros que tiene el S08 en comparación con el HC11 puede hacer que las cosas sean un poco más difíciles desde el principio, ya que tendrá que descubrir que la pila hace mucho de cualquier cosa (que se enseñó más tarde en mi laboratorio con HC11 (o fue así). 12's)). Por extensión, los AVR son realmente buenos porque tienes la friolera de 32 registros para jugar antes de preocuparte por la pila.
De hecho, me gusta la simplicidad del acumulador único, aunque puede ser un cuello de botella. En lugar de usar la pila para las variables temporales, para empezar me resulta más sencillo usar los 144 bytes de las variables de página directa a las que se puede acceder con instrucciones más cortas (los otros 112 bytes de la página directa se usan para registros de E/S). El uso de la pila (que permite las rutinas de reentrada y recursivas) se puede aprender más adelante.
¿No se derivó el HC(S)08 del HC05?
@Johan.A Sí, tienes toda la razón. El HCS08 es una versión mejorada del HC05. Debería haber mencionado eso. Creo que la derivación es algo así como 6800 -> 6801 -> 6805 -> HC(S)08. Escribí una gran cantidad de código ensamblador para el 6805. Comparé el HCS08 con el 6809 para relacionarlo con los otros comentarios sobre el 68HC11 (que es aproximadamente una versión de microcontrolador del 6809).

El conjunto de instrucciones msp430 es bueno para aprender ensamblador. Evite x86. Arm es otro buen pero tiene muchas más instrucciones y opciones y puede que no sea el más adecuado como primer conjunto de instrucciones. Thumb es un subconjunto del conjunto de instrucciones arm y no está mal, en github tengo un emulador de pulgar (thumbulator) y un emulador de msp430 (no probado tanto como el de pulgar) que son básicos, solo el procesador y la memoria y poco más , para que pueda obtener una buena visibilidad de lo que está sucediendo. Una alternativa sería qemu, por ejemplo, donde la visibilidad está ahí pero es mucho más difícil de alcanzar, del mismo modo, con una solución similar a qemu, se necesita mucho más trabajo antes de averiguar si tiene algo que funcione.
vaya a mspgcc4.sf.net para crear una cadena de herramientas y/o binutils de stock (./configure --target=msp430 --prefix=/something) en combinación con un llvm de stock. Una vez que esté listo para el hardware, una placa de desarrollo msp430 cuesta menos de 5 dólares. Para las herramientas de brazo/pulgar, solo obtenga la versión lite de codesourcery. Una placa cortex-m3 (thumb/thumb2) cuesta alrededor de 12 dólares en este momento. Evitaría x86 y avr y otros como un primer conjunto de instrucciones, querrá aprender otros para estar bien redondeado. El conjunto de instrucciones pic antiguo/original también es algo que vale la pena mirar. Podría escribir un simulador usted mismo en una tarde y aprender el ensamblador. No lo aprendería primero necesariamente, enseña algunas cosas interesantes, pero al mismo tiempo no escala y no es necesariamente representativo de las características comunes que se encuentran en la mayoría de los conjuntos de instrucciones. El msp430 me dio la sensación del pdp11, que es el primer conjunto de instrucciones que realmente aprendí, ambos tienen características bien redondeadas, en su mayoría ortogonales. Tanto el msp430 como los conjuntos de instrucciones pic del microchip están documentados en wikipedia, al menos como referencia, para obtener una imagen completa, obtenga las hojas de datos/manuales de los proveedores que describirán cada registro y modo de direccionamiento, reinicio/arranque, etc.

para el ensamblador solo necesita binutils, al menos para arm/thumb o msp430, y puede compilar el ensamblador y el enlazador. Si desea un compilador C desde el cual pueda examinar la salida del ensamblador como una herramienta de aprendizaje, entonces necesita mspgcc4 o codesourcery o simplemente use llvm para ambos.

Yo también aprendí en un 68HC11 en la universidad. Más bien sugieren esto sobre cualquier otra MPU/MCU, solo quería señalar que la placa de desarrollo que usamos tenía un programa de monitoreo. Entonces, desde una terminal tonta, podríamos recorrer el código y examinar los registros... Sugeriría que cuando sepa qué procesador se ajusta a sus requisitos, también verifique qué placas de desarrollo están disponibles con un programa de monitoreo.

El programa de monitoreo parece que sería muy útil. ¿Qué libro usaste para aprender esto? si te importa que pregunte....
Yo también tuve experiencia con el 68HC11 y el "Programa de monitoreo" se conoce como Buffalo Monitor . Básicamente, es solo un programa que se almacena en la ROM que se comunica en serie con su PC. Escribes en una terminal y el programa interpreta tus solicitudes y te devuelve información. Puede volcar la memoria en la pantalla, cambiar los valores de la memoria, recorrer las instrucciones, etc. La placa que usamos fue esta . Este controlador es fácil de aprender pero está muy anticuado.
... El libro que usamos fue este si te interesa. Sugeriría ir con un controlador más moderno como AVR; su placa de desarrollo se puede encontrar aquí .

Enseño tanto PIC (núcleo de 14 bits) como ensamblaje ARM. A la clase PIC les digo que una vez que hayan dominado la fealdad de esa arquitectura pueden asumir cualquier otra cosa. El ARM (¡no el Pulgar/Cortex!) es una arquitectura muy agradable para aprender a ensamblar. Usamos una placa LPC2148.


2019-12-29 actualización

Cambié a Cortex, primero al LPC1114/820, luego al Arduino Due. El Arduino Due es barato (de China), potente, se puede usar con C, C++, Assembler (y si quieres Python), y si realmente quieres, puedes usarlo con el IDE de Arduino. Prefiero mi propio sistema de compilación y la libre elección de un editor/IDE.

Hola Wouter, ¡qué bueno verte por aquí!

¿Seguro que quieres aprender Montaje? ¿Puedes decir por qué? Es toda una tarea, y es cada vez menos relevante o útil hoy en día. Esto es de una persona que ha escrito en él e incluso ha ensamblado a mano programas (sin ensamblador, enlazador, solo una tarjeta con el conjunto de instrucciones).

Esto no es realmente una respuesta, tanto como un comentario. También dudaría en confiar en un programador de C integrado que no estuviera dispuesto a caminar penosamente a través de fragmentos de ensamblaje de vez en cuando al tratar de comprender una rareza en el comportamiento de un proyecto.

Aprendí ensamblador de PIC de 16 bits con un dsPIC33F. El ensamblaje del procesador es bastante parecido a C, ya que admite punteros y tres operaciones variables (A = B + C, por ejemplo), lo que facilita mucho el aprendizaje y la adaptación.

Estás confundiendo microcontroladores y microprocesadores aquí. AVR es una línea de microcontroladores de Atmel, no un microprocesador. Le sugiero que primero busque en wikipedia para comprender mejor cuáles son las diferencias entre estos. Básicamente, un microcontrolador es un sistema más o menos completo, mientras que un microprocesador es solo la CPU (por lo tanto, un microcontrolador tiene un microprocesador en su interior).

Ya lo sabía, no sé por qué no puse eso. Quise decir que no muchas guías hablan sobre conectar un MP y una memoria (como flash o eeprom), etc.
Dado que la mayoría de los microprocesadores ahora tienen caché/memoria y algunas E/S, es una línea muy borrosa.
@Sauron - ¿Estás seguro de que lo sabías? Usaste MP de nuevo; un microcontrolador (que es el término correcto para un AVR y el 99 % de los dispositivos que analizamos aquí) casi siempre tiene memoria (no volátil, como EEPROM y Flash, y SRAM volátil) integrada. Aprenda a usar las cosas integradas antes de comenzar a aventurarse en los periféricos.

En mi universidad, nos enseñaron diseño/arquitectura de hardware junto con lenguaje ensamblador (los dos van de la mano, obviamente) con la arquitectura MIPS (o quizás DLX ). Desde entonces, he incursionado un poco en el ensamblaje de PIC y AVR en la escuela/trabajo, y todos son bastante similares. Creo que el ensamblaje de MIPS fue un excelente punto de partida, ya que el lenguaje es muy simple, al igual que la arquitectura del procesador.

Ver también: este libro . No es el mejor libro del mundo, pero es el libro estándar de diseño de computadoras para muchas universidades.

El Microchip PIC32 usa la arquitectura MIPS y es bastante fácil mezclar el ensamblador MIPS con C.

mi sugerencia es que cualquiera que vaya a comenzar a estudiar sobre microcontroladores y procesadores debe leer el libro que nombra "codificar el lenguaje oculto de la computadora" si estudia que casi es un experto en procesadores y para programar avr mejor use el programador poney prog y el programa de atmel studio6.1 del sitio oficial de atmel

Describa las características clave del libro y el programador, que inclinarían al OP a usarlas exactamente.
se trata de entender un microcontrolador como se desarrolla a partir de sistemas digitales y explica el lenguaje ensamblador
vaya a este sitio j.mp/mpcinterest para obtener ese libro