You are on page 1of 7

1.3 LENGUAJE ENSAMBLADOR 1.3.1 El lenguaje de mquina Cada tipo de CPU entiende su propio lenguaje de mquina.

Instrucciones en lenguaje de mquina son nmeros almacenados como bytes en memoria. Cada instruccin tiene su propio cdigo numrico nico llamado el cdigo de operacin o cdigo de operacin para abreviar. Las instrucciones del procesador 80x86 varan en tamao . El cdigo de operacin es siempre al comienzo de la instruccin . Muchas instrucciones tambin incluyen datos (por ejemplo , constantes o direcciones ) utilizados por la instruccin. El lenguaje de mquina es muy difcil de programar directamente. Descifrar los significados de las instrucciones numricas codificadas es tedioso para los seres humanos . Por ejemplo , la instruccin que dice para agregar las EAX y EBX registros juntos y almacenar el resultado en EAX est codificada por el siguiente hex cdigos : 03 C3. Esto no es obvio . Afortunadamente, un programa que se llama un ensamblador puede hacer este tedioso trabajo para el programador. 1.3.2 El lenguaje ensamblador Un programa en lenguaje ensamblador se almacena como texto (igual que un nivel ms alto programa de lenguaje ) . Cada instruccin de asamblea representa exactamente una mquina instrucciones. Por ejemplo, la instruccin Adems descrito anteriormente estara representada en lenguaje ensamblador como : add eax , ebx. Aqu el significado de la instruccin es mucho ms claro que en cdigo mquina. La palabra add es una regla mnemotcnica para la instruccin de suma . La forma general de una instruccin de montaje es : operando sentencia ( s ). Un ensamblador es un programa que lee un archivo de texto con instrucciones de montaje y convierte el conjunto en cdigo mquina. Los compiladores son programas que hacen las conversiones similares para los lenguajes de programacin de alto nivel. Un ensamblador es mucho ms simple que un compilador. Cada declaracin en lenguaje ensamblador representa directamente una nica instruccin de mquina. Instrucciones del lenguaje de alto nivel son mucho ms complejos y puede requerir muchas instrucciones de la mquina . Otra diferencia importante entre montaje y de alto nivel idiomas es que ya que cada tipo de CPU tiene su propio lenguaje de mquina, tambin tiene su propio lenguaje ensamblador. Trasladar los programas de montaje entre diferentes arquitecturas de computadora es mucho ms difcil que en un alto nivel idioma. Ejemplos de este manual se utilizan los Netwide ensamblador NASM o, para abreviar. Lo est disponible gratuitamente de la Internet (vase el prefacio de la URL). Ms comn ensambladores son de Microsoft Ensamblador (MASM) o ensamblador de Borland (TASM ) . Hay algunas diferencias en la sintaxis de montaje para MASM / - TASM y NASM.

1.3.3 OPERANDOS DE INSTRUCCIONES Instrucciones de cdigo de mquina tienen diferentes nmero y tipo de los operandos; Sin embargo, en general , cada instruccin en s tendr un nmero fijo de operandos (0 a 3) . Operandos pueden tener los siguientes tipos: REGISTRARSE: Estos operandos se refieren directamente al contenido de los registros de la CPU. MEMORIA : Se refieren a los datos en la memoria. La direccin de los datos puede ser una constante codificada en la instruccin o puede ser calculada utilizando los valores de los registros . Direccin siempre se compensa desde el principio de un segmento. INMEDIATA : Estos son valores fijos que se enumeran en la propia instruccin . Se almacenan en la propia instruccin ( en el segmento de cdigo ) , no en el segmento de datos . IMPLICITOS: ESTOS OPERANDOS No se muestran explcitamente. Por ejemplo , el incremento instruccin suma una a un registro o memoria. El uno es implcita.

1.3.4 INSTRUCCIONES BSICAS La instruccin ms bsica es la instruccin MOV . Se mueve datos de un lugar a otro (como el operador de asignacin en un lenguaje de alto nivel ) . Se necesitan dos operandos : MOV dest, src. Los datos especificados por el original se copia a dest. Una restriccin es que tanto operandos pueden no ser operandos de memoria. Esto seala otra peculiaridad de la asamblea. Hay reglas a menudo un tanto arbitrarias acerca de cmo los diferentes se utilizan instrucciones. Los operandos tambin deben ser del mismo tamao. El valor de AX no se puede almacenar en BL. He aqu un ejemplo (punto y coma comienzan un comentario) : mov eax , 3; ALMACENA 3 en el registro EAX ( 3 es el operando inmediato) mov bx, AX , almacenar el valor de AX en el registro BX La instruccin ADD se utiliza para sumar enteros . add eax , 4 ; eax = eax + 4 add al, ah , al = al + ah La instruccin SUB resta enteros. sub bx, 10 ; bx bx = - 10 sub ebx , edi ; ebx = ebx - edi El INC y DEC Valor mnimo de instrucciones o disminuir valores en uno. Desde el uno es un operando implcito , el cdigo mquina para INC y DEC es menor que la de las instrucciones ADD y SUB equivalentes. inc ecx ; ecx + + dEC dl ; dl -

1.3.5 DIRECTIVAS Una directiva es un artefacto de no el ensamblador de la CPU. Por lo general son utilizado para ordenar al ensamblador para hacer algo o informar a la ensamblador de algo. Ellos no se traducen a cdigo mquina. Los usos comunes de las directivas son: Definir constantes Definir memoria para almacenar datos en Memoria de grupo en segmentos Incluir condicionalmente cdigo fuente Incluir otros archivos Cdigo NASM pasa a travs de un preprocesador como C. Tiene muchas de Comandos de la misma preprocesador como C. Sin embargo, las directivas de preprocesador de NASM empezar con un % en lugar de un # como en C. La directiva equ. La directiva equ se puede utilizar para definir un smbolo. Los smbolos se denominan constantes que se pueden utilizar en el programa de montaje. El formato es: sYmbol equ VALUE. LOS Valores de los smbolos no pueden ser redefinidos ms tarde. Carta de Unidad byte B palabra W palabra doble D palabra quad Q diez bytes T Tabla 1.3: Cartas para RESX y las Directivas DX El % definir Directiva Esta directiva es similar a la de C # definen Directiva. Es ms comnmente utilizado para definir las macros constantes as como en C. % definir TAMAO 100 mov eax , TAMAO El cdigo anterior define un llamado TAMAO macro y muestra su uso en un MOV instrucciones. Las macros son ms flexibles que los smbolos de dos maneras. Macros puede redefinirse y pueden ser ms que los nmeros constantes simples.

Directivas de Datos Directivas de datos se utilizan en los segmentos de datos para definir espacio para la memoria. Hay dos maneras de memoria puede ser reservado . La primera forma slo define espacio para los datos; la segunda forma define habitacin y un valor inicial. El primer mtodo utiliza una de las directivas RESX. El X se sustituye con una carta que determina el tamao del objeto (u objetos ) que se almacenar . Cuadro 1.3 se muestran los valores posibles. El segundo mtodo (que define un valor inicial, demasiado) utiliza uno de los Directivas DX . Las letras X son los mismos que los de las directivas RESX. Es muy comn para marcar las ubicaciones de memoria con etiquetas. Las etiquetas permiten uno para referirse fcilmente a posiciones de memoria en cdigo. A continuacin se presentan varios ejemplos: L1 db 0; byte etiqueta L1 con valor inicial 0 L2 dw 1000; palabra etiquetada L2 con valor inicial 1000 110101b db L3; byte inicializado a binario 110101 (53 en decimal) 12h db L4; byte inicializado a hexadecimal 12 (18 en decimal) 17o db L5; byte inicializado a octal 17 (15 en decimal) L6 dd 1A92h; palabra doble inicializado a hexadecimal 1A92 L7 resb 1 ; 1 byte sin inicializar L8 db " A"; byte inicializado a cdigo ASCII para A (65 ) Las comillas dobles y las comillas simples son tratados de la misma. De datos consecutivos definiciones se almacenan secuencialmente en la memoria. Es decir, la palabra L2 se almacena inmediatamente despus de la L1 en la memoria. Secuencias de memoria tambin pueden ser definidos. L9 dB 0 , 1 , 2 , 3 ; define 4 bytes L10 db " w " , "o", "r" , "d" , 0 , define una cadena C = " palabra" L11 db 'palabra' , 0 ; mismo que L10 La directiva DD se puede utilizar para definir tanto nmero entero y de precisin simple flotantes constantes PUNTO5 . Sin embargo , el DQ slo se puede utilizar para definir doble precisin constantes de coma flotante. Para las grandes secuencias , directiva TIMES de NASM menudo es til. Esta directiva repite su operando un nmero determinado de veces. Por ejemplo , L12 Tiempos 100 db 0 ; equivalente a 100 ( db 0 ) ' s L13 resw 100 ; sala reservas de 100 palabras Recuerde que las etiquetas se pueden utilizar para hacer referencia a los datos en el cdigo. Hay dos formas en que una etiqueta se puede utilizar. Si se utiliza una etiqueta normal , se interpreta como el direccin (o desplazamiento) de los datos . Si la etiqueta se coloca entre corchetes ([] ) ,

Se interpreta como los datos en la direccin . En otras palabras , uno debe pensar en una etiqueta como un puntero a los datos y los corchetes desreferencias el puntero del mismo modo que el asterisco hace en C. (MASM / TASM seguir un diferente convencin.)

En el modo de 32 bits, las direcciones son de 32 bits . He aqu algunos ejemplos : 1 mov al, [ L1 ], byte copia en L1 en AL 2 mov eax , L1 ; EAX = direccin del byte en L1 3 mov [ L1 ] , ah , copie AH en el byte en L1 4 mov eax , [ L6 ] , copia palabra doble en L6 en EAX 5 add eax , [ L6 ] ; EAX EAX = + palabra doble en L6 6 aadir [ L6 ] , eax ; palabra doble en L6 + = EAX 7 mov al, [ L6 ] , copia primer byte de la palabra doble en L6 en AL Lnea 7 de los ejemplos muestra una propiedad importante de NASM . El ensamblador no perder de vista el tipo de datos que una etiqueta se refiere. Nos corresponde a el programador para asegurarse de que l ( o ella ) utiliza una etiqueta correctamente. ms tarde que ser comn para almacenar las direcciones de los datos en los registros y utilizar el registro como una variable de puntero en C. De nuevo, no se hace la comprobacin de que un puntero es se usa correctamente. De esta manera, el montaje es mucho ms propenso a errores que incluso C. Considere la siguiente instruccin: mov [ L6 ] , 1, almacenar un 1 en L6 Esta declaracin produce un tamao de operacin no especificada de error. Por qu? Debido a que el ensamblador no sabe si desea almacenar el 1 como un byte, palabra o una palabra doble. Para solucionar este problema, agregue una indicacin de tamao: mov dword [L6], 1; almacenar un 1 en L6 Punto flotante de precisin 5Single es equivalente a una variable float en C. Esto le indica al ensamblador para almacenar un 1 en la palabra doble que comienza en L6. Otros especificadores de tamao son: BYTE, WORD , QWORD y TWORD6 . 1.3.6 ENTRADA Y SALIDA La entrada y salida son actividades muy dependientes del sistema. Se trata de la interconexin con el hardware del sistema . Los lenguajes de alto nivel, como C , proporcionan bibliotecas estndar de rutinas que proporcionan una programacin sencilla y uniforme interfaz de I / O. Idiomas de la Asamblea no ofrecen las bibliotecas estndar . Ellos o bien debe acceder directamente al hardware (que es una operacin privilegiada en protegida mode) o usar las rutinas de bajo nivel lo que el sistema operativo proporciona. Es muy comn que las rutinas en ensamblador para ser

interconectados con C. Uno ventaja de esto es que el cdigo ensamblador puede utilizar la biblioteca C estndar E / S rutinas . Sin embargo , hay que conocer las normas para la transmisin de informacin entre las rutinas que utiliza C . Estas reglas son demasiado complicados para cubrir aqu . ( Ellos se tratan ms adelante !) Para simplificar la E / S, el autor ha desarrollado sus propias rutinas que esconden las reglas C complejos y proporcionan una forma mucho ms interfaz simple. Tabla 1.4 describe las rutinas proporcionadas. Todas las rutinas preservar el valor de todos los registros , excepto por las rutinas de lectura. Estas rutinas no modifican el valor del registro EAX . Para utilizar estas rutinas, uno debe incluir un archivo con la informacin de que el ensamblador debe usarlos. Para incluir un archivo en NASM , utilice % include directiva de preprocesador . La siguiente lnea se incluye el archivo necesario en I / O routines7 del autor : % include " asm_io.inc " Para utilizar una de las rutinas de impresin, uno cargas EAX con el valor correcto y utiliza una instruccin CALL para invocarlo. La instruccin CALL es equivalente a una llamada a una funcin en un lenguaje de alto nivel. Se salta la ejecucin a otro seccin del cdigo, pero regresa de nuevo a su origen despus de la rutina ha terminado. El programa de ejemplo siguiente muestra varios ejemplos de llamadas a estas E / S rutinas. 1.3.7 DEPURACIN La biblioteca del autor tambin contiene algunas rutinas tiles para la depuracin programas. Estas rutinas de depuracin muestran informacin sobre el estado del ordenador sin necesidad de modificar el estado. Estas rutinas son realmente macros

print int Imprime a la pantalla el valor del entero almacenado en EAX print char imprime a la pantalla el carcter cuyo ASCII valor almacenado en AL print string imprime a la pantalla de los contenidos de la cadena en la direccin almacenada en EAX. La cadena debe ser un Ctype cadena (es decir, terminada nula). print nl Imprime a la pantalla un carcter de nueva lnea. read int Lee un nmero entero desde el teclado y la almacena en el registro EAX. read char Lee un carcter del teclado y almacena su cdigo ASCII en el registro EAX. Tabla 1.4 : Rutinas Asamblea de E / S Que preservan el estado actual de la CPU y luego hacer una llamada de subprograma. Las macros se definen en el archivo io.inc asm discutido anteriormente. Macros se utilizan como instrucciones ordinarias. Operandos de macros estn separados por comas. Hay cuatro rutinas de depuracin nombrados regs volquete volquetes mem, pila dump y volcado de matemticas, sino que

muestran los valores de los registros , memoria, pila y la coprocesador matemtico , respectivamente.

dump regs Esta macro imprime los valores de los registros (en hexadecimal) del ordenador a la salida estndar (es decir, la pantalla) . Tambin muestra el bits puestos en el registro FLAGS8. Por ejemplo , si el indicador de cero es 1 , ZF se muestra . Si es 0 , no se muestra . Toma un solo entero argumento que se imprime tambin. Esto puede ser utilizado para distinguir la salida de diferentes dump regs comandos. dump math Esta macro imprime los valores de los registros de las matemticas coprocesador. Se necesita un solo argumento de tipo entero que se utiliza para etiquetar la salida al igual que el argumento de regs volcado hace.