C++ : Ámbitos, parámetros y funciones en ensamblador x86 de 32 bits

แชร์
ฝัง
  • เผยแพร่เมื่อ 4 พ.ย. 2024

ความคิดเห็น • 9

  • @jcanocandela
    @jcanocandela 3 ปีที่แล้ว +7

    No he visto nada mejor que el Profesor Retroman. No he visto a nadie explicar tan bien algo que domina a la perfección. Le sigo desde que buscaba información sobre z80 y no me pierdo nada. Si tuviera 20 años menos, me matriculaba en la Universidad de Alicante sin pensarlo. Viva Amstrad y viva Fran Gallego.

  • @omar-C24
    @omar-C24 2 ปีที่แล้ว +2

    Excelentes sus videos Profesor!! Un maestro! Solamente decir Gracias por tanto!!

  • @mentalthink1
    @mentalthink1 3 ปีที่แล้ว +3

    Gracias Fran como siempre, esto es oro puro, yo personalmente no sabría dónde encontrar la info que das en estos vídeos en Castellano, se agradece y mucho para la gente que no tenemos estudios... Gracias nuevamente, para mi es Gloria todo esto.

  • @dipsiecamila
    @dipsiecamila ปีที่แล้ว +1

    Me gustan sus clases, usted disfruta enseñar.
    @27:38 en la línea 16 dice: mov [spx], eax. Y antes habíamos dicho mov eax, msg donde msg es el apuntador a un arreglo de bit de caracteres.
    Lo cual yo interpretaría como asignar a la dirección de memoria donde está apuntando el registro spx el valor de eax que contiene el apuntador a la cadena msg. Resolviendo tendríamos que decir que esto es: asignar a la dirección de memoria donde está apuntando el registro spx la dirección de memoria de msg.
    Cuando voy a asignar un valor a spx, por ejemplo mov spx, eax se toma el contenido de eax y lo coloca en el registro spx, pero si uso mov [spx], eax quiere decir que pone en la dirección de memoria que contiene spx el valor de eax.
    La pregunta es: Como eax es un registro de memoria; yo no tengo que usar [eax] para indicar que lo que quiero es el contenido?

    • @ProfesorRetroman
      @ProfesorRetroman  ปีที่แล้ว +3

      Muchas gracias por tus palabras. Me alegro de que mis clases te sean útiles.
      Una primera cosa que te recomiendo es que elimines de tu vocabulario todas las palabras que conoces de lenguajes de alto nivel. No uses las palabras "apuntador", "arreglo", "asignar", "cadena" etc. Todas esas palabras están cargadas de ideas y modelos mentales que nos formamos que suelen ser incorrectos hasta que los corregimos. Usar las palabras hace que asocies modelos que ya tienes con situaciones que están ocurriendo, lo que te va a dificultar enormemente el aprendizaje por dos motivos: (1) porque los conceptos son distintos y (2) porque puedes tener errores en tus modelos y los estás transportando con las palabras.
      Dicho esto, piensa en lo siguiente. Sólo hay RAM (memoria) y Registros. La RAM y los registros se pueden leer o escribir. En la RAM o en los registros tienes datos. Esos son todos los conceptos que debes manejar para reflexionar. Observa ahora.
      1. La instrucción mov [esp], eax lo que hace es escribir en la RAM (porque los [] hacen referencia a la memoria). Escribe el dato que tenemos en EAX. Ese dato es un valor de 4 bytes, que es lo que puede tener EAX. Esos 4 bytes se escribirán en un lugar de la RAM, ese lugar, esa dirección, es la que indica el registro ESP con su valor.
      2. La instrucción mov eax, msg lo que hace es escribir en el registro EAX (modifica EAX). Escribe ahí un valor, porque eso es lo único que se puede escribir en EAX (un valor de 4 bytes). Por tanto, msg tiene que ser también un valor de 4 bytes. msg es una etiqueta. Las etiquetas son "un número al que hemos puesto nombre". Es decir, ese nombre, esa etiqueta, es exactamente lo mismo que si pusiéramos el número que representa. Y el número que una etiqueta representa es el de una dirección de memoria. Cuando ensamblamos el código, vamos generando bytes (código máquina) con las instrucciones y datos. Todos esos bytes son el programa y sus datos que serán luego cargados en memoria cuando ejecutemos, pero que los ponemos en un archivo (el ejecutable). El primero de esos bytes es la dirección 'relativa' 0, y cada byte que genera el programa ensamblador conforme traduce es +1 a esa dirección. Cuando llega a tracucir "msg:" ese contador es el que indica el valor que representará msg (la dirección relativa de memoria, respecto al comienzo del programa). La dirección es relativa porque mientras ensamblamos no sabemos dónde se cargará en memoria. Si luego se cargase en la dirección 1000, sólo habría que sumar 1000 a todas las direcciones relativas y ya está, pero eso es después.
      3. EAX no es un registro de memoria, porque ese concepto no existe. EAX es un registro. Un registro contiene un dato, un valor. EAX es de 4 bytes, por tanto contiene 4 bytes. Lo que esos 4 bytes signifiquen es cosa nuestra, del programador, no del registro. El significado se lo damos según el uso que hacemos, nada más. El registro no tiene conceptos ni "sabe" qué significa el valor que contiene.
      4. El valor de EAX es msg, y msg es la dirección de memoria donde comienzan nuestros datos del texto. Esa dirección es la que necesita printf para saber dónde en la memoria están guardados los bytes que representan el texto.
      5. Analicemos que pasa si escribiéramos en [esp] (en la RAM, en la posición indicada por ESP) lo que hay en la ram en [eax]. ¿Qué hay en [eax]? Pues si EAX es la posición de memoria donde EMPIEZAN (la primera) los bytes del mensaje, en ese byte estará el valor del primer carácter del mensaje. Por tanto [eax], sería el byte de la 'H' de "Hola" (es decir, el valor 104). Si escribiéramos eso en [esp] estaríamos escribiendo un 104, con lo que printf intentaría ir a la dirección de memoria 104, pensando que ahí es donde va a encontrar los caracteres. De nuevo, los valores que se escriben en memoria no son nada, sólo son datos. Escribimos un 104, printf lee un 104, y printf lo interpreta como él espera interpretarlo, porque él espera que ese dato sea una dirección de memoria. El dato sólo es un valor, su uso es el que genera la interpretación, y printf lo usará así.
      6. Por último decir que mov [esp], [eax] no existe como instrucción. No sería posible hacerla. Las isntrucciones mov no pueden tener 2 operandos que sean memoria.
      Espero que esto te ayude a entender mejor :)

  • @angelanavarrete3864
    @angelanavarrete3864 3 ปีที่แล้ว +2

    21:38 No la has liado parda ni ha funcionado de manera misteriosa: hay un mov esp, ebp en la línea 17 antes de pop ebp Para eso, entre otras cosas, es el convenio de marco de pila, asi se evita el tener que ejecutar unos cuantos pop, y se ahorran bastantes ciclos de reloj del procesador (más cuantos más parametros use la función llamada).

    • @ProfesorRetroman
      @ProfesorRetroman  3 ปีที่แล้ว +4

      Por supuesto, Ángela. Tienes toda la razón. En el momento quise explicar los detalles de introducir y recuperar valores y posiciones de la pila a mano y la lié, pero con la explicación en vez de con la pila ☺️. Me alegra mucho ver en comentarios que os dais cuenta y me corregís este y otros detalles. Muchas gracias por la atención al detalle y por puntualizarme cosas importantes como está 🙂

  • @James-fo8rf
    @James-fo8rf 3 ปีที่แล้ว +2

    Any chance of auto English sub titles? 😭

    • @ProfesorRetroman
      @ProfesorRetroman  3 ปีที่แล้ว +4

      I have tried personally to activate youtube autogenerated spanish subtitles and, afterwards, select translate automatically to English and it works. It won't be perfect, but it might do the trick :)