Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Manejo Básico de la Memoria

–La Memoria No Se Crea Ni Se Destruye–

Como dijera hace ya bastante tiempo, una celda de byte es como una caja que puede guardar un número entre cero y 255 (8 bits). Sin embargo, las computadoras de hoy no tienen una sola de estas celdas, sino miles de millones de ellas. De hecho, un sistema de 32 bits. Como el que usan la mayoría de los civiles desde mediados de los años ochenta tiene capacidad de manejar 2 a la 32 celdas, que nos da un fabuloso total de 4,294,967,296. La verdad es que desde el 80386 de Intel, ya era posible manejar estas cantidades de memoria, pero era demasiado costoso construir una computadora con tal capacidad. Apenas ahora, mas de 20 años después comienzan a venderse equipos con esta capacidad (y dicen que el Windows Vista no puede manejar los últimos 500 megabytes). Para que se den una idea, si nos tomara un segundo escribir en cada una de esas 4,294,967,296 celdas, el tiempo que nos tomaría llenarlas todas sería de ¡Mas de 136 años! Y es apenas un poco mas de lo que puede almacenar uno de esos DVD’s violetas que venden los piratas en el mercado negro. Aún recuerdo que hace mucho leí en la revista de Aunque Ud No lo Crea de Ripley que estaba en desarrollo “un disco capaz de almacenar toda la historia de la humanidad”. Bueno, creo que ya di el mensaje, en resumen, la memoria es como una calle y cada celda de byte como una casa. Para llegar a una casa de la calle en particular necesitamos conocer el número que identifica esa casa de manera única. Y es aquí donde entra el famoso Addressing.

En inglés, la palabra ‘Address’ se traduce al español como ‘Domicilio’ y la terminación ‘ing’ significa ‘hacer una acción’. Entonces, Addressing podría traducirse como ‘el trabajo de ubicar un domicilio’. Algunos maestros malpagados traducen Addressing como ‘direccionamiento’ pero tal palabra carece de sentido en español. Quizas ‘posicionamiento’ sería mejor. Bueno, en el dibujo muestra como se almacena en la memoria la frase HOLA MUNDO!. Para empezar, tenemos que convertir estas mundanas letras en valores digitales, existe algo llamado Código ASCII que se usa para representar letras y números en idioma inglés. En este sistema a cada letra le corresponde un número que cabe exactamente en una celda de byte. Mas adelante explicaré la equivalencia. Por ahora aquí está su correspondiente valor hexadecimal:


H	48h
O	4Fh
L	4Ch
A	41h
        20h
M	4Dh
U	55h
N	4Eh
D	44h
O	4Fh
!	21h

Este saludo mide exactamente 11 bytes. Cabe aclarar que el sistema ASCII (cuyas letras significan American Standard Code for Information Interchange o Código Estandar Americano para Intercambio de Información) no solo representa letras, sino números, signos de puntuación y señales de control que aún se usan en algunos sistemas de comunicación hoy en día. El caso de 20h, que es 32 decimal, es el famoso Espacio en blanco. (lo que sale en el chat cuando aplastas la barra espaciadora)


cuadro gris

Ahora analicemos detenidamente el profesionalísimo diagrama hecho en PAINT que acompaña esta entrada. (La verdad es que el Paint es el único programa de diseño gráfico cuya licencia puedo pagar, aparte de que soy demasiado flojo para aprender a usar GIMP)

Las letras en color azul indican la posición de las celdas de memoria. Es como quien dice el número de las casas. Las celdas de memoria de un byte, se muestran en gris y el contenido de estas es rojo. Como dice arriba. Cada símbolo es representado por un byte. Otro detalle es algo llamado ASCII-Z. En el caso de Windows. Podemos representar una cadena con espacios en blanco, cambios de linea, tabulaciones y hasta una ensordecedora campana. Esto se hace con los bytes de control (cuyo valor está entre 0 y 31). Precisamente el cero se usa para finalizar una de estas cadenas de bytes. Entonces. El sistema sabrá que ha llegado al final del texto cuando se tope cara a cara con un cero. No olviden que todos los valores, tanto los de las posiciones de memoria como sus contenidos, están en Hexadecimal.

Algo mas sobre las posiciones de memoria. Estas son también conocidas como OFFSET. (Nada que ver con el OzzFest de Ozzy Osborne). En resumidas cuentas, una cosa es el contenido de una celda de memoria y otra cosa la posición en la que esta se localiza con respecto a las demás. Supongo que esto es suficientemente claro para quienes no han programado nunca en su vida. Pero para aquellos que se creen mucho porque les pagan por hacer querys o clientes de bases de datos en algún lenguajito interpretado de esos que están tan de moda. De seguro se estarán preguntando que tiene esto que ver con las variables. A aquellos, y también a los ‘lamer plus plus’ que alguna vez usaron C/C – -. Solo tengo que decirles una palabra: *PUNTEROS.

>>>>Pasa al siguiente nivel>>>>

***Esta nota pertenece a “La Saga del Completo Principiante”*** Da click en este enlace para pasar a la siguiente entrada de esta serie.

Anuncios

enero 7, 2009 - Posted by | Uncategorized | ,

21 comentarios »

  1. Hola si en eso tienes toda la razon hay lenguajes que dicen ser de alto nivel, pero alto nivel para quien ¡para el lenguaje!, ya que todo lo hace el ide cortar y pegar y el programador jeje programdor, perdon el dibujante cortar y pegar ya no tiene que hacer nada, y respecto al c yo programo sobre este y si lo mejor que tiene son los punteros y hay quienes no pueden con un simple puntero jejeje

    Comentario por Cesar | noviembre 21, 2009 | Responder

    • Sin lugar a dudas coincido contigo en que lo mejor son los punteros, pero no lo unico. Tengo entendido que ademas de usar los tipos predefinidos (int, char, etc) que ocupan su propio espacio, puedes hacer un tipo de variable que ocupe los bits que tu le digas. Pero lo que realmente me gusta es que tambien se puede programar directamente en ensamblador desde C (aunque no recuerdo como, ya lo vere cuando domine este lenguaje de programación)

      Comentario por Adri | enero 17, 2016 | Responder

      • Lo de que se pueda crear una variable que ocupe los bits que uno quiera no es del todo cierto. Si bien es posible crear estructuras de datos donde podamos leer y escribir bits de manera individual usando máscaras de bit como AND, OR y XOR o instrucciones para trabajar con bits individuales como Bit Test, Bit Set, o Bit Clear lo mejor es que las variables tengan la longitud de palabra del CPU por razones de eficiencia. Para una máquina de 32 bits es más rapido leer y escribir un entero de 32 bits que uno de 16 porque basta con hacer un MOV. En cambio si quieres trabajar con un entero de 16 bits tienes primero que cargar en el registro de 32 bits el valor 0000ffffh y hacer un AND con la variable de 16 bits. Ese proceso es tardado y lo único que ahorras son 2 bytes de memoria por lo que no es buena idea pero si tienes que hacerlo y no te preocupa la eficiencia puedes hacerlo.

        Otro asunto con los punteros es que la manera como ensamblador maneja los punteros es similar a lo que en C se conoce como punteros VOID. Es decir que no están asociados a un tipo de datos. Y lo que cargan de la memoria o escriben en ella depende únicamente de la longitud de los registros involucrados. Para un procesador de 32 bits no hay diferencia entre un entero con o sin signo, la posición de memoria donde está una función, una valor flotante de precisión sencilla o cuatro símbolos ASCII uno tras otro. Si al CPU le das una posición de memoria y le dices que guarde el contenido en unregistro de 32 bits lo hará sin preocuparse por el tipo de datos.

        Aquí hay una explicación de los punteros VOID en C
        http://www.zator.com/Cpp/E4_2_1d.htm

        Comentario por asm86 | enero 20, 2016

  2. Muy buen articulo tengo 16 años a los 17 programare en este lenguaje =)

    Comentario por josfres | enero 7, 2011 | Responder

  3. mmm pienso en lo siguiente despues que veo el subtitulo:

    > la memoria no se crea ni se destruye,la memoria se modifica…<

    Comentario por armorineSKY | febrero 6, 2012 | Responder

  4. Siento como que bardeas o tiras mierda para los que hacen esas “querys” , “trabajan con base de datos”.

    Yo hago de eso, tengo 19 de años, y recien empiezo, y sin embargo, estoy aca leyendo esto porque me interesa, porque me gusta y quiero aprender mas.

    No me creo mucho por hacer lo que hago. :/

    Comentario por Federic | febrero 11, 2012 | Responder

  5. En realidad leo porque lo necesito saber. Por ahora soy de la clase que quiere aprobar una materia en la facultad. Pero con el tiempo de ver de que se trata esto, voy adquiriendo mas conocimientos , ya no va a ser la facultad, va a ser mi trabajo, va a ser mi vida.

    Comentario por Federic | febrero 11, 2012 | Responder

    • Eso es bueno, hay diferencia entre tener que hacer un trabajo para subsistir y lo que hacen algunos a los que seguro ya te has tenido que enfentar. Se bienvenido si lo que quieres es aprender ASM por tu cuenta.

      Chiste malo para aliviar tensiones: Si a los desarrolladores de java les llaman “javeros”, los de PHP “peacheperos”, no quiero saber como les llaman a los que trabajan con SQL, dicen que por eso lo pronuncian como ‘sicual’

      Comentario por asm86 | febrero 11, 2012 | Responder

      • jajajaja xD bueno quien dice? que los ensambaldores no tienen centido del humor xD

        Comentario por armoryneSKY | febrero 11, 2012

  6. tengo el editor hexadeciaml como publique en la entrada “Prog, Hex and Rock’n’Roll”

    este me permitiria hacer converciones de lenguaje hexadecimal a lenguaje humano mucho mas rapido xD o bien al contrario!

    mmmm si estos sistemas de codigos ubiesen estado en al primera o segunda guerra mundial el curso d ela historia cambiaria drasticamente por ser estos usados como medios de mandar mensajes secretos xD+

    PD: en el ensambaldor que usas(Flat Assembler),se pueden usar lineas de codigo en hexadeciaml que en lineas de codigos creadas con palabras?

    Comentario por armoryneSKY | febrero 11, 2012 | Responder

  7. oye es verda lo que dices?

    ” la memoria no se crea ni se destruye”?

    si es verdad entonces la memoria no se puede crear ni destruirse pero puede ser editada?

    Comentario por armoryneSKY | febrero 11, 2012 | Responder

    • Una computadora tiene una cantidad fija de memoria fisica. Aunque puede usar otros dispositivos como discos duros para usarlos como memoria virtual. En el caso del windows la memoria se maneja como una abstraccion. Las celdas de memoria siempre contienen algo y pueden ser leidas y escritas al igual que los cajones de un escritorio no aparecen y desaparecen. Y si, puedes escribir en cualquier celda de memoria como puedes guardar cosas en los cajones de un escritorio. Aunque hay algnos sistemas operativos que crean una capa de abstraccion entre las aplicaciones y la memoria fisica pero eso ya es otro tema.

      Lo de codificaciones de la segunda guerra te recomiendo que leas sobre la “maquina Enigma”, es un capitulo muy importante en la historia de las computadoras.

      En cuanto a lo de los diferentes tipos de ensambladores, no solo hay diferentes tipos de ensambladores sino diferentes tipos de procesadores. El FASM, MASM y NASM tienen diferente forma de escribir las mismas instrucciones para procesadores intel. Y hay otros procesadores como los ARM usados en dispositivos moviles que tienen otras instrucciones diferentes a los de intel. Al final si no tienes un compilador puedes hacer el tuyo propio si conoces el formato de lenguaje maquina del CPU y tienes alguna manera de escribir datos en la memoria del sistema. Lo del 86 era como terminaban los procesadores de intel desde el 8086 hasta el 80486. Aunque los procesadores actuales son compatibles con este tipo de sistemas los nuevos procesadores pueden trabajar con codigo de 64 bits.

      Comentario por asm86 | febrero 12, 2012 | Responder

  8. 1.mi computadora es win32 osea que trabaja con 32 bits, una intel pentiun 3,todo loque aga en ensambaldor FASM me funcionara verdad?
    2.lo del compilador: dices que me puedo hacer uno propio xD,pero si es algo complicado entonces mejor no hacerlo todabia,sino cuando gane mas experiencia en esto,asi que cual compilador para ensamblador necesito(si es en español mejor :DxD)

    Comentario por armorineSKY | febrero 13, 2012 | Responder

  9. No puedo cargar el tema que sigue de la saga, podrían informarme al respecto, gracias.

    Comentario por KKim Vázquez Angeles | octubre 3, 2012 | Responder

  10. “En inglés, la palabra ‘Address’ se traduce al español como ‘Domicilio’ y la terminación ‘ing’ significa ‘hacer una acción’. Entonces, Addressing podría traducirse como ‘el trabajo de ubicar un domicilio’. Algunos maestros malpagados traducen Addressing como ‘direccionamiento’ pero tal palabra carece de sentido en español” 1ª “ing” sufijo equivalente en el español de hacer una accion presente o terminda “endo” “ando. ” 2ª cuando se traduce un libro tecnico sea de programacion o redes tcp/ip al español, utilizan mucho esa palabra “Direccionamiento” Address=Direccion ing=endo,ando =direccionamiento, esto me lo dijo un ingeniero en aeronautica, que trabaja en estados unidos al que le dices mal pagado! 3ª O te pones a estudiar más inglés o reducimos más las palabras superfluas estimado seudomaestro!

    Comentario por Guillermo Magana Ventur | diciembre 28, 2012 | Responder

    • Tienes razón en cuanto a que address se puede traducir como dirección. Pero dirección en el sentido de domicilio como cuando uno da la dirección (domicilio) de su casa. La palabra Dirección en español se traduce al inglés como Direction y se refiere al sentido o rumbo que toma algo. Como por ejemplo un vector que tiene una dirección. Para evitar esa ambiguedad uso el término Domicilio que es como también puede traducirse la palabra inglesa Address. Este enlace a una entrada del Diccionario Oxford explica mejor el concepto:

      http://oxforddictionaries.com/translate/english-spanish/address_1

      La terminación -ing no siempre indica una acción en tiempo presente. Por ejemplo en Building puede referirse a un edificio ya construido o a la acción de construir algo en tiempo presente. También se aplica como en este caso a acción independientemente del tiempo. Por ejemplo la frase “Programming in C” usa la terminación -ing pero se traduce como “Programación en C” aunque no falta el que lo traduce como “Programando en C”. Otro caso es cuando se hace un listado de acciones o habilidades. Los verbos que definen las acciones llevan la terminación -ing que tiene mas que ver con el participio español. La lengua inglesa depende mucho del contexto a diferencia del español.

      En cuanto a tu amigo ingeniero aeronáutico felicidades. Seguro su trabajo le costó llegar a serlo. Aunque la única relación con los aviones y las computadoras que mi mísera preparación me ha hecho conocer es el “Modo Vuelo” que tienen algunos dispositivos móviles. Tal vez deberías echarle una mirada a este otro enlace de wikipedia (qué está en español) otro dia con mas calma, tiene mucho que ver con el tema.
      http://es.wikipedia.org/wiki/Argumento_ad_verecundiam

      Comentario por asm86 | diciembre 28, 2012 | Responder

  11. Hola a todos. Ahí va mi pregunta concreta sobre esta sección:
    En el sistema Linux de 32bits con IA-32 como el que yo utilizo, ¿tambien se utiliza el cero para finalizar una cadena de bytes? Por el comentario que haces de Windows.
    ¿alguna diferencia a tener en cuenta con mi sistema?. Gracias de antemano, soy nuevo en este campo.

    Comentario por Luis | febrero 10, 2014 | Responder

    • Tal vez te sorprenda saber que mucho de lo que existe en Windows viene directo de Linux o mas bien de su padre el viejo UNIX. La forma de hacer los ejecutables, las llamadas a función y también el modo de manejar el texto. Terminar con cero binario una cadena ascii se llama ASCII-Z y es un estandar del lenguaje C. Aunque ya se usaba desde antes. Y si, se usa así en Windows, Linux y en cualquier otro sistema que maneje cadenas ascii y que se programe con C.

      Comentario por asm86 | febrero 12, 2014 | Responder

      • Muchas gracias asm86. ¡¡y felicidades de nuevo por tus magistrales clases para personas que se han decidido a empezar en este tema desde el completo nivel cero!!
        En las siguientes entradas te voy haciendo preguntas mas técnicas conforme mas profundizas en el tema. Como vi los últimos comentarios de hace años, pensé que ya no se seguían estas entradas. ¡¡Te pido disculpas!!

        Comentario por Luis | febrero 12, 2014

  12. Camarada no te voy a mentir, soy un absoluto novato en cuanto a programacion se refiere pero de algo si estoy mas que seguro, que de esta serie de trabajos sobre ensamblador eh aprendido muchisimo y eh acquirido aun mas interez en el tema, por favor sigue dando tan buen contenido.

    Comentario por DNX | abril 5, 2014 | Responder

  13. Perdón, pero la mayoría de los que hablamos castellano (o español, como prefieran) usamos la coma como separador decimal, y el punto como separador de miles… o sea que sería: 4.294.967.296 :D

    Comentario por Piero71 | agosto 23, 2016 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: