1.3 traduccion

10
1.3 LENGUAJE ENSAMBLADOR 1.3.1 El lenguaje de máquina Cada tipo de CPU entiende su propio lenguaje de máquina. Instrucciones en lenguaje de máquina son números almacenados como bytes en memoria. Cada instrucción tiene su propio código numérico único llamado el código de operación o código de operación para abreviar. Las instrucciones del procesador 80x86 varían en tamaño . El código de operación es siempre al comienzo de la instrucción . Muchas instrucciones también incluyen datos (por ejemplo , constantes o direcciones ) utilizados por la instrucción. El lenguaje de máquina es muy difícil de programar directamente. Descifrar los significados de las instrucciones numéricas codificadas es tedioso para los seres humanos . Por ejemplo , la instrucción que dice para agregar las EAX y EBX registros juntos y almacenar el resultado en EAX está codificada por el siguiente hex códigos : 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 más alto programa de lenguaje ) . Cada instrucción de asamblea representa exactamente una máquina instrucciones. Por ejemplo, la instrucción Además descrito anteriormente estaría representada en lenguaje ensamblador como : add eax , ebx. Aquí el significado de la instrucción es mucho más claro que en código máquina. La palabra add es una regla mnemotécnica para la instrucción de suma . La forma general de una instrucción 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 código máquina. Los compiladores son programas que hacen las conversiones similares para los lenguajes de programación de alto nivel. Un ensamblador es mucho más simple que un compilador. Cada

Transcript of 1.3 traduccion

Page 1: 1.3 traduccion

1.3 LENGUAJE ENSAMBLADOR1.3.1 El lenguaje de máquinaCada tipo de CPU entiende su propio lenguaje de máquina. Instrucciones en lenguaje de máquina son números almacenados como bytes en memoria. Cada instrucción tiene su propio código numérico único llamado el código de operación o código de operación para abreviar. Las instrucciones del procesador 80x86 varían en tamaño . El código de operación es siempre al comienzo de la instrucción . Muchas instrucciones también incluyen datos (por ejemplo , constantes o direcciones ) utilizados por la instrucción. El lenguaje de máquina es muy difícil de programar directamente. Descifrar los significados de las instrucciones numéricas codificadas es tedioso para los seres humanos . Por ejemplo , la instrucción que dice para agregar las EAX y EBX registros juntos y almacenar el resultado en EAX está codificada por el siguiente hex códigos : 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 más altoprograma de lenguaje ) . Cada instrucción de asamblea representa exactamente una máquina instrucciones. Por ejemplo, la instrucción Además descrito anteriormente estaría representada en lenguaje ensamblador como : add eax , ebx. Aquí el significado de la instrucción es mucho más claro que en código máquina. La palabra add es una regla mnemotécnica para la instrucción de suma . La forma general de una instrucción 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 código máquina. Los compiladores son programas que hacen las conversiones similares para los lenguajes de programación de alto nivel. Un ensamblador es mucho más simple que un compilador. Cada declaración en lenguaje ensamblador representa directamente una única instrucción de máquina. Instrucciones del lenguaje de alto nivel son mucho más complejos y puede requerir muchas instrucciones de la máquina . Otra diferencia importante entre montaje y de alto nivel idiomas es que ya que cada tipo de CPU tiene su propio lenguaje de máquina, también tiene su propio lenguaje ensamblador. Trasladar los programas de montaje entre diferentes arquitecturas de computadora es mucho más difícil 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 (véase el prefacio de la URL). Más común ensambladores son de Microsoft Ensamblador (MASM) o ensamblador de Borland (TASM ) . Hay algunas diferencias en la sintaxis de montaje para MASM / - TASM y NASM.

Page 2: 1.3 traduccion

1.3.3 OPERANDOS DE INSTRUCCIONESInstrucciones de código de máquina tienen diferentes número y tipo de los operandos;Sin embargo, en general , cada instrucción en sí tendrá un número 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 dirección de los datos puede ser una constante codificada en la instrucción o puede ser calculada utilizando los valores de los registros . Dirección siempre se compensa desde el principio de un segmento.INMEDIATA : Estos son valores fijos que se enumeran en la propia instrucción .Se almacenan en la propia instrucción ( en el segmento de código ) , no en el segmento de datos . IMPLICITOS: ESTOS OPERANDOS No se muestran explícitamente. Por ejemplo , el incremento instrucción suma una a un registro o memoria. El uno es implícita.

1.3.4 INSTRUCCIONES BÁSICASLa instrucción más básica es la instrucción MOV . Se mueve datos de un lugar a otro (como el operador de asignación en un lenguaje de alto nivel ) . Se necesitan dos operandos : MOV dest, src. Los datos especificados por el original se copia a dest. Una restricción es que tanto operandos pueden no ser operandos de memoria. Esto señala otra peculiaridad de la asamblea. Hay reglas a menudo un tanto arbitrarias acerca de cómo los diferentes se utilizan instrucciones. Los operandos también deben ser del mismo tamaño. 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 instrucción ADD se utiliza para sumar enteros .add eax , 4 ; eax = eax + 4

add al, ah , al = al + ah

La instrucción SUB resta enteros.sub bx, 10 ; bx bx = - 10

sub ebx , edi ; ebx = ebx - edi

El INC y DEC Valor mínimo de instrucciones o disminuir valores en uno. Desde el uno es un operando implícito , el código máquina para INC y DEC es menor que la de las instrucciones ADD y SUB equivalentes.

inc ecx ; ecx + +dEC dl ; dl -

Page 3: 1.3 traduccion

1.3.5 DIRECTIVASUna 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 código máquina. Los usos comunes de las directivas son:• Definir constantes• Definir memoria para almacenar datos en• Memoria de grupo en segmentos• Incluir condicionalmente código fuente• Incluir otros archivos

Código NASM pasa a través 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 símbolo. Los símbolos se denominan constantes que se pueden utilizar en el programa de montaje. El formato es: sYmbol equ VALUE. LOS Valores de los símbolos no pueden ser redefinidos más tarde.

Carta de Unidadbyte Bpalabra Wpalabra doble Dpalabra quad Qdiez bytes T

Tabla 1.3: Cartas para RESX y las Directivas DX

El % definir DirectivaEsta directiva es similar a la de C # definen Directiva. Es más comúnmente utilizado para definir las macros constantes así como en C.

% definir TAMAÑO 100mov eax , TAMAÑO

El código anterior define un llamado TAMAÑO macro y muestra su uso en un MOV instrucciones. Las macros son más flexibles que los símbolos de dos maneras. Macros puede redefinirse y pueden ser más que los números constantes simples.

Page 4: 1.3 traduccion

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 sólo define espacio para los datos; la segunda forma define habitación y un valor inicial. El primer método utiliza una de las directivas RESX. El X se sustituye con una carta que determina el tamaño del objeto (u objetos ) que se almacenará . Cuadro 1.3 se muestran los valores posibles.

El segundo método (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 común para marcar las ubicaciones de memoria con etiquetas. Las etiquetas permiten uno para referirse fácilmente a posiciones de memoria en código. A continuación se presentan varios ejemplos:

L1 db 0; byte etiqueta L1 con valor inicial 0L2 dw 1000; palabra etiquetada L2 con valor inicial 1000110101b 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 1A92L7 resb 1 ; 1 byte sin inicializarL8 db " A"; byte inicializado a código 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 después de la L1 en la memoria. Secuencias de memoria también pueden ser definidos.

L9 dB 0 , 1 , 2 , 3 ; define 4 bytesL10 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 número entero y de precisión simple flotantes constantes PUNTO5 . Sin embargo , el DQ sólo se puede utilizar para definir doble precisión constantes de coma flotante. Para las grandes secuencias , directiva TIMES de NASM menudo es útil. Esta directiva repite su operando un número determinado de veces. Por ejemplo ,

L12 Tiempos 100 db 0 ; equivalente a 100 ( db 0 ) ' sL13 resw 100 ; sala reservas de 100 palabras

Recuerde que las etiquetas se pueden utilizar para hacer referencia a los datos en el código. Hay dos formas en que una etiqueta se puede utilizar. Si se utiliza una etiqueta normal , se interpreta como el dirección (o desplazamiento) de los datos . Si la etiqueta se coloca entre corchetes ([] ) ,

Page 5: 1.3 traduccion

Se interpreta como los datos en la dirección . 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 convención.)

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 AL2 mov eax , L1 ; EAX = dirección del byte en L13 mov [ L1 ] , ah , copie AH en el byte en L14 mov eax , [ L6 ] , copia palabra doble en L6 en EAX5 add eax , [ L6 ] ; EAX EAX = + palabra doble en L66 añadir [ L6 ] , eax ; palabra doble en L6 + = EAX7 mov al, [ L6 ] , copia primer byte de la palabra doble en L6 en AL

Línea 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. más tarde que será común 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 comprobación de que un puntero es se usa correctamente. De esta manera, el montaje es mucho más propenso a errores que incluso C.

Considere la siguiente instrucción:mov [ L6 ] , 1, almacenar un 1 en L6

Esta declaración produce un tamaño de operación 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 indicación de tamaño: mov dword [L6], 1; almacenar un 1 en L6 Punto flotante de precisión 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 tamaño son: BYTE, WORD , QWORD y TWORD6 .

1.3.6 ENTRADA Y SALIDALa entrada y salida son actividades muy dependientes del sistema. Se trata de la interconexión con el hardware del sistema . Los lenguajes de alto nivel, como C , proporcionan bibliotecas estándar de rutinas que proporcionan una programación sencilla y uniforme interfaz de I / O. Idiomas de la Asamblea no ofrecen las bibliotecas estándar . Ellos o bien debe acceder directamente al hardware (que es una operación privilegiada en protegida mode) o usar las rutinas de bajo nivel lo que el sistema operativo proporciona. Es muy común que las rutinas en ensamblador para ser

Page 6: 1.3 traduccion

interconectados con C. Uno ventaja de esto es que el código ensamblador puede utilizar la biblioteca C estándar E / S rutinas . Sin embargo , hay que conocer las normas para la transmisión de información entre las rutinas que utiliza C . Estas reglas son demasiado complicados para cubrir aquí . ( Ellos se tratan más adelante !) Para simplificar la E / S, el autor ha desarrollado sus propias rutinas que esconden las reglas C complejos y proporcionan una forma mucho más 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 información de que el ensamblador debe usarlos. Para incluir un archivo en NASM , utilice % include directiva de preprocesador . La siguiente línea se incluye el archivo necesario en I / O routines7 del autor :

% include " asm_io.inc "

Para utilizar una de las rutinas de impresión, uno cargas EAX con el valor correcto y utiliza una instrucción CALL para invocarlo. La instrucción CALL es equivalente a una llamada a una función en un lenguaje de alto nivel. Se salta la ejecución a otro sección del código, pero regresa de nuevo a su origen después de la rutina ha terminado. El programa de ejemplo siguiente muestra varios ejemplos de llamadas a estas E / S rutinas.

1.3.7 DEPURACIÓNLa biblioteca del autor también contiene algunas rutinas útiles para la depuración programas. Estas rutinas de depuración muestran información 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 EAXprint char imprime a la pantalla el carácter cuyo ASCII valor almacenado en ALprint string imprime a la pantalla de los contenidos de la cadena en la dirección almacenada en EAX. La cadena debe ser un Ctype cadena (es decir, terminada nula).print nl Imprime a la pantalla un carácter de nueva línea.read int Lee un número entero desde el teclado y la almacena en el registro EAX.read char Lee un carácter del teclado y almacena su código 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 están separados por comas. Hay cuatro rutinas de depuración nombrados regs volquete volquetes mem, pila dump y volcado de matemáticas, sino que

Page 7: 1.3 traduccion

muestran los valores de los registros , memoria, pila y la coprocesador matemático , respectivamente.

dump regs Esta macro imprime los valores de los registros (en hexadecimal) del ordenador a la salida estándar (es decir, la pantalla) . También 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 enteroargumento que se imprime también. 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 matemáticas 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.