Aprenda a ensamblar ARM con la Raspberry Pi

Vivimos en una época en la que no es necesario saber el lenguaje ensamblador para trabajar con éxito con computadoras integradas. El procesador típico de hoy tiene recursos que habrían avergonzado a las primeras computadoras y algunas de las más grandes se están acercando a lo que era una poderosa máquina de escritorio hace solo unos años. A pesar de esto, hay algunos casos en los que realmente desea utilizar el lenguaje ensamblador. Quizás necesites más velocidad. O tal vez necesite un control muy preciso a lo largo del tiempo. Quizás te guste el desafío. [Robert G. Plantz] de la Universidad Estatal de Sonoma tiene un excelente libro en línea titulado "Introducción a la organización de computadoras: lenguaje de ensamblaje ARM usando la Raspberry Pi". Si está interesado en un lenguaje ensamblador ARM serio, realmente necesita consultar este libro.

Si está más interesado en el montaje x86-64 y Linux [Plantz] cubriste allí también. Ambos libros se pueden leer en línea y, si lo desea, puede obtener una versión impresa del libro de Linux por una pequeña tarifa.

Debido a que están destinados a ser libros de texto universitarios, no son de lectura rápida, pero también son mucho más detallados que la típica publicación de blog sobre cómo hacer una reunión. Incluso si no desea leer la portada, es posible que algunas de las entradas específicas sobre depuración e interacción con el código C le resulten útiles.

El libro Raspberry Pi está escrito usando un sistema llamado PreTeXt, que parece interesante. Nos gustó el aspecto del resultado, aunque sería útil si pudiera descartarlo en PDF para su lector de libros.

Quedamos muy impresionados por la amplitud de ambos libros. Anteriormente hemos analizado introducciones muy simples y breves. Incluso hicimos nuestras propias tomas cortas de Linux y montamos con C.

  • nuclear dice:

    ¡Dulce! Puedo jubilarme en menos de dos años y quiero reunirme. En mi clase de Laboratorio Físico Avanzado en la universidad, programamos una reunión en las máquinas Commodore 64. Conectamos convertidores A / D directamente al bus de direcciones en la CPU (a través de aisladores ópticos) y recibimos puntos de datos cada 10 ms.

    El profesor disparó una pistola de aire comprimido contra un bloque de madera; y obtuvimos una curva de datos de la desaceleración. Obtener un título en Ingeniería Física fue divertido.

    • Ren dice:

      ¡Ahora el convertidor A / D está en el chip!

      • Miseria dice:

        Entonces puedes disparar una pistola BB directamente a RasPi. (C:

    • fonz dice:

      ¿Por qué optoaislados? y 10 ms parece demasiado lento para ver algo de BB golpeando un bloque de madera

    • tekkieneet dice:

      Los optoaisladores son muy lentos: su retardo de propagación de microsegundos, si no más. No es adecuado para la interfaz directa al bus de la CPU. Si no está usando un suministro separado con una tierra separada, entonces no debería haber un optoaislador allí.

      Hay algunos niveles de lógica rápida / especializados en estos días, pero no están disponibles en ese momento.

      • longjohn119 dice:

        De acuerdo, pero estás hablando de una computadora de 1 MHz con velocidades de bus lentas ... Es un factor limitante más que los optoaisladores. Las entradas en ese entonces no eran exactamente tan duraderas como lo son hoy, por lo que definitivamente necesitaba optoaisladores

        Tenías que aprender una reunión y luego convertirla a PEEK y POKE en las rutinas básicas para tener cualquier velocidad. Tenía muchas rutinas de ensamblaje para mi impresora porque no tenías una resolución de pantalla para imprimir gráficos y esas rutinas gráficas también se ralentizaron. De hecho, las impresoras eran más potentes que la C-64 y al montarlas también se podían utilizar para un poco de procesamiento.

        • Martín dice:

          Necesita aisladores optois solo si tiene terrenos separados. De lo contrario, resistencias, transistores o búferes simples son el camino a seguir.
          Y con un reloj de CPU de 1MHz puede hacer un muestreo de 100kHz, al menos para escritura directa en la memoria (y limitado por su tamaño). Eso sería un muestreo de 10 µs, no de 10 ms.

          • nuclear dice:

            No. . . las resistencias y los transistores son muchos más componentes. Simplemente nos ocupamos de los cables a los optoaisladores de CI, simple. La CPU de 1 MHz no proporcionará un muestreo de 100 kHz. Algunos comandos requieren varios ciclos de reloj. Debe leer el bus de direcciones, luego calcular la siguiente dirección para almacenar los datos, luego transmitir los datos a la dirección y luego volver al bus de direcciones para el siguiente punto de datos.

            10 ms fue lo más rápido que pudimos conseguir con el C64 y fue muy rápido para conseguir una buena curva para ralentizar BB en un bloque.

    • marca dice:

      ¿Me pueden enviar un correo electrónico? Intentando evitar los bots con una dirección de correo electrónico. Soy mayor y estoy trabajando en un proyecto rasp-pi para escuelas, pero no tengo esta experiencia de interacción entre el dispositivo y la salida para los estudiantes. Intentando incrustar lenguaje ensamblador, NFC, pantallas, etc. Me gustaría chatear en vivo. -Marca

  • Bill Gates dice:

    ¿Por qué alguien querría programar en un ASSembly lento?

    Java es mucho más rápido y se acelera cada vez que se ejecuta el programa. Solo necesita unos pocos GB de RAM, algunos kernels y unos pocos GB de espacio en disco para las bibliotecas y clases auxiliares.

    El ensamblaje tiene todo tipo de riesgos de seguridad, ¡mientras que Java es seguro y protegido!

    Por qué arriesgarse a que su computadora se estrelle, Java es el futuro.

    • Sikri dice:

      fuerte, esto es una sátira.

    • Ren dice:

      ¿Estás seguro de que tu nombre no es B1ff?
      (Pido disculpas a otros lectores por alimentar al troll)

      • Transistor torcido dice:

        No es un troll. Creo que @Sikri tiene razón: D

  • Ren dice:

    Entendí mal su comentario sobre PreTeXt, temía tener que descargar e instalar un nuevo programa solo para leerlo, pero veo que el libro (en línea) es HTML.

  • Sikri dice:

    También gracias por estos chicos. Solo por curiosidad, ¿qué tan diferente es el montaje para, digamos, el AVR?

    • Transistor torcido dice:

      Muchos libros sobre ese tema y algunas cosas introductorias muy simples que puede llevar a cosas más avanzadas.

    • Preferir Linux dice:

      Es bastante similar, pero diferente. Pero mucho más cercano que ambos está al conjunto x86.

    • Im_Int dice:

      Diferentes conjuntos de instrucciones. Mismos principios. AVR es más simple. No tengo experiencia escribiendo código ensamblador para AVR, pero puedo leer la salida ensamblada bastante bien porque la mayoría consta de unas pocas instrucciones que recuerdo sin consultar el manual. El sistema de grabación también es muy simple en AVR.

  • rclark dice:

    Puede que me lo haya perdido arriba, pero hay un buen libro introductorio sobre esto llamado "Principiantes Raspbian en lenguaje ensamblador" de Bruce Smith. "Me gustó de todos modos como una buena introducción a un ensamblaje ARM (32 bits). encima.

    Como antes, cuando me jubile, profundizaré en la escritura de programas (simples) juntos cuando la máxima "productividad" no importe. Son mis máquinas, así que no se preocupe si el programa se bloquea, o incluso la máquina. También comencé a colaborar en 6502 en la universidad y en VAX, luego algunos conductores en Z80, 68XXX, en mi RT trabajaban para proyectos automatizados. Incursioné en la tierra x86 cuando tuve que escribir algoritmos gráficos para componer y obtener la máxima velocidad de ellos. Sí, quiero volver a eso ... por diversión. Extraño escribir programas en los que escribes instrucciones en el procesador sin un compilador que lo haga por ti.

  • Timothy D Legg dice:

    El enlace del libro se rompió antes. La página se está cargando ahora, pero terriblemente lento. Ojalá alguien convierta esto en un PDF para él.

  • corrimiento al rojo dice:

    Un tema muy interesante que hoy se pasa por alto. Pospuse esto, pero es un tema que siempre quise estudiar.

  • fonz dice:

    "Más velocidad": la mayoría de la gente tendrá dificultades para vencer a un compilador moderno en cualquier cosa que no sea la característica más pequeña.
    "Control de tiempo preciso", esto está fuera de la ventana de inicio cuando está ejecutando un sistema operativo como linux / windows

    El ensamblador es una buena forma de darse cuenta de cómo funciona la CPU y, a veces, de depurar, pero la mayoría de las veces tiene poco uso práctico.

    • impresionante garra dice:

      Muchos compiladores todavía no hacen un buen uso de las extensiones vectoriales modernas, por lo que la gente ciertamente puede hacer un buen trabajo allí. Por supuesto, generalmente puede usarlos con programas internos, por lo que no necesita comenzar a ensamblar.

      También un control de tiempo preciso fuera de la ventana tan pronto como use algo mucho más complejo que AVR; incluso los núcleos ARM más pequeños vienen con cachés y predicciones de rama, y ​​cualquier superescala hará que sea muy difícil obtener una sincronización precisa.

      Por supuesto, si desea configurar un sistema o escribir un compilador (o un compilador JIT, con el que paso la mayor parte del tiempo), necesitará una buena comprensión del ensamblaje e incluso del código máquina.

      • asdf dice:

        Los microcontroladores ARM generalmente se pueden configurar para operar en momentos deterministas, pero generalmente requiere renunciar a un rendimiento significativo (no hay una predicción dinámica de ramas, pero la preparación de flash e incluso los cachés pequeños dan un gran impulso de velocidad a frecuencias de reloj más altas).

  • jawnhenry dice:

    Hay algunas pruebas muy básicas que se pueden utilizar para responder a la pregunta: "¿Se puede programar la Raspberry Pi (o el procesador IU, de hecho) en lenguaje ensamblador? -

    1. Obtenga un “Modelo de programa” completo del fabricante del procesador;
    2. Obtener un conjunto completo de instrucciones descriptivas del procesador, incluido el código de máquina y la sincronización, del fabricante;
    3. Obtener una descripción completa y completa del mecanismo disruptivo del procesador, incluso latencia;
    4. Obtener una descripción completa y completa de la Tabla de vectores de interrupción del procesador y dónde debe residir en el mapa de memoria;
    5. Consíguelo (saber absolutamente) la dirección inicial requerida para la primera palabra 'inicial';
    6. Para poder obtener una completo, completo y moderno - en todos los sentidos de la palabra -Asambleísta; gratis o de pago, no importa; pero uno absolutamente debe estar disponible;
    7. Obtenga del fabricante del procesador cualquier límite sobre la ubicación y ubicación de la pila dentro del mapa de memoria.

    Si uno no puede obtener respuestas a todos estos procesos de ensamblaje MUY simples BAZO, uno no aprenderá el lenguaje ensamblador específico del procesador, desde alguien máquina. Estos son los conceptos básicos. No hay atajos.
    En pocas palabras: si no puede obtener total transparencia de un fabricante sobre la programación de uno de sus procesadores, NO aprenderá a programar ese procesador en lenguaje ensamblador.

    Hay algunos "modelos" de "enseñanza" del lenguaje ensamblador de Raspberry Pi que tienen como objetivo hacer una programación "experta" del lenguaje ensamblador mediante el proceso inverso de escribir código avanzado primero, y ESO mirando el lenguaje de máquina producido después de este código por un compilador . Esto simplemente no funciona. Nunca; nunca lo haré. Ahorre su dinero.
    Como Douglas Adams ("Guía del excursionista Galaxy ”) dice -
    "Lo primero que separas de un gato es un gato muerto".

    No es una 'bala mágica' no es una manera fácil aprender lenguaje ensamblador, aunque Assembly Language lo ingresó en la lista IEEE de los lenguajes de programación más deseables en el Top 10 de este año .
    Es posible que desee darles una pista a los expertos.

    • impresionante garra dice:

      Realmente no necesita información sobre la mayoría de estas cosas para aprender una reunión, porque es perfectamente posible escribir un programa de reuniones útil donde la mayoría de esas cosas son manejadas por el sistema operativo. Tampoco es necesario que conozca las latencias de instrucción o interrupción (y en algunos casos, como cuando intenta escribir código que funcionará con una variedad de máquinas, ni siquiera sabe qué latencia de una máquina necesita ser consciente de). La mayoría de las máquinas modernas a gran escala también tendrán latencias de interrupción e instrucción variable según el estado de la canalización.

      • jawnhenry dice:

        Esta es una indicación VERDADERA para usted y para todos los demás que quieran PENSAR que son programadores en lenguaje ensamblador, Y además de una indicación de que usted lo es, más allá de una sombra de duda, siendo engañado por todos esos libros que te dicen que MÁGICAMENTE te convertirán en un programador de idiomas de conjunto sin absolutamente NINGÚN trabajo duro - TOTALMENTE - necesario :

        SI SU PROGRAMA NECESITA UN SISTEMA FUNCIONAL PARA EJECUTAR, NO ES UN PROGRAMA DE LENGUAJE DE MONTAJE. PERÍODO. .

        Haga que esta declaración sea tallada en granito. Ponlo en tu escritorio.

        [From a previous comment] No solo necesitas "... la mayor parte de eso" ...cosas> ", necesitas TODOS de esa "cosa", así como un elemento MUY importante más que la mayoría de la gente encontrará como un factor decisivo insuperable: TRABAJO DURO.

        ¿Necesita una prueba absolutamente concreta e inexpugnable? Intente conseguir un trabajo como programador en lenguaje ensamblador sin seguir este camino.

        Buena suerte

        • impresionante garra dice:

          Eso es literalmente, de hecho, falso, y está claro que no le interesa tener una conversación real sobre esto.

          • Ren dice:

            Sí, es casi como si nunca hubiera oído hablar de "Llamadas al sistema" en C o Java ...

          • jawnhenry dice:

            Equivocado.

            Tuve una conversación.
            ¿Aparte del rápido e ingenioso e informativo "Eso es literalmente, en realidad falso ..." cuando obtenemos de usted algo incluso un poco como una conversación sobre este tema?

            Lo único "... claro ..." es que no escribes programas de lenguaje conjunto, ¿verdad?
            -
            Sus ejemplos de su experiencia de programación de lenguaje de reuniones, obviamente ganada con tanto esfuerzo, junto con detalles de la máquinas que ha programado, absolutamente todos los esperan ansiosamente.

            Súper ...

          • jawnhenry dice:

            @ Ren–

            "Sí ..."

            SI SU PROGRAMA NECESITA UN SISTEMA FUNCIONAL PARA EJECUTAR, NO ES UN PROGRAMA DE LENGUAJE DE MONTAJE. PERÍODO.

            También (no puede) programar en lenguaje ensamblador, ¿verdad?

          • jawnhenry dice:

            Porque, obviamente, es muy difícil para ti entender este punto: es un hecho ridículo. tener No comenzó la conversación.

            Todos simplemente no podemos esperar ...

        • rclark dice:

          Tuvimos que aprender las especificaciones del dispositivo usando una placa Z80 que diseñó mi antigua empresa y escribir algunos paquetes de soporte de placa para placas 68xxx. No para los débiles de corazón. Como advertencia, cuando abordé, solo tuve que "guardar" el código Z80 y agregar algunas características ¡gracias a Dios! El código Z80 era un programa monolítico "uno" escrito en conjunto. Cree un archivo hexadecimal y grábelo en EPROM. En las placas 68XXX, algún código de inicio de ensamblador que realizó toda la configuración y luego lo entregó al programa en tiempo real para que se ejecutara. En la familia 68XXX usamos VRTX RTOS, por lo que escribimos algunas secciones solo juntas (como controladores de puerta en serie), pero un programa principal escrito en C (kruckompile). Estos también fueron quemados a EPROM (más tarde relámpago). El RPI, creo, no tiene que escribir el código de inicio SD (propietario, según recuerdo), porque probé FreeRTOS en el RPI (prueba de parpadeo de la luz). Aproximadamente cuánto obtuve hace unos años para probar RTOS en RPI.

          En esta etapa de mi vida, me contentaré con escribir algunos programas de montaje en modo de usuario además de un sistema operativo como Linux, en lugar de escribir un cargador de arranque y un sistema operativo desde el principio. No hay planes para conseguir un trabajo en la redacción de programas en lenguaje ensamblador en el corto plazo. La programación en lenguaje completo es "difícil" y estoy de acuerdo en que no existe una "varita mágica" para convertirlo en un programador de ensamblaje inteligente. Dicho esto, si simplemente me gusta (siéntase libre de admitirlo), y no un "programador de ensamblaje real" según su definición, bueno, está bien para mí :).

          • Patrick J. Scott dice:

            Yo también. Construí un sistema y placas Z80, y luego tuve que hacerlos funcionar. Primero en ensamblaje y luego en CP / M. El sistema operativo ayuda a obtener resultados rápidamente, pero con compensaciones que incluyen la pérdida de control de los procesos básicos. Pero no tengo que escribir un controlador para los discos duros o la comunicación en serie, es decir, si los desarrolladores de montaje pueden hacer brillar mejor.

        • fonz dice:

          Una completa tontería, un programa escrito en ensamblador es un programa en lenguaje ensamblador, no importa dónde y cómo se ejecute.

          su lista de requisitos está más relacionada con la Programación Bare-Metal, que en algunas plataformas como Cortex-M se puede hacer completamente en C sin un conjunto necesario

        • RobHeffo dice:

          Toma tu guardia de la puerta y déjalo. Escribir una función de lenguaje de montaje optimizado a mano dentro de un programa C es válido, así como arrancar la CPU y el hardware directamente en el montaje.

          “Dicen que la gran ciencia se construye sobre los hombros de los gigantes. Aqui no. En Aperture, hacemos toda nuestra ciencia desde cero. Sin agarrar la mano "- Jawnhenry (probablemente)

        • Harry dice:

          Jawn, piénsalo de esa manera. Programa conjunto. es como un tractor en un semirremolque, realmente puede funcionar por sí solo, pero puede tirar de un remolque donde el lenguaje ensamblador también puede trabajar junto con otros programas y dar más funcionalidad. Si cree que el lenguaje ensamblador está destinado a funcionar por sí solo, vuelva a la escuela y averigüe los otros usos que tiene para poder aprovechar al máximo su uso. Extrañas maravillosamente lo que sabes si realmente crees lo que dices. Acabo de encontrar este texto hoy, así que es tarde, pero es más creativo. Jawn, las únicas limitaciones de una computadora son tu imaginación y la tuya no va mucho ahora.

    • HaxGrrl dice:

      Todos están disponibles para ARM, aunque los tiempos y latencias específicos varían ligeramente entre núcleos. Además, algunos de los Arms de mayor calidad agregan conductos de múltiples etapas, predicción de rama y jerarquía de caché, que también debe considerar para obtener mejores resultados. Puede ser un poco molesto reunir cierta información (la extensa documentación de ARM está terriblemente formateada, por ejemplo), pero está todo ahí.

  • Rpi dice:

    ¿Solo bob.cs.sonoma.edu o yo estamos discapacitados? Tuve varias pestañas abiertas en el sitio tan recientemente como hace unos días, pero ahora todas caducaron.

  • PaulEmbedded dice:

    Acabo de comenzar a leer este libro y está solo en el capítulo 5. Solo hay una cosa: la ecuación en 5.5.8 se puede simplificar aún más a: '(x + y), requiriendo solo 1 puerta NO y 1 puerta A OR .

Nora Prieto
Nora Prieto

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *