Este es un curso sencillo sobre en lenguaje ensamblador, o conocido como lenguaje de máquina que es el sistema de códigos directamente interpretable por un circuito microprogramable, como el microprocesador de una computadora o el microcontrolador de un autómata (un PLC) Este lenguaje está compuesto por un conjunto de instrucciones que determinan acciones a ser tomadas por la máquina.
El lenguaje de máquina es específico de cada máquina o arquitectura de la máquina, aunque el conjunto de instrucciones disponibles pueda ser similar entre ellas.
este libro es obra de Paul A. Carter
Lenguaje Ensamblador para PC
Paul A. Carter
9 de agosto de 2007
Copyright c 2001, 2002, 2003, 2004
by Paul Carter
Traducido
al español por Leonardo Rodríguez Mújica.
Sus comentaros y sugerencias acerca
de la traducción por favor a: lrodri@udistrital.edu.co
Este documento puede ser
reproducido y distribuido totalmente (incluida esta paternidad literaria,
copyright y aviso de autorización), no se puede cobrar por este documento en sí
mismo, sin el consentimiento del autor. Esto incluye una “utilización racional”
de extractos como revisiones y anuncios, y trabajos derivados como traducciones.
Observe que esta restricción no está prevista para prohibir el cobro por el servicio
de impresión o copia del documento A los docentes se les recomienda usar este
documento como recurso de clase; sin embargo el autor apreciaría ser notificado
en este caso. Prefacio Propósito El propósito de este libro es dar al lector un
mejor entendimiento de cómo trabajan realmente los computadores a un nivel más
bajo que los lenguajes de alto nivel como Pascal.
Teniendo un conocimiento
profundo de cómo trabajan los computadores, el lector puede ser más productivo
desarrollando software en lenguajes de alto nivel tales como C y C++. Aprender a
programar en lenguaje ensamblador es una manera excelente de lograr este objetivo.
Otros libros de lenguaje ensamblador aún enseñan a programar el procesador 8086
que usó el PC original en 1981. El procesador 8086 sólo soporta el modo real.
En este modo, cualquier programa puede acceder a cualquier dirección de memoria
o dispositivo en el computador. Este modo no es apropiado para un sistema
operativo multitarea seguro. Este libro, en su lugar discute cómo programar los
procesadores 80386 y posteriores en modo protegido (el modo en que corren
Windows y Linux).
Este modo soporta las características que los sistemas
operativos modernos esperan, como memoria virtual y protección de memoria. Hay
varias razones para usar el modo protegido
1. Es más fácil de programar en modo
protegido que en el modo real del 8086 que usan los otros libros.
2. Todos los
sistemas operativos de PC se ejecutan en modo protegido.
3. Hay disponible
software libre que se ejecuta en este modos.
La carencia de libros de texto
para la programación en ensamblador de PC para modo protegido es la principal
razón por la cual el autor escribió este libro. Cómo lo dicho antes, este libro
hace uso de Software Libre: es decir el ensamblador NASM y el compilador de
C/C++ DJGPP. Ambos se pueden descargar de Internet.
El texto también discute cómo
usar el código del ensamblador NASM bajo el sistema operativo Linux y con los
compiladores de C/C++ de Borland y Microsoft bajo Windows.
Todos los i ii
PREFACIO ejemplos de estas plataformas se pueden encontrar en mi sitio web:
http: //www.drpaulcarter.com/pcasm. Debe descargar el código de los ejemplos, si
desea ensamblar y correr los muchos ejemplos de este tutorías. Tenga en cuenta
que este libro no intenta cubrir cada aspecto de la programación en
ensamblador.
El autor ha intentado cubrir los tópicos más importantes que todos
los programadores deberían tener Reconocimientos El autor quiere agradecer a
los muchos programadores alrededor del mundo que han contribuido al movimiento
de Software Libre. Todos los programe y aún este libro en sí mismo fueron
producidos usando software libre.
El autor desearía agradecerle especialmente a
John S. Fine, Simon Tatham, Julian Hall y otros por desarrollar el ensamblador
NASM ya que todos los ejemplos de este libro están basados en él; a DJ Delorie
por desarrollar el compilador usado de C/C++ DJGPP; la numerosa gente que ha
contribuido al compilador GNU gcc en el cual está basado DJGPP; a Donald Knuth
y otros por desarrollar los lenguajes de composición de textos TEX y
LATEX2" que fueron usados para producir este libro; a Richar Stallman
(fundador de la Free Software Fundation), Linus Torvalds (creador del núcleo de
Linux) y a otros que han desarrollado el software que el autor ha usado para
producir este trabajo. Gracias a las siguientes personas por correcciones: John
S. Fine Marcelo Henrique Pinto de Almeida Sam Hopkins Nick D’Imperio Jeremiah
Lawrence Ed Beroset Jerry Gembarowski Ziqiang Peng Eno Compton Josh I Cates Mik
Mifflin Luke Wallis iii Gaku Ueda Brian Heward Chad Gorshing F. Gotti Bob
Wilkinson Markus Koegel Louis Taber Dave Kiddell Eduardo Horowitz Sébastien Le
Ray Nehal Mistry Jianyue Wang Jeremias Kleer Marc Janicki Recursos en Internet Página
del autor http://www.drpaulcarter.com/ Página de NASM en SourceForge http://nasm.sourceforge.net/
DJGPP http://www.delorie.com/djgpp Ensamblador con Linux
http://www.linuxassembly.org/ The Art of Assembly http://webster.cs.ucr.edu/ USENET
comp.lang.asm.x86 Documentación de Intel
http://www.intel.com/design/Pentium4/documentation.htm Comentarios El autor
agradece cualquier comentario sobre este trabajo. E-mail: pacman128@gmail.com WWW:
http://www.drpaulcarter.com/pcasm
Capítulo 1
Introducción
1.1.
Sistemas de numeración
La
memoria en un computador está compuesta de números. La memoria del computador
no almacena estos números en decimal (base 10). Porque se simplifica mucho el
hardware, los computadores almacenan toda la in-formación en binario (base 2).
Primero haremos una revisión del sistema decimal.
1.1.1. Decimal
Los
números con base 10 están compuestos de 10 posibles dígitos (0-9). Cada dígito
de un número tiene una potencia de 10 asociada con él, basada en su posición en
el número. Por ejemplo:
234
= 2 × 102 +3 × 101 +4 × 100
1.1.2. Binario
Los
números en base dos están compuestos de dos posibles dígitos (0 y 1). Cada dígito
de un número tiene una potencia de 2 asociada con él basada en su posición en
el número. Por ejemplo:
110012
=1 × 24 +1 × 23 +0 × 22 +0 × 21 +1 × 20
=
16+8+1
=
25
Esto
muestra cómo los números binarios se pueden convertir a decimal. El Cuadro 1.1
muestra cómo se representan los primeros números en binario.
La
Figura 1.1 muestra cómo se suman los dígitos binarios individuales (bits). A
continuación un ejemplo: