Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

ASCII-zofrenia

–Secretos Sobre el codigo ASCII–

Comenzamos una nueva aventura en esto del ensamblador. Y antes de programar, lo primero que necesitamos es un modo de comunicarnos con la aplicación Como recordarán en entradas pasadas, el texto legible que aparece en un programa de Windows se escribe en algo llamado código ASCII. Que significa código estandar americano para el intercambio de información. Sin embargo, estamos en el siglo 21 y el Internet no solo se limita a Estados Unidos. Existe otra codificación llamada Unicode que es mucho mas avanzada, Unicode es tan grande que se divide en páginas de códigos donde cada una abarca un lenguaje usado en algún lugar del planeta. De hecho, una de estas páginas incluye por completo el Ascii. Dicha página es conocida como UTF-8 o Formato de Transformación Unicode de 8 bits. Por ahora nos concentraremos en este asunto del ASCII.

Si alguno de ustedes leyó los códigos que he puesto en este blog y no nadamas hizo Copy-Paste para compilarlos recordará que hay funciones de la API de Windows que tienen una A al final de su nombre, por ejemplo, MessageBoxA. Esta A es porque la función trabaja con códigos ASCII, pues existe también una MessageBoxW que usa codificación ‘WIDE’. No estoy muy seguro pero esto es un pseudo-unicode. Hoy en día es necesario usar las funciones WIDE, pero por ahora las versiones ASCII ya son de por si difíciles de comprender.

En este link hay una excelente tabla ASCII. Es importante que una tabla ascii esté dispuesta en 8 renglones por 16 columnas. Pues así podemos ver muchas de las propiedades especiales de esta tabla.Veamos rapidamente algunas de ellas.

Los códigos del 0 al 1F son de control.- El ASCII se inventó en una época en que no existían monitores de computadora y las comunicaciones se hacían con un aparato entre impresora y máquina de escribir al que los antiguos se referían como TTY. Si alguien se acuerda de la computadora de los Super Amigos tendrá una idea de lo que estoy hablando. Los códigos de control no se imprimen, pero sirven para manejar el TTY. Un editor de texto los interpreta del mismo modo. Algunos códigos importantes son:

00 = NUL.- Código nulo.

07 = BEL.- Esto hace sonar el speaker

08 = BS.- BackSpace. Lo que borra la última letra.

0A = LF.- Line Feed. Para al siguiente renglón

0D = CR.- Carriage Return. El retorno de carro

1B = ESC. Tecla de escape

Los códigos del 20h al 2Fh son signos.- De entre estos, 20h es un espacio en blanco. No confundir con 32h.

Los códigos del 30h al 39h son los números del 0 al 9.- Es importante no confundir un número en formato binario que es con el que podemos trabajar con su representación en ASCII que es representable en pantalla e impresora. Para convertir un valor ASCII en su correspondiente binario solo hay que asegurarse de que esté entre 30h y 39h (48 a 58 decimal) y poner los 4 bits mas altos en cero.

Los códigos entre 40h a 5Ah representan el abecedario en mayúsculas.- De hecho, 40h es 64, si ustedes tienen un teclado en español de seguro usan ALT + 64 para escribir la @ en los e-mails. La A comienza en 41h y la Z está en 5Ah.

Los códigos entre 60h y 7Ah representa el abecedario en minúsculas.- Hay exactamente 32 espacios entre la misma letra en versión mayúscula y minúscula. Esto no es coincidencia y se hizo para convertir cadenas de texto entre mayúsculas y minúsculas de manera muy rápida. Si una letra tiene el bit 5 activo es minúscula, si está apagado es mayúscula. Podemos hacer conversiones tan solo apagando y encendiendo este bit. Lo interesante es que los espacios en blanco no se alteran usando este proceso.

Los códigos no mencionados son signos extra, aunque aún entre estos existe cierta simetría. Por ejemplo los {} y[] están a 32 posiciones de separación. El código 7Fh se usa como salida para indicar otra codificación.

Por cierto, los códigos entre 80h y ffh no son estandar y puede haber variaciones de un sistema a otro. En realidad, los 127 símbolos ya mencionados son suficientes para programar. Ahora mencionaré un par de cosas que muchos no saben que es posible hacer si uno conoce el código ASCII:

Pueden representarse cadenas con retornos de carro (0dh,0ah), tabulaciones(09h) y hasta sonidos(07h).

Convertir de binario a ascii muy rápido.

En la tabla, para obtener el valor binario de un signo ascii solo hay que trazar una cruz con centro en ese símbolo y sumar los valores que quedan afuera. Mas adelante verán que esta suma en realidad es realidad una operación binaria llamada OR.

Prueben modificando el primer código que despliega la caja de texto. (Está en la entrada ¡Al fin un código en Ensamblador!) Un ejemplo de una linea con retorno de carro sería:

message	db 	'Esta es una linea de texto', 0dh,0ah,' y esta la otra',0

En la siguiente nota veremos como convertir un valor binario en una cadena ascii que es posible desplegar en pantalla. Les advierto que el código es mas dificil de lo que parece. Así que prepárense y si pueden, impriman el ASCII y peguenlo en la pared de su cuarto. Pues van a necesitarlo mucho.

>>>>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.

febrero 2, 2009 - Posted by | Uncategorized | ,

19 comentarios »

  1. ¡Me sumo!

    Comentarios por Lentucky | febrero 3, 2009 | Responder

  2. Hola, ¡genial el blog!.
    Esto es pura ‘carnita’…
    Una pregunta:¿Cómo podría determinar si una letra o aracter tiene una tilde o una diéresis?, por ejemplo, dices que una letra esta en minúscula si el bit 5 está activo…habrá alguna forma de determinar cuándo un caracter tiene acento(por ej.:á,ṕ,ü,ò,etc.)? hay algún manual que especifique cómo se lleva a cabo este proceso?.

    Comentarios por Luis | diciembre 21, 2010 | Responder

    • En realidad en la codificacion ASCII las letras acentuadas se manejan como letras diferentes a las letras sin acento. En el caso del ASCII, las vocales con acento tienen las posiciones 160, 130, 161, 162 y 163, la ñ tiene el 164 y la mayuscula el 165. Son codigos completamente diferentes a las vocales sin acento y n normal y asi es como puedes identificarlas.

      Sin embargo en el UNICODE si existen caracteres compuestos, esto es especialmente util en lenguajes como por ejemplo el coreano pues solo usan 24 simbolos combinables. Si no lo hicieran el coreano usaria mas de 2000 simbolos.

      Comentarios por asm86 | diciembre 22, 2010 | Responder

  3. Qué paso con mi comentario?

    Comentarios por Luis | diciembre 21, 2010 | Responder

  4. hola, estoy aprendiendo ejeejejej lo anterior lo aprendi ya xD ahora estoy por esta pate,que la estoy leyendo ahorita mismo xD…

    1.bueno ahora como pongo en practica lo que he aprendido antes, estas cosa(codigo binario,codigo hexadecimal,bits byte etc etc) son cosas que aplicare? o son solo cosas teoricas que debo tener en mente nada mas? ese ejemplo de HOLA MUNDO es solo un ejemplo de las cosas que se almacenan en la memoria?,osea no es algo que yo pueda hacer,que se ejecute una ventanita y que se ponga ese hola mundo? claro hable de hacerlo de forma hexadecimal?
    2. el ensambaldor FLAT funciona de que manera?,programas como los lenguajes normales en el que usas palabras? o se programa usando el código(o sistema o lenguaje) hexadecimal?

    en conclusion en el ensambaldor FLAT.que se usa para programar en el?,codigo hexadecimal o como en todos los lenguajes de programación donde se usan palabras??

    Comentarios por armorineSKY | febrero 13, 2012 | Responder

    • lo del binario no tiene nada de teorico. De hecho la manera mas rapida de entender las instrucciones de ensamblador es trabajar con ellas directamente en lenguaje maquina y la mejor manera de aprender a hacer programas de ASM es entender los ejecutables en lenguaje maquina. Parece imposible la primera vez que te lo dicen pero es cierto. Ya tengo algunas entradas sobre el tema pero aun no las incluyo en la serie.

      El ejemplo del hola mundo es lo que llaman una cadena ASCII-Z que es una secuencia de bytes terminada en un cero binario en la ultima posicion. Las funciones del sistema operativo que despliegan cadenas toman como entrada la posicion donde esa cadena comienza para poder mostrarla.

      En cuanto a lo de los «lenguajes normales» en ensamblador tambien se usan palabras, aunque mas cortas y se les conoce como mnemonicos. El compilador convierte esas palabras en binario. Aunque si conoces el formato del lenguaje maquina puedes escribirlo tu mismo. Aunque eso solo es necesario si tu compilador no reconoce las instrucciones mas recientes.

      La parte mas confusa al aprender ASM es no confundir instrucciones, registros, etiquetas, estructuras y sobre todo las temibles macros. Solo recuerda que un source code puede tomar muchas formas pero cuando muestra lenguaje maquina, el editor hexadecimal nunca miente

      Comentarios por asm86 | febrero 13, 2012 | Responder

  5. 1.mira yo podria editar los ejemplos que bienen con el ensamblador para asi aprender de como realiza esas acciones…
    2.mira la descarga dle ensambaldor FLAT por el link que trae este blog trae un compilador? el compilador biene dentro del programa o es un ejecutable aparte?
    3. mira quisiera que revisaras el «pspad editor» editor hexadecimal,en su descripccion dice que es una buena herramienta para programadores,ya que este puedes hacer cualquier cosa(sta un programa o algoa si xD) pero puedes usar cualquier lenguaje de porgramacion…bueno eso creo que es asi xD porque cuando le doy a nuevo aparece una lista para yo elegir el tipo de escritura o el tipo formato o no se bien como podria llamarle :/…solo se que es bueno pero como tiene el x86 assambly(que lo discutimas anteriormente) me interesaria saver si funciona,ya que tu debes saver como escribir en eso, quisiera ver si es posible al menos hacer algo pequeño pero algo con el «pspad editor»
    4. por otro lado quisiera saber si mi pc intel windows xp (win32) soporta cosas creadas en x86…
    5.si ese tal «pspad editor» sirve para trabjar verdaderamente en eso y se puede lograr hacer cosas sencillas de las que puede hacer el FLAT lo usaria cuando aprendiera
    6.:en el lenguaje ensmabaldor x86 win 32 win64 etc etc etc tienen una forma diferente de ser escritos? o todos usan las mismas reglas y tecnicas de escritura ensambaldor( instrucciones, registros, etiquetas, estructuras y sobre todo las»temibles» macros)

    7.muchas gracias por al respuesta anterior!

    Comentarios por armorineSKY | febrero 14, 2012 | Responder

  6. xD jajajaa usando el pspad editor converti de US ASCII(cuantos tipos de ASCII hay?) a HEX(hexadecimal)

    jeje mira lo que salio xD

    %6d%65%73%73%61%67%65 %64%62 %%%332%37%45%73%74%61 %65%73 %75%6e%61 %6c%69%6e%65%61 %64%65 %74%65%78%74%6f%%%332%37%%%332%63 %%330%64%68%%%332%63%%330%61%68%%%332%63%%%332%37 %79 %65%73%74%61 %6c%61 %6f%74%72%61%%%332%37%%%332%63%%330

    claro creo que eso esta mal xD
    asi que lo traduje manualmente dando clik en editar en hexadeciaml y comenze a transcribir todo el code hexadecimal a el bloc de notas

    aca esta

    6D65 7373 6167 6520 6462 2020 2745 7376
    6120 6573 2075 6E61 206C 696E 6561 2064
    6520 7465 7874 6F61 206C 696E 6561 2064
    682C 2720 7920 6573 7461 206C 6120 6F74
    7261 292C 300D 0A

    me puedes decir porque el primer code hexadeciaml no salio bien?

    pues para el que no lo aiga notado aun ambos codes en HEX estan iguales solo que al parecer al parecer cuadno se combierte hay un erro que tla ves tenga que ver con lo de los espacio,pero si revsian bien los numeros y letras en el primero es el mismo que el que traduje manualemnte

    lo acabo de notar yo ahorita despues de escribir esto xD asi que no ce cientan mal para el que no lo noto xD,yo soy uno de esos xD

    bueno oye me puedes explicar por que salieron los «%» no le veo el sentido xD

    Comentarios por armorineSKY | febrero 14, 2012 | Responder

  7. PD: no ntendi bien lo dle code que as puesto alli porfavro me puedes explicar que significa cada cosa que hay alli en ese code…tamebin has dicho que lo editemso pero yo me pregunto que editamos? y como lo hacemos?

    Comentarios por armoryneSKY | febrero 19, 2012 | Responder

    • En el código ASCII no todos los símbolos son letras. De hecho los primeros 32 son instrucciones que interpretaba un aparato antiguo llamado teletipo (que hoy parecería una impresora ruidosa unida a un teclado) Algunos de estos códigos son el retorno de carro 0dh, escape 1bh, fin de transmisión 17h y hasta una campana 07h. Unos pocos de estos códigos se usan para darle formato a los textos en un editor de texto ASCII puro. Y lo que decía sobre editarlos era que intentaras abrir un texto ascii puro (extensión TXT que puedes hacer con el block de notas del Windows) con un editor hexadecimal. Ahi vas a poder ver como cada letra y símbolo de control corresponde a un byte escrito en hexadecimal.

      Comentarios por asm86 | febrero 27, 2012 | Responder

  8. no entiendo : / bien lo que me dices

    en la respuesta pon el codigo y explicame que hace cada cosa que esta en codigo .porfvaor y gracias!

    Comentarios por armonySKY | febrero 28, 2012 | Responder

  9. Una pregunta sencilla, haber si alguien puede contestarmela, ya que en las entradas anteriores no me han contestado ninguna. No se si es porque este tema ya no se sigue o si es por otro motivo:
    ¿este código de esta entrada es posible ponerlo en practica escribiéndolo en un editor de texto?¿o es para ponerlo en practica directamente desde la consola de mi sistema operativo invocando primero el ensamblador que tengo por defecto?.
    Este curso de ensamblador es realmente bueno para personas con nivel cero como yo, pero no veo seguimiento a las preguntas que la gente formula.
    Gracias a quien me responda.

    Comentarios por Luis | febrero 12, 2014 | Responder

  10. Elabora un programa para mostrar un carácter en una posición específica de pantalla dada por el usuario.
    Instrucciones
    • Emplear la interrupción 10H, específicamente la función 02h.
    • Considera que el usuario puede ingresar valores de hasta 2 dígitos, para ello se debe obtener el valor numérico real del valor ingresado.
    Como hago este codigo en asembler

    Comentarios por Jorge | May 4, 2016 | Responder

  11. Elaborar un Programa para imprimir la tabla de códigos ascii en la pantalla.
    Instrucciones:
    1. Elaborar un programa que permita imprimir en pantalla la tabla de códigos
    ASCII completa.
    2. El programa debe solicitar el número de columnas que se desea mostrar entre 1 a 3.
    3. Por cada columna se muestra: el valor posicional en sistema hexadecimal, en
    decimal y finalmente el símbolo respectivo.
    Favor su ayuda
    Gracias

    Comentarios por Jorge | May 4, 2016 | Responder

  12. hola estoy teniendo problemas con mi programa aca se lo mando

    esto es lo que tengo que hacer

    Escriba un programa que almacene los valores decimales correspondientes a los caracteres ASCII numéricos declarados en un arreglo de 5 elementos llamado “arregloCar” a otro arreglo del mismo tamaño llamado “arregloDec”. Es decir, si arregloCar tuviera los elementos [32h, 31h, 38h, 39h, 39h], en arregloDec deberían quedar [2, 1, 8, 9, 9]. Para ello el programa debe contar con una subrutina “convertir” que realice dicha operación.

    y yo hice esto y me da que esta mal

    .model small
    .stack
    .data
    arregloCar db 31h, 32h, 33h, 34h, 35h
    arregloDec db 5 dup (?)
    .code
    inicio:
    mov ax, @data
    mov ds, ax

    call convertir
    mov ax, 4c00h
    int 21h
    convertir proc
    cmp al, arregloCar[si]
    sub al, 30h
    mov arregloCar, al
    inc si

    ret
    mov ax, 4c00h
    int 21h

    fin:
    end inicio

    Comentarios por eva | agosto 14, 2017 | Responder

    • Eso se arregla con un AND. Basta hacer un AND entre el valor ascii y 0fh para conservar los 4 bits más bajos. Si no tienes que validar que el número se encuentre en cierto rango eso es tan rápido como hacer una sola instrucción antes de copiar el valor al segundo array.

      Comentarios por asm86 | agosto 18, 2017 | Responder

  13. Hola.
    Alguien me podría comentar de algún emulador específico para poder poner en practica estos conocimientos?

    Comentarios por Raul Juliao | octubre 19, 2017 | Responder

  14. consultas: Tengo un equipo medico y en el manual del fabricante indica que tiene programación ASCII sin embargo al revisarlo presenta una falla en la pantalla mostrando un asterisco (*) dejando el equipo bloqueo.

    Pregunta:

    – Como puedo descifrar si la programación ASCII esta errónea o esta desconfigurada
    – Como saber si tiene un parámetro alterado.
    – El equipo es viejo y la fabrica no tiene mas antecedente de esa falla
    – Existen un programa que puedo revisar la programación ASCII

    estimados agradeceré su aporte por esta información que es de suma importancia, dejare mi correo personal para las repuestas.

    correo: gleyx@hotmail.com

    Saludos desde Chile!!.

    Comentarios por Gerente Gerente | junio 29, 2018 | Responder

    • No tengo idea de equipos médicos pero cuando un hardware usa el término ASCII normalmente significa que puede representar y sacar los datos en ese formato. Intenta un reset de fábrica si está disponible. Pero toma en cuenta que las memorias internas de aparatos muy viejos se degradan con los años y el código que los hace funcionar se pierde. Tal vez el aparato ya cumplió su vida util pero si todavia le pueden dar servicio pídelo. Con suerte sólo sea un cable suelto y puedas hacerlo funcionar. También revisa si el aparato cuenta con baterias internas que tengas que remplazar. Se usan para almacenar configuraciones en memorias de aparatos electrónicos. Muchos aparatos las usan y como les duran décadas uno olvida que están ahí. Esas pilas las encuentras en tiendas de electrónica y algunas relojerias. Suerte con eso.

      Comentarios por asm86 | junio 30, 2018 | Responder


Deja un comentario