Lenguaje Ensamblador para PC
Paul A. Carter
9 de agosto de 2007
Copyright c(cid:13) 2001, 2002, 2003, 2004 by Paul Carter
Traducido al espa˜nol por Leonardo Rodr´ıguez M´ujica. Sus comentaros y su-
gerencias acerca de la traducci´on por favor a:
[email protected]
Este documento puede ser reproducido y distribuido totalmente (incluida
esta paternidad literaria, copyright y aviso de autorizaci´on), no se puede
cobrar por este documento en s´ı mismo, sin el consentimiento del autor.
Esto incluye una “utilizaci´on racional” de extractos como revisiones y anun-
cios, y trabajos derivados como traducciones.
Observe que esta restricci´on no est´a prevista para prohibir el cobro por el
servicio de impresi´on 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´osito
El prop´osito de este libro es dar al lector un mejor entendimiento de
c´omo trabajan realmente los computadores a un nivel m´as bajo que los len-
guajes de alto nivel como Pascal. Teniendo un conocimiento profundo de
c´omo trabajan los computadores, el lector puede ser m´as productivo desa-
rrollando 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´un ense˜nan a programar el
procesador 8086 que us´o el PC original en 1981. El procesador 8086 s´olo
soporta el modo real. En este modo, cualquier programa puede acceder a
cualquier direcci´on 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´omo programar los procesadores 80386 y posteriores en
modo protegido (el modo en que corren Windows y Linux). Este modo so-
porta las caracter´ısticas que los sistemas operativos modernos esperan, como
memoria virtual y protecci´on de memoria. Hay varias razones para usar el
modo protegido
1. Es m´as f´acil 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´on en ensamblador de PC
para modo protegido es la principal raz´on por la cual el autor escribi´o este
libro.
C´omo lo dicho antes, este libro hace uso de Software Libre: es decir el
ensamblador NASM y el compilador de C/C++ DJGPP. Ambos se pue-
den descargar de Internet. El texto tambi´en discute c´omo usar el c´odigo
del ensamblador NASM bajo el sistema operativo Linux y con los com-
piladores 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´odigo de los ejemplos,
si desea ensamblar y correr los muchos ejemplos de este tutorial.
Tenga en cuenta que este libro no intenta cubrir cada aspecto de la
programaci´on en ensamblador. El autor ha intentado cubrir los t´opicos m´as
importantes que todos los programadores deber´ıan tener
Reconocimientos
El autor quiere agradecer a los muchos programadores alrededor del mun-
do que han contribuido al movimiento de Software Libre. Todos los progra-
me y a´un 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´an basados en ´el; 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´a basado DJGPP; a Donald Knuth y
otros por desarrollar los lenguajes de composici´on de textos TEX y LATEX 2ε
que fueron usados para producir este libro; a Richar Stallman (fundador de
la Free Software Fundation), Linus Torvalds (creador del n´ucleo 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´ebastien Le Ray
Nehal Mistry
Jianyue Wang
Jeremias Kleer
Marc Janicki
Recursos en Internet
P´agina del autor
P´agina de NASM en SourceForge
DJGPP
Ensamblador con Linux
The Art of Assembly
USENET
Documentaci´on de Intel
http://www.drpaulcarter.com/
http://nasm.sourceforge.net/
http://www.delorie.com/djgpp
http://www.linuxassembly.org/
http://webster.cs.ucr.edu/
comp.lang.asm.x86
http://www.intel.com/design/Pentium4/documentation.htm
Comentarios
El autor agradece cualquier comentario sobre este trabajo.
E-mail:
WWW:
[email protected]
http://www.drpaulcarter.com/pcasm
iv
PREFACIO
Cap´ıtulo 1
Introducci´on
1.1. Sistemas de numeraci´on
La memoria en un computador est´a compuesta de n´umeros. La memoria
del computador no almacena estos n´umeros en decimal (base 10). Porque
se simplifica mucho el hardware, los computadores almacenan toda la in-
formaci´on en binario (base 2). Primero haremos una revisi´on del sistema
decimal.
1.1.1. Decimal
Los n´umeros con base 10 est´an compuestos de 10 posibles d´ıgitos (0-9).
Cada d´ıgito de un n´umero tiene una potencia de 10 asociada con ´el, basada
en su posici´on en el n´umero. Por ejemplo:
234 = 2 × 102 + 3 × 101 + 4 × 100
1.1.2. Binario
Los n´umeros en base dos est´an compuestos de dos posibles d´ıgitos (0 y
1). Cada d´ıgito de un n´umero tiene una potencia de 2 asociada con ´el basada
en su posici´on en el n´umero. Por ejemplo:
110012 = 1 × 24 + 1 × 23 + 0 × 22 + 0 × 21 + 1 × 20
= 16 + 8 + 1
= 25
Esto muestra c´omo los n´umeros binarios se pueden convertir a decimal.
El Cuadro 1.1 muestra c´omo se representan los primeros n´umeros en binario.
La Figura 1.1 muestra c´omo se suman los d´ıgitos binarios individuales
(bits). A continuaci´on un ejemplo:
1
2
CAP´ITULO 1. INTRODUCCI ´ON
Decimal Binario
0000
0001
0010
0011
0100
0101
0110
0111
0
1
2
3
4
5
6
7
Decimal Binario
1000
1001
1010
1011
1100
1101
1110
1111
8
9
10
11
12
13
14
15
Cuadro 1.1: Decimal de 0 a 15 en binario
No hay carry antes
S´ı hay carry antes
0
+0
0
0
+1
1
1
+0
1
1
+1
0
c
0
+0
1
0
+1
0
c
1
+0
0
c
1
+1
1
c
Figura 1.1: Suma binaria (c es carry)
110112
+100012
1011002
Si uno considera la siguiente divisi´on decimal:
1234 ÷ 10 = 123 r 4
podemos ver que esta divisi´on suprime el d´ıgito del extremo derecho del
n´umero y desplaza los otros d´ıgitos una posici´on a la derecha. Dividiendo
por dos hacemos una operaci´on similar, pero para los d´ıgitos binarios de un
n´umero. Consideremos la siguiente divisi´on binaria1:
11012 ÷ 102 = 1102 r 1
Este hecho se puede usar para convertir un n´umero decimal a su repre-
sentaci´on equivalente en binario como muestra la Figura 1.2. Este m´etodo
encuentra primero el bit del extremo derecho, llamado bit menos significati-
vo (lsb). El bit del extremo izquierdo es llamado bit m´as significativo (msb).
La unidad b´asica de memoria est´a compuesta de 8 bits y es llamado byte
1El sub´ındice 2 se usa para mostrar que el n´umero est´a representado en binario no en
decimal
1.1. SISTEMAS DE NUMERACI ´ON
3
Decimal
Binario
25 ÷ 2 = 12 r 1 11001 ÷ 10 = 1100 r 1
12 ÷ 2 = 6 r 0
1100 ÷ 10 = 110 r 0
110 ÷ 10 = 11 r 0
6 ÷ 2 = 3 r 0
11 ÷ 10 = 1 r 1
3 ÷ 2 = 1 r 1
1 ÷ 2 = 0 r 1
1 ÷ 10 = 0 r 1
As´ı 2510 = 110012
Figura 1.2: Conversi´on a decimal
1.1.3. Hexadecimal
Los n´umero hexadecimales tienen base 16. Los hexadecimales (o hex) se
pueden usar como una representaci´on resumida de los n´umeros binarios. Los
n´umeros hexadecimales tienen 16 d´ıgitos posibles. Esto crea un problema
ya que no hay s´ımbolos para estos d´ıgitos adicionales despu´es del nueve.
Por convenci´on se usan letras para estos d´ıgitos adicionales. Los 16 d´ıgitos
hexadecimales son: 0-9 y luego A, B, C, D, E, F. El d´ıgito A equivale a 10
en decimal, B es 11 etc. Cada d´ıgito de un n´umero hexadecimal tiene una
potencia de 16 asociada con ´el. Por ejemplo:
2BD16 = 2 × 162 + 11 × 161 + 13 × 160
= 512 + 176 + 13
= 701
Para convertir de decimal a hex use la misma idea que la empleada para la
conversi´on binaria excepto que se divide por 16. Vea la Figura 1.3 para un
ejemplo.
La raz´on por la cual los hexadecimales son ´utiles es que hay una manera
f´acil para convertir entre hex y binario. Los n´umero binarios se tornan lar-
gos y molestos r´apidamente. La representaci´on hexadecimal es una manera
mucho m´as compacta de representar los n´umeros binarios.
Para convertir un n´umero hexadecimal a binario simplemente convierta
cada d´ıgito hexadecimal a un n´umero binario de 4 bits. Por ejemplo, 24D16
es convertido en 0010 0100 11012. Observe que ¡los ceros delanteros son im-
portantes! Si los ceros del d´ıgito de la mitad de 24D16 no se usan el resultado
es err´oneo. Convertir de binario a hex es igual de f´acil; uno hace el proceso
4
CAP´ITULO 1. INTRODUCCI ´ON
589 ÷ 16 = 36 r 13
36 ÷ 16 = 2 r 4
2 ÷ 16 = 0 r 2
As´ı 589 = 24D16
Figura 1.3:
inverso, convierte cada segmento de 4 bits a hexadecimal comenzando desde
el extremo derecho, no desde el izquierdo, del n´umero binario. Esto asegura
que el segmento de 4 bits es correcto2. Ejemplo:
110
6
0000
0101
1010
0111
0
5
A
7
11102
E16
Un n´umero de 4 bits es llamado nibble . As´ı cada d´ıgito hexadecimal
corresponde a un nibble. Dos nibbles conforman un byte y por lo tanto un
byte puede ser representado por dos d´ıgitos hexadecimales. Los valores de
un byte van de 0 a 11111111 en binario, 0 a FF en hex y 0 a 255 en decimal.
1.2. Organizaci´on del computador
1.2.1. La Mem
Comentarios de: Lenguaje Ensamblador para PC (0)
No hay comentarios