Top Banner
Página 1 ensamblador plana 1.70 Manual del programador Tomasz Grysztar
117

Lenguage asembler FASM_esp

Dec 24, 2015

Download

Documents

Eddin Ordoñez

Manual practico para manejar lenguaje ensamblador en Flat Assembler (FASM)
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Lenguage asembler FASM_esp

Página 1

ensamblador plana 1.70

Manual del programador

Tomasz Grysztar

Page 2: Lenguage asembler FASM_esp

Page 2

2

Page 3: Lenguage asembler FASM_esp

Page 3

Contenido

1 Introducción 71.1 Información general del compilador. . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.1.1 Requisitos del sistema. . .. . . . . . . . . . . . . . . . . . . . . . 71.1.2 Uso del compilador. . .. . . . . . . . . . . . . . . . . . . . . . . . . 81.1.3 Comandos de teclado en el editor. . .. . . . . . . . . . . . . . . . . 91.1.4 Opciones del Editor. .. . . . . . . . . . . . . . . . . . . . . . . . . . . 111.1.5 Ejecución de compilador de línea de comandos. .. . . . . . . . . . . . . 111.1.6 Comando mensajes del compilador de línea. .. . . . . . . . . . . . . . . . 121.1.7 Los formatos de salida. .. . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.2 sintaxis Asamblea. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.1 sintaxis de instrucciones. .. . . . . . . . . . . . . . . . . . . . . . . . 131.2.2 Las definiciones de datos. .. . . . . . . . . . . . . . . . . . . . . . . . . . 151.2.3 Constantes y etiquetas. .. . . . . . . . . . . . . . . . . . . . . . . 161.2.4 expresiones numéricas. .. . . . . . . . . . . . . . . . . . . . . . 171.2.5 Los saltos y llamadas. .. . . . . . . . . . . . . . . . . . . . . . . . . . 191.2.6 valores de tamaño. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Conjunto 2 Instrucción 212.1 Las instrucciones de arquitectura x86. .. . . . . . . . . . . . . . . . . . . . 21

2.1.1 instrucciones de movimiento de datos. .. . . . . . . . . . . . . . . . . . . 212.1.2 Tipo instrucciones de conversión. .. . . . . . . . . . . . . . . . . . . 232.1.3 instrucciones aritméticas binarias. .. . . . . . . . . . . . . . . . . . 232.1.4 instrucciones aritméticas decimales. .. . . . . . . . . . . . . . . . . 252.1.5 Instrucciones lógicas. .. . . . . . . . . . . . . . . . . . . . . . . . 262.1.6 instrucciones de transferencia de control. .. . . . . . . . . . . . . . . . . . . 282.1.7 E / S instrucciones. .. . . . . . . . . . . . . . . . . . . . . . . . . . 312.1.8 operaciones de Cuerdas. .. . . . . . . . . . . . . . . . . . . . . . . . . 322.1.9 instrucciones de control de la bandera. .. . . . . . . . . . . . . . . . . . . . . 3301/02/10 operaciones condicionales. .. . . . . . . . . . . . . . . . . . . . . . 342.1.11 instrucciones Misceláneos . . . . . . . . . . . . . . . . . . . . . . 352.1.12 Las instrucciones del sistema. .. . . . . . . . . . . . . . . . . . . . . . . . 3601/02/13 FPU instrucciones. .. . . . . . . . . . . . . . . . . . . . . . . . . 38

3

Página 4

Page 4: Lenguage asembler FASM_esp

4 CONTENIDOS

2.1.14 instrucciones MMX. .. . . . . . . . . . . . . . . . . . . . . . . . 422.1.15 instrucciones SSE. .. . . . . . . . . . . . . . . . . . . . . . . . . 4402/01/16 instrucciones SSE2. .. . . . . . . . . . . . . . . . . . . . . . . . . 4802/01/17 instrucciones SSE3. .. . . . . . . . . . . . . . . . . . . . . . . . . 512.1.18 AMD 3DNow! instrucciones. . .. . . . . . . . . . . . . . . . . . . 532.1.19 Las instrucciones del modo de largos x86­64. .. . . . . . . . . . . . . . . 5402/01/20 instrucciones SSE4. .. . . . . . . . . . . . . . . . . . . . . . . . . 5702/01/21 instrucciones AVX. .. . . . . . . . . . . . . . . . . . . . . . . . . 6101/02/22 instrucciones AVX2. .. . . . . . . . . . . . . . . . . . . . . . . . 6501/02/23 conjuntos auxiliares de instrucciones computacionales . . . . . . . . . . . . 6802.01.24 Otras extensiones de conjunto de instrucciones . . . . . . . . . . . . . . . . . 74

Directivas 2.2 Control. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772.2.1 constantes numéricas. .. . . . . . . . . . . . . . . . . . . . . . . 772.2.2 ensamblaje condicional. .. . . . . . . . . . . . . . . . . . . . . . . 782.2.3 bloques de repetición de instrucciones. .. . . . . . . . . . . . . . . . . 802.2.4 espacios de direccionamiento. .. . . . . . . . . . . . . . . . . . . . . . . . . 812.2.5 Otras directivas. .. . . . . . . . . . . . . . . . . . . . . . . . . . 832.2.6 pases múltiples. .. . . . . . . . . . . . . . . . . . . . . . . . . . 84

Directivas 2.3 preprocesador. .. . . . . . . . . . . . . . . . . . . . . . . . . . 862.3.1 La inclusión de archivos de origen. .. . . . . . . . . . . . . . . . . . . . . . . 862.3.2 Las constantes simbólicas. .. . . . . . . . . . . . . . . . . . . . . . . . 872.3.3 macroinstrucciones. .. . . . . . . . . . . . . . . . . . . . . . . . . 882.3.4 Estructuras. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962.3.5 macroinstrucciones Repetición. .. . . . . . . . . . . . . . . . . . . 972.3.6 preprocesamiento condicional. .. . . . . . . . . . . . . . . . . . . . 992.3.7 Orden de procesamiento. .. . . . . . . . . . . . . . . . . . . . . . . . 100

2.4 directivas Formatter. .. . . . . . . . . . . . . . . . . . . . . . . . . . . 1032.4.1 MZ ejecutable. .. . . . . . . . . . . . . . . . . . . . . . . . . . 1032.4.2 Portable Executable. .. . . . . . . . . . . . . . . . . . . . . . . 1042.4.3 Common Object File Format. . .. . . . . . . . . . . . . . . . . 1052.4.4 Formato ejecutable y enlazable. .. . . . . . . . . . . . . . . . 106

3 de programación de Windows 1093.1 encabezados básicos. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

3.1.1 Estructuras. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1103.1.2 Importaciones. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1133.1.3 Procedimientos (32­bit). .. . . . . . . . . . . . . . . . . . . . . . . . 1143.1.4 Procedimientos (64­bit). .. . . . . . . . . . . . . . . . . . . . . . . . 1163.1.5 Personalización de los procedimientos. .. . . . . . . . . . . . . . . . . . . . . 1173.1.6 Exportaciones. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1193.1.7 Modelo de objetos componentes. . .. . . . . . . . . . . . . . . . . . . 1193.1.8 Recursos. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Page 5

CONTENIDOS 5

3.1.9 Codificación de texto. .. . . . . . . . . . . . . . . . . . . . . . . . . . . 1243.2 encabezados extendidos. . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

3.2.1 Parámetros del procedimiento. .. . . . . . . . . . . . . . . . . . . . . . 125

Page 5: Lenguage asembler FASM_esp

3.2.2 Estructuración de la fuente. .. . . . . . . . . . . . . . . . . . . . . . 126

Page 6

6 CONTENIDOS

Page 6: Lenguage asembler FASM_esp

Página 7

Capítulo 1

Introducción

Page 7: Lenguage asembler FASM_esp

Este capítulo contiene toda la información más importante que necesita para comenzar a utilizar elensamblador plana. Si tiene experiencia programador de lenguaje ensamblador, debe leeral menos este capítulo antes de utilizar este compilador.

1.1 Información general del Compilador

Ensamblador Flat es un compilador de lenguaje ensamblador rápido para los procesadores de arquitectura x86,que hace múltiples pases para optimizar el tamaño de código de máquina generado. Es auto­compilable y se proporcionan versiones para diferentes sistemas operativos. Están diseñadospara ser utilizado desde la línea de comandos del sistema y no deben diferir en el comportamiento.

Este documento describe también la versión IDE diseñado para el sistema de Windows,que utiliza la interfaz gráfica en lugar de la consola y tiene el editor integrado. Perodesde el punto de vista de compilación tiene exactamente la misma funcionalidad que toda la consolaversiones, y más tarde las partes (a partir fro m 1. 2) de este documento son comunes con otrosliberaciones. El ejecutable de la versión IDE se llama fasmw.exe, mientras fasm.exe es laversión de línea de comandos.

1.1.1 Requisitos del sistema

Todas las versiones requieren que el procesador de 32 bits la arquitectura x86 (al menos 80.386), a pesar de quepuede producir programas para los procesadores de arquitectura x86 de 16 bits, también. Consola de Windowsversión requiere cualquier sistema operativo Win32, mientras que la versión de Windows GUI requiere laWin32 GUI sistema de la versión 4.0 o superior, por lo que debería funcionar en todos los sistemas compatiblescon Windows 95.

La fuente ejemplo proporcionado con esta versión requerir tienes variable de entornoComprenden la modalidad a la ruta del directorio de incluir, que es la parte del ensamblador planapaquete. Si dicha variable ya existe en el sistema y contiene las rutas utilizadas por algunosotro programa, es suficiente para añadir la nueva ruta a la misma (los diferentes caminos deben serseparados con punto y coma). Si no desea definir como variable en el sistema,

7

Página 8

8 CAPÍTULO 1. INTRODUCCIÓN

o no saben cómo hacerlo, puedes configurarlo para el IDE ensamblador plana sólo editandoel archivo fasmw.ini en su directorio (este archivo es creado por fasmw.exe cuando es ejecutado,pero también se puede crear por ti mismo). En este caso, debe agregar el valor Incluyaen la sección de Medio Ambiente. Por ejemplo, cuando haya desembalado la Asamblea de la planaarchivos BLER en el directorio c: \ fasmw, debe poner las dos líneas siguientes en suc: \ fasmw \ fasmw.ini archivo:

[Medio Ambiente]Incluir = c: \ fasmw \ include

Si no se define la variable de entorno INCLUDE correctamente, usted tendrá que manualmenteproporcionar la ruta completa para el Win32 incluye en cada programa que desea compilar.

1.1.2 Uso del compilador

Para empezar a trabajar con ensamblador plana, simplemente haga doble clic en el icono de archivo fasmw.exe,o arrastre el icono del archivo fuente en la misma. También puede después abrir nuevos archivos de origencon el comando Abrir en el menú Archivo, o arrastrando los archivos en el editor

Page 8: Lenguage asembler FASM_esp

ventana. Puede tener varios archivos de origen se abrieron a la vez, cada uno está representadopor un botón pestaña en la parte inferior de la ventana del editor. Para seleccionar el archivo para la edición, haga clic enen la ficha correspondiente con el botón izquierdo del ratón. Compilador por defecto funciona sobre laarchivo que se está editando actualmente, pero usted puede forzarlo a operar siempre en alguna en particulararchivo haciendo clic en la ficha correspondiente con el botón derecho del ratón y seleccionando la Asignacióncomandos. Sólo un único archivo puede ser asignado a compilador al mismo tiempo.

Cuando el archivo de origen es listo, puede ejecutar el compilador con el comando Compilaren el menú Ejecutar. Cuando la compilación se realiza correctamente, el compilador mostrará elResumen del proceso de compilación; de lo contrario, se mostrará la información sobre el errorque ocurrieron. Resumen Compilación incluye la información de la cantidad de pases fuehecho, la cantidad de tiempo que tomó, y cuántos bytes se escribieron en el archivo de destino.También contiene un campo de texto llamado Display, en la que aparecerá ningún mensaje de lavisualización directivas en fuente (ver 2.2.5 ). Resumen de error consiste al menos en el errormensaje y un campo de texto de visualización, que tiene el mismo propósito que el anterior. Si el error está relacionadoen cierta línea específica de código fuente, el resumen contiene también un campo de texto de instrucciones,que contiene el formulario de preprocesado de la instrucción que provocó un error si el errorocurrido después de la etapa de preprocesador (de lo contrario es vacía) y la lista de fuentes, quemuestra la ubicación de todas las líneas de las fuentes relacionadas con este error, cuando se selecciona una línea deesta lista, que será al mismo tiempo seleccionado en la ventana del editor (si el archivo que contieneesa línea no está cargado, se añadirá automáticamente).

El comando Run también ejecuta el compilador, y en caso de una compilación exitosase ejecuta el programa compilado si sólo es uno de los formatos que se puede ejecutar en Windowsmedio ambiente, de lo contrario obtendrá un mensaje de que este tipo de archivo no se puede ejecutar.Si se produce un error, el compilador muestra información sobre él en la misma forma que si elComando de compilación se utilizó.

Page 9

1.1. PANORAMA COMPILADOR 9

Si el compilador se queda sin memoria, puede aumentar la asignación de memoria en elDiálogo de configuración del compilador, que puede comenzar desde el menú Opciones. Puede especificarno la cantidad de kilobytes que el compilador debe usar, y también la prioridad de lahilo de compilador.

Si desea sólo una instancia de programa esté funcionando, agregue el OneInstanceOnly = 1el establecimiento de la sección Opciones del archivo fasmw.ini.

1.1.3 Comandos de teclado en el editor

En esta sección se enumeran los todos los comandos de teclado disponibles cuando se trabaja con el editor. Exceptopara las claves que figuran como los específicos, que son comunes con el IDE de DOS para ensamblador plana.

Movimiento:

Flecha izquierda mover un carácter a la izquierdaFlecha derecha mover un carácter a la derechaFlecha arriba mover una línea hacia arribaFlecha hacia abajo mover una línea hacia abajoCtrl + Flecha izquierda mover una palabra a la izquierdaCtrl + Flecha derecha mover una palabra correctaCasa desplazarse al principio de la línea deFin desplazarse al final de la línea

Page 9: Lenguage asembler FASM_esp

Re Pág mover una página hacia arribaAvPág mover a la página siguienteCtrl + Inicio ir a la primera línea de la páginaCtrl + Fin mover a la última línea de la páginaCtrl + RePág ir a la primera línea de textoCtrl + AvPág pasar a la última línea de texto

Cada una de las teclas de movimiento prensadas con Shift selecciona texto.

Edición:

Insertar insert interruptor de modo / sobreescrituraAlt + Insert cambiar bloques horizontales / verticalesBorrar borrar el carácter actualRetroceso borrar el carácter anteriorCtrl + Retroceso eliminar palabra anteriorAlt + Retroceso deshacer la operación anterior (también Ctrl + Z)Ctrl + Y eliminar línea actualF6 duplicar la línea actual

Página 10

10 CAPÍTULO 1. INTRODUCCIÓN

Operaciones de bloque:

Ctrl + Insert bloque de copia en el portapapeles (también Ctrl + C)Shift + Insert pasta de bloque desde el portapapeles (también Ctrl + V)Ctrl + Supr Eliminar bloqueShift + Supr bloque de corte en el portapapeles (también Ctrl + X)Ctrl + A seleccionar todo el texto

Búsqueda:

F5 ir a la posición especificada (también Ctrl + G)F7 encontrar (también Ctrl + F)Shift + F7 encontrar siguiente (también F3)Ctrl + F7 reemplazar (también Ctrl + H)

Recopilar:

F9 compilar y ejecutarCtrl + F9 compilar sóloShift + F9 asignar archivo actual como archivo principal para compilarCtrl + F8 compilar y generar información de símbolos

Otras claves:

F2 guardar archivo actualShift + F2 guardar el archivo con un nuevo nombreF4 archivo de carga

Page 10: Lenguage asembler FASM_esp

Ctrl + N crear nuevo archivoCtrl + Tab cambiar a la siguiente fotoCtrl + Shift + Tab cambiar al archivo anteriorAlt + [1­9] cambiar a archivo de número dadoEsc archivo actual cercaAlt + X cerrar todos los archivos y salirCtrl + F6 calculadoraAlt + flecha izquierda desplazamiento a la izquierdaAlt + flecha derecha derecho de desplazamientoAlt + Flecha arriba desplazarse hacia arribaAlt + Flecha abajo desplácese hacia abajoAlt + Supr descartar deshacer información

Teclas específicas:

Página 11

1.1. PANORAMA COMPILADOR 11

F1 buscar la palabra clave en el archivo de ayuda seleccionadoAlt + F1 contenido del archivo de ayuda seleccionado

1.1.4 Opciones del Editor

En el menú Opciones reside también una lista de opciones del editor, que puede ser activado o desactivadoy afectar el comportamiento de editor. Esta sección describe estas opciones.

Selección seguro ­ cuando usted activa esta opción, el bloque seleccionado nunca se eliminaal empezar a escribir. Al hacer cualquier operación de cambio de texto, la selección escancelado, no afecta en modo alguno el texto que se ha seleccionado, y luego el comandose lleva a cabo. Cuando esta opción está desactivada y usted comience a escribir, la selección actual esdescartado, también tecla Supr simplemente borra el bloque seleccionado (cuando la selección segura está enusted tiene que utilizar las teclas Ctrl + Supr).

Soportes automáticos ­ cuando escribe cualquiera de los soportes de apertura, el cierre esponer automáticamente justo después de intercalación.

Guiones automáticos ­ cuando se pulsa Intro para iniciar una nueva línea, el cursor se mueve enla nueva línea en la misma posición, donde en la línea anterior el primer caracter no blancose coloca. Si usted está rompiendo la línea, y había algunos caracteres no en blanco despuésel cursor cuando se pulsa ENTER, se trasladan a la nueva línea en la posición deguión, los caracteres en blanco que estaban entre el cursor y ellos son ignorados.

Tabulación Smart ­ al pulsar Tab, que te mueve a la posición justo por debajola siguiente secuencia de caracteres no en blanco en la línea anterior a partir de la posiciónjusto por encima de donde estaba. Si tal secuencia no se encuentra en la línea de arriba, la normase utiliza el tamaño de tabulación de 8 caracteres.

Llenado óptimo de ahorro ­ con esta opción activada, cuando se guarda el archivo, todo en blancoáreas se llenan con la combinación óptima de las pestañas y los espacios para obtener el archivo más pequeñotamaño. Si esta opción está desactivada, las áreas en blanco se guardan como lleno de espacios (pero los espaciosen los extremos de las líneas no se guardan).

Revive las teclas muertas ­ cuando esta opción está activada, se desactiva dentro del editor delllamada teclas muertas (teclas que no generan inmediatamente el carácter, sino que esperasenuna próxima clave para decidir qué personaje para poner ­ por lo general se introduce el carácter de un muertoclave pulsando una tecla de espacio después de él). Puede ser útil si la clave para la introducción de algunas de las

Page 11: Lenguage asembler FASM_esp

caracteres que usted necesita para entrar a menudo en la fuente de ensamblaje es una clave muertos y que no lo hacenNecesitará esta funcionalidad para escribir programas.

1.1.5 Ejecución de compilador de línea de comandos

Para llevar a cabo la compilación de la línea de comandos que necesita para ejecutar el fasm.exeejecutable, proporcionando dos parámetros ­ primero debe ser el nombre del archivo de origen, el segundo debeser el nombre del archivo de destino. Si no se da el segundo parámetro, el nombre de archivo de salidaserá adivinado automáticamente. Después de mostrar información sobre el programanombre y versión, compilador leerán los datos del archivo fuente y compilarlo. Cuando el

Página 12

12 CAPÍTULO 1. INTRODUCCIÓN

compilación tiene éxito, compilador escribir el código generado para el archivo de destinoy mostrar el resumen de proceso de compilación; de lo contrario, se mostrará la informaciónsobre el error que se ha producido.

El archivo de origen debe ser un archivo de texto y se puede crear en cualquier editor de texto. Líneadescansos son aceptadas en DOS y estándares de Unix, tabuladores son tratados como espacios.

En la línea de comandos también se puede incluir la opción ­m seguido de un número, queespecifica cuántos kilobytes de memoria ensamblador plana deben utilizar al máximo. En casode la versión DOS estas opciones limita sólo el uso de la memoria extendida. La opción ­pseguido de un número se puede utilizar para especificar el límite para el número de pasadas el ensambladorrealiza. Si el código no se puede generar dentro de determinada cantidad de pases, la asamblease dará por terminado con un mensaje de error. El valor máximo de este ajuste es 65536,mientras que el límite predeterminado, se usa cuando no hay tal opción se incluye en la línea de comandos, es 100.También es posible limitar el número de pasadas el ensamblador realiza, con el ­popción seguido por un número que especifica el número máximo de pases.

No hay opciones de línea de comandos que afectarían a la salida del compilador, planaensamblador requiere sólo el código fuente para incluir la información que realmente necesita. Paraejemplo, para especificar el formato de salida se especifica mediante el uso de la directiva en el formatoa partir de la fuente.

1.1.6 Comando mensajes del compilador de línea

Como se ha indicado anteriormente, después de la compilación exitosa, el compilador muestra la compila­Resumen mento. Incluye la información de la cantidad de pases que se hizo, cuántotiempo que tomó, y cuántos bytes se escriben en el archivo de destino. La siguientees un ejemplo del resumen compilación:

ensamblador plana versión 1.70 (16384 kilobytes de memoria)38 pases, 5,3 segundos, 77.824 bytes.

En caso de error durante el proceso de compilación, el programa mostrará un error sajesalvia. Por ejemplo, al compilador no puede encontrar el archivo de entrada, se mostrará la siguientemensaje:

ensamblador plana versión 1.70 (16384 kilobytes de memoria)error: archivo de origen no se encuentra.

Si el error está conectado con una parte específica del código fuente, la línea de fuente que causóTambién se muestra el error. También la colocación de esta línea en la fuente se da para ayudar

Page 12: Lenguage asembler FASM_esp

usted encontrar este error, por ejemplo:ensamblador plana versión 1.70 (16384 kilobytes de memoria)example.asm [3]:

turba hacha, 1error: instrucción ilegal.

Página 13

1.2. ASAMBLEA SINTAXIS 13

Esto significa que en la tercera línea del compilador archivo example.asm ha encontrado uninstrucción no reconocida. Cuando la línea que causó el error contiene una macroinstrucción,también la línea de definición macroinstruction que generó la instrucción errónea esmostrada:

ensamblador plana versión 1.70 (16384 kilobytes de memoria)example.asm [6]:

stoschar 7example.asm [3] stoschar [1]:

turba al, charerror: instrucción ilegal.

Significa que el macroinstruction en la sexta línea del archivo example.asm generauna instrucción no reconocida con la primera línea de su definición.

1.1.7 Los formatos de salida

Por defecto, cuando no hay ninguna directiva formato en el archivo de origen, ensamblador plana simplemente ponecódigos de instrucción generados en la producción, creando de esta manera archivo binario plana. Por defectogenera código de 16 bits, pero siempre se puede convertir en el modo de 16 bits o 32 bits porutilizando USE16 o USE32 Directiva. Algunos de los formatos de salida cambia al modo de 32 bits,cuando se selecciona ­ más información sobre los formatos de los que puede elegir se puede encontrar en2.4.

La extensión de archivo de destino se elige automáticamente por el compilador, en función deel formato de salida seleccionado.

Todo el código de salida siempre está en el orden en que se inscribió en el archivo de origen.

1.2 sintaxis Asamblea

La información proporcionada a continuación está destinado principalmente para los programadores de ensamblador quehan estado utilizando algunos otros compiladores de montaje antes. Si eres principiante, usted debebuscar los tutoriales de programación de ensamblaje.

Ensamblador plana por defecto usa la sintaxis de Intel para las instrucciones de montaje, al­aunque se puede personalizar usando las capacidades de preprocesador (macroinstrucciones yconstantes simbólicas). También tiene su propio conjunto de las directivas ­ las instrucciones paracompilador.

Todos los símbolos definidos dentro de las fuentes de mayúsculas y minúsculas.

Sintaxis 1.2.1 Instrucción

Las instrucciones en lenguaje ensamblador están separados por saltos de línea, y una instrucciónse espera para llenar la línea de texto. Si una línea contiene un punto y coma, a excepción de la

Page 13: Lenguage asembler FASM_esp

Página 14

14 CAPÍTULO 1. INTRODUCCIÓN

Bits operador Bytesbyte 8 1palabra 16 2dword 32 4fword 48 6pword 48 6QWORD 64 8Tbyte 80 10tword 80 10dqword 128 16xword 128 16qqword 256 32yword 256 32

Tabla 1.8: Tamaño operadores.

punto y coma dentro de las cadenas entre comillas, el resto de esta línea es el comentario y compiladorignora. Si una línea termina con carácter \ (eventualmente el punto y coma y comentario puedela siguen), la siguiente línea se adjunta en este punto.

Cada línea en la fuente es la secuencia de elementos, que pueden ser uno de los tres tipos. Unotipo son los caracteres de símbolos, que son los caracteres especiales que son elementos individualesincluso cuando no están separados de los otros. Cualquiera de los de + ­ * / = <> () [] :, | & # 'es elcarácter de símbolo. La secuencia de los otros personajes, separado de otros artículos cono bien espacios o caracteres de símbolos en blanco, es un símbolo. Si el primer carácter de símbolo esya sea simple o doble cita, que se integra con cualquier secuencia de caracteres que le siguen, inclusolas especiales, en una cadena entre comillas, que debe terminar con el mismo carácter, conque comenzó (la comilla simple o doble) ­ sin embargo, si hay dos personajes tanen una fila (sin ningún otro carácter entre ellos), que se integran en citadocadena como sólo uno de ellos y la cadena entre comillas sigue a continuación. Los símbolos de otrosde caracteres de símbolos y cadenas entre comillas se pueden utilizar como nombres, por lo que también se llama lanombrar símbolos.

Cada instrucción consta de la tecla de acceso y los diferentes número de operandos,separados por comas. El operando se puede registrar, valor inmediato o una administración de datosvestida en la memoria, también puede estar precedida por el operador para definir el tamaño o anular su tamaño(Cuadro 1.8 ). Los nombres de los registros disponibles se pueden encontrar en el cuadro 1.9, sus tamaños no pueden seranulado. Valor inmediato se puede especificar cualquier expresión numérica.

Cuando operando es un dato en la memoria, la dirección de los datos (también cualquier ex numéricacompresión, pero puede contener registros) debe ir entre corchetes o precedidapor el operador PTR. Por ejemplo mov eax instrucción, 3 pondrá el valor inmediato en 3el registro eax eax, mov instrucción, [7] pondrá el valor de 32 bits de la dirección7 en eax y el byte de la instrucción mov [7], 3 pondrá el valor inmediato en 3

Page 14: Lenguage asembler FASM_esp

Página 15

1.2. ASAMBLEA SINTAXIS 15

Tipo Bits8 al cl dl bl ah ch dh bh

General 16 hacha cx dx bx sp pb si di32 eax ecx edx ebx esp ebp esi edi

Segmento 16 es cs ss ds fs gsControl 32 cr0 CR2 cr3 cr4Depurar 32 DR0 DR1 dr2 dr3 DR6 dr7FPU 80 st0 st1 st2 st3 st4 st5 st6 st7MMX 64 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7SSE 128 xmm0 XMM1 XMM2 XMM3 XMM4 xmm5 xmm6 xmm7AVX 256 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7

Tabla 1.9: Registros.

el byte en la dirección 7, también se puede escribir como 7,3 ptr byte mov. Para especificar quéregistro de segmento se debe utilizar para el direccionamiento, nombre de registro de segmento siguió con uncolon debe ser puesto justo antes del valor de dirección (dentro de los corchetes o despuésel operador ptr).

1.2.2 Las definiciones de datos

Para definir los datos o reservar un espacio para ello, utilice una de las Directivas que figuran en la tabla 1.10.La directiva de definición de datos debe ser seguido por una o más de expresión numéricasiones, separados por comas. Estas expresiones definen los valores para las células de datos de tamañodependiendo de que se utiliza la directiva. Por ejemplo db 1,2,3 definirá los tres bytesde los valores 1, 2 y 3 respectivamente.

Las directivas db y du también aceptan los valores de cadena cotizados de cualquier longitud, quese convertirá en la cadena de bytes cuando se utiliza db y en la cadena de palabras con puesta a cerobyte alto cuando se utiliza du. Por ejemplo db 'abc' definirá los tres bytes de valores61, 62 y 63.

La directiva dp y su sinónimo df aceptan los valores que consiste en dos numéricaexpresiones separados por dos puntos, el primer valor se convertirán en la palabra alta y lasegundo valor se convertirá en la doble palabra baja del valor del puntero lejos. También acepta ddtales indicadores que consisten en dos valores de las palabras separadas por dos puntos, y dt acepta lapalabra y la palabra de cuatro valores separados con dos puntos, la palabra quad se almacena primero. LaDirectiva dt con la expresión individual como parámetro sólo acepta valores de punto flotante ycrea datos en formato FPU doble precisión extendida.

Cualquiera de la directiva anterior permite el uso del operador dup especial para hacer múltiplescopias de los valores dados. El recuento de los duplicados debe preceder a este operador y el valorduplicar debe seguir ­ incluso puede ser la cadena de valores separados por comas,pero como conjunto de valores tiene que ser cerrado con paréntesis, como db 5 dup (1,2), que

Página 16

Page 15: Lenguage asembler FASM_esp

16 CAPÍTULO 1. INTRODUCCIÓN

define cinco copias de la secuencia dada de dos bytes.El archivo es una directiva especial y su sintaxis es diferente. Esta directiva incluye una

cadena de bytes de archivo y debe ser seguido por el nombre del archivo citado, a continuación, opcionalmenteexpresión numérica especificando compensado en el archivo precedido por el colon, a continuación, ­ opcionalmente también­ Coma y expresión numérica especificando cantidad de bytes para incluir (si no hay recuento esse especifica, todos los datos hasta el final del archivo se incluye). Por ejemplo el archivo 'data.bin "voluntadincluir el archivo de conjunto como datos binarios y archivos 'data.bin': 10h, 4 incluirá sólo cuatrobytes que comienzan en 10h offset.

Tamaño Definir la Reserva(Bytes) datos datos

1 db rbexpediente

2 dw rwdu

4 dd rd6 dp rp

df rf8 dq rq10 dt rt

Tabla 1.10: directivas de Datos.

La directiva de reservas datos debe ser seguido por una sola expresión numérica,y este valor define cómo deben reservarse muchas células del tamaño especificado. Todos los datosdirectivas Definición también aceptan el? valor, lo que significa que esta célula no debe serinicializada a cualquier valor y el efecto es el mismo que mediante el uso de la reserva de datosDirectiva. Los datos no inicializados no se pueden incluir en el archivo de salida, por lo que sus valoresdebe ser siempre considerado desconocido.

1.2.3 Constantes y etiquetas

En las expresiones numéricas también se puede utilizar constantes o etiquetas en lugar de números.Para definir la constante o la etiqueta que debe utilizar las directivas específicas. Cada etiqueta puede serdefine una sola vez y es accesible desde el cualquier lugar de origen (incluso antes de que fueradefinido). Constant se puede redefinir muchas veces, pero en este caso sólo es accesibledespués de que se definió, y es siempre igual al valor de la última definición antes del lugardonde se utiliza. Cuando una constante se define una sola vez en la fuente, es ­ como la etiqueta ­accesible desde cualquier lugar.

La definición de constante consiste en el nombre de la constante seguido por el carácter =y la expresión numérica, que después del cálculo se convertirá en el valor de la constante.Este valor se calcula siempre en el momento de la constante se define. Por ejemplo, usted

Página 17

1.2. ASAMBLEA SINTAXIS 17

Page 16: Lenguage asembler FASM_esp

puede definir conteo constante mediante el uso de la cuenta de directiva = 17, y luego usarlo en elinstrucciones de montaje, como cx mov, cuentan ­ que se convertirá en cx mov, 17 durante elproceso de compilación.

Hay diferentes maneras de definir etiquetas. El más simple es seguir el nombre de la etiquetapor el colon, esta directiva aún se puede seguir por la otra instrucción en el mismolínea. Se define la etiqueta cuyo valor es igual al desplazamiento del punto donde está definido.Este método se utiliza generalmente para etiquetar los lugares en código. La otra manera es seguir elnombre de etiqueta (sin dos puntos) por algunos Directiva de datos. Define la etiqueta con el valorigual a desplazamiento de comienzo de datos definidos, y recordado como una etiqueta para los datos contamaño de la celda especificada para dicha Directiva de datos en la tabla 1.10.

La etiqueta puede ser tratada como constante de valor igual al desplazamiento de código o datos etiquetados.Por ejemplo cuando se definen los datos usando la directiva etiquetada carbón db 224, para poner eldesplazamiento de estos datos en registro BX usted debe utilizar bx mov, instrucción char, y ponerel valor de byte dirigida por el sello char a dl registro, debe utilizar dl mov, [Char](O mov dl, ptr char). Pero cuando intenta montar mov ax, [Char], causaráun error, porque fasm compara los tamaños de operandos, que deberían ser iguales. Ustedpuede forzar el montaje que la instrucción utilizando el tamaño de anulación: mov ax, palabra [Char], perorecordar que esta instrucción leerá los dos bytes comenzando en la dirección char, mientrasse define como un un byte.

La última y la forma más flexible para definir etiquetas es usar directiva etiqueta. EsteDirectiva debe ser seguido por el nombre de la etiqueta, entonces operador tamaño opcionalmente y después­ También opcionalmente al operador y la expresión numérica que define la dirección en la queesta etiqueta debe definirse. Por ejemplo etiqueta wchar palabra en CARácter definir un nuevoetiqueta para los datos de 16 bits en la dirección de carbón. Ahora la instrucción mov ax, [wchar]será después de la compilación del mismo como mov ax, palabra [Char]. Si no se especifica ninguna dirección,Directiva etiqueta define la etiqueta al corriente de offset. Así mov [wchar], 57.568 copiarádos bytes mientras mov [Char], 224 copiará un byte a la misma dirección.

La etiqueta cuyo nombre comienza con un punto es tratado como sello local, y su nombre esvinculado al nombre de la última etiqueta global (con nombre comienza con nada pero punto)para que el nombre completo de esta etiqueta. Así que usted puede utilizar el nombre corto (empezando por punto)de esta etiqueta en cualquier lugar antes de definir la siguiente etiqueta global, y en los otros lugaresusted tiene que utilizar el nombre completo. Etiqueta empezando con dos puntos son la excepción ­ queson como global, pero no se conviertan en el nuevo prefijo para las etiquetas locales.

El nombre significa@@etiqueta anónima, puede haber definido muchos de ellos en elfuente. Símbolob (or equivalente) hace referencia a la etiqueta anónima precedente más cercano,símbolof referencias del sello anónima cercana siguiente. Estos son símbolo especialentre mayúsculas y minúsculas.

1.2.4 expresiones numéricas

En los ejemplos anteriores todas las expresiones numéricas fueron los números simples, constanteso etiquetas. Pero pueden ser más complejos, mediante el uso de los operadores aritméticos o lógicos

Página 18

18 CAPÍTULO 1. INTRODUCCIÓN

para cálculos en tiempo de compilación. Todos estos operadores con sus valores de prioridad se enumeranen la tabla 1.11 . Las operaciones con valor de prioridad más alta se calcularán en primer lugar,por supuesto puede cambiar este comportamiento poniendo algunas partes de la expresión en paréntesis.

Page 17: Lenguage asembler FASM_esp

El +, ­, * y / son operaciones aritméticas estándar, mod calcula el restode la división. La AND, OR, XOR, shl, shr y no realizan las mismas operaciones lógicascomo las instrucciones de montaje de esos nombres. El rva y plt son operadores unarios especialesque realizan conversiones entre diferentes tipos de direcciones, que pueden ser utilizados sólocon algunos de los formatos de salida y su significado puede variar (véase 2.4) .

Los cálculos aritméticos y lógicos se procesan como si fueran operadosprecisión infinita números de 2 adic, y ensamblador señaliza un error de desbordamiento si porquede sus limitaciones no es mesa para realizar el cálculo requerido, o si el resultadoes número demasiado grande para caber en rango, ya sea con o sin signo de la unidad de destinotamaño. Sin embargo no es así, EXCLUSIVO y SHR son excepciones a esta regla ­ si el valorespecificado por la expresión numérica tiene que encajar en una unidad de tamaño especificado, y los argumentospara un ajuste operación en que el tamaño, la operación se realiza con precisión limitadaa ese tamaño.

Operadores de Prioridad0 +

­1 *

/2 mod3 y

oxor

4 shlshr

5 no6 rva

plt

Tabla 1.11: Aritmética y operadores lógicos por prioridad.

Los números de la expresión son por defecto tratado como un decimal, los números binariosdebe tener la letra b adjunta al final, el número octal debe terminar con o carta,números hexadecimales deben comenzar con caracteres 0x (como en lenguaje C) o con el $carácter (como en lenguaje Pascal) o que deben terminar con letra h. También citó la cadena,cuando se encuentran en la expresión, se convertirá en número ­ El primer carácterconvertido en el byte menos significativo del número.

La expresión numérica utilizada como un valor de dirección también puede contener ninguno de generalesregistros utilizados para abordar, se pueden sumar y multiplicar por los valores apropiados,

Página 19

1.2. ASAMBLEA SINTAXIS 19

ya que se permite para las instrucciones de arquitectura x86.También hay algunos símbolos especiales que se pueden utilizar dentro de la expresión numérica.

En primer lugar es de $, que es siempre igual al valor de la corriente de desplazamiento, mientras $$ es igual a la basedirección del espacio de direccionamiento actual. El otro es%, que es el número de la corrienterepetir en partes de código que se repite usando algunas directivas especiales (véase 2.2 ). HayTambién% t símbolo, que es siempre igual a la marca de tiempo actual.

Cualquier expresión numérica puede consistir también en el valor de punto flotante (Asamblea planaBLER no permite ninguna operación de punto flotante en tiempo de compilación) en el ámbito científico

Page 18: Lenguage asembler FASM_esp

notación, que puede terminar con la letra f para ser reconocido, de lo contrario, deben conteneral menos uno de los. o caracteres E. Así 1,0, 1E0 y 1f definir el mismo punto flotantevalor, aunque simples 1 define un valor entero.

1.2.5 Los saltos y llamadas

El operando de cualquier instrucción de salto o llamada puede ser precedida no sólo por el tamañooperador, sino también por uno de los operadores de tipo especificación de el salto: corto, cerca delejos. Por ejemplo, cuando ensamblador está en el modo de 16 bits, DWORD JMP instrucción [0] seconvertido en el salto largo y cuando ensamblador está en modo de 32 bits, se convertirá en el próximosaltar. Para forzar esta instrucción para ser tratado de manera diferente, utilice el jmp cerca dword [0]o jmp lejos dword [0] forma.

Cuando operando de cerca de salto es el valor inmediato, ensamblador generará lamás corto variante de esta instrucción de salto si es posible (pero no creará instrucción de 32 bitsen el modo de 16 bits ni instrucción de 16 bits en el modo de 32 bits, a menos que haya un operador de tamañodeclarando él). Al especificar el tipo de salto puedes obligarlo a generar siempre variante larga(Por ejemplo jmp cerca de 0) o para generar siempre variante corta y terminar con unaerror cuando es imposible (por ejemplo JMP corta 0).

1.2.6 valores de tamaño

Cuando instrucción usa algún direccionamiento de memoria, por defecto la forma más pequeña de instrucciónción se genera mediante el desplazamiento corto si sólo valor de dirección se ajusta en el rango.Esto se puede anular con la palabra o del operador dword antes de la dirección dentro de lacorchetes (o después de que el operador PTR), que fuerza el largo desplazamiento de APtamaño ade­ que se hizo. En caso de que la dirección no es relativo a cualquier registro, losoperadores permiten también para elegir el modo adecuado de direccionamiento absoluto.

Instrucciones adc, agregar y, cmp, o, SBB, sub y xor con primer operando siendo de 16 bitso de 32 bits son por omisión generado en forma abreviada de 8 bits cuando el segundo operando esvalor inmediato ajuste en el rango de valores con signo de 8 bits. También se puede anularponiendo la palabra o del operador dword antes del valor inmediato. Las reglas similaresse aplica a la instrucción imul con el último operando ser un valor inmediato.

Valor inmediato como un operando para la instrucción empuje sin un operador de tamaño es pordefault tratado como un valor de palabra si ensamblador está en el modo de 16 bits y como un valor de palabra doble

Página 20

20 CAPÍTULO 1. INTRODUCCIÓN

si ensamblador está en modo de 32 bits, más corto formulario 8­bit de esta instrucción se utiliza si es posible,palabra u operador tamaño dword obliga a la instrucción de empuje que se genere en forma más largapara el tamaño especificado. pushw y mnemónicos pushd obligan ensamblador para generar 16 bits oCódigo de 32 bits sin forzarlo a utilizar la forma más larga de la instrucción.

Page 19: Lenguage asembler FASM_esp

Página 21

Capítulo 2

Juego de operaciones

Este capítulo proporciona la información detallada sobre las instrucciones y directricesapoyada por el ensamblador plana. Directivas para las etiquetas que definen ya se discutieron en1.2.3 , todas las demás directivas se describirá más adelante en este capítulo.

2.1 Las instrucciones de arquitectura x86

Page 20: Lenguage asembler FASM_esp

En esta sección se puede encontrar tanto la información acerca de la sintaxis y el propósito de lainstrucciones en lenguaje ensamblador. Si necesita más información técnica, busque elIntel Software Architecture Manual del desarrollador.

Instrucciones de montaje consisten en la tecla de acceso (nombre de la instrucción) y de ceroa tres operandos. Si hay dos o más operandos, por lo general primero es el destinooperando y segundo es el operando fuente. Cada operando puede ser registro, memoria ovalor inmediato (véase 1.2 para más detalles sobre la sintaxis de los operandos). Después de la descripciónde cada instrucción hay ejemplos de diferentes combinaciones de operandos, si elinstrucción tiene ninguna.

Algunas instrucciones actúan como prefijos y pueden ser seguidos por otra instrucción de la mismalínea, y no puede haber más de un prefijo en una línea. Cada nombre del registro de segmentoes también una regla mnemotécnica de instrucción prefijo influencia cuando se recomienda el uso de segmentoanula dentro de los corchetes en lugar de estos prefijos.

2.1.1 instrucciones de movimiento de datos

mov transfiere un byte, palabra o palabra doble del operando fuente al destinooperando. Puede transferir datos entre los registros generales, desde el registro general dememoria o de la memoria al registrador general, pero no puede moverse desde la memoria ala memoria. También puede transferir un valor inmediato a registro general o la memoria, segmentoregistrarse para registro general o la memoria, registro general o en la memoria de registro de segmento,control o registro de depuración al registro general y registro general de controlar o de depuraciónregistrarse. El mov se puede montar sólo si el tamaño del operando y el tamaño de la fuente

21

Página 22

22 CAPÍTULO 2. del conjunto de instrucciones

operando de destino son los mismos. A continuación se presentan los ejemplos para cada uno de los permitidoscombinaciones:

bx mov, hacha ; registro general de registro generalmov [Char], al ; registro general de la memoriabl mov, [Char] ; memoria para el registro generaldl mov, 32 ; valor inmediato a registro generalmov [Char], 32 ; valor inmediato a la memoriamov ax, ds ; registro de segmento al registro generalmov [bx], ds ; registro de segmento de memoriamov ds, hacha ; registro general de registro de segmentods mov, [bx] ; memoria para registro de segmentomov eax, cr0 ; control de registro a registro generalcr3 mov, ebx ; registro general para el control de registro

xchg intercambia el contenido de dos operandos. Se puede intercambiar dos operandos de byte, dosoperandos de palabra o dos palabras operandos dobles. Orden de operandos no es importante. Laoperandos pueden ser dos registros generales, o registrarse en general con la memoria. Por ejemplo:

hacha xchg, bx ; intercambiar dos registros generalesxchg al, [Char]; registro de intercambio con la memoria

empuje disminuye el puntero del marco de pila (esp registro), a continuación, transfiere el operando ala parte superior de la pila indicada por esp. El operando puede ser memoria, registro general, el segmento

Page 21: Lenguage asembler FASM_esp

Registrarse o valor inmediato de la palabra o doble tamaño de la palabra. Si el operando es una inmediatavalor y no se especifica ningún tamaño, es por defecto tratado como un valor de palabra si ensamblador esen el modo de 16 bits y como un valor de palabra doble si ensamblador está en modo de 32 bits. pushw ymnemotécnicos pushd son variantes de esta instrucción que almacenan los valores de la palabra o dobletamaño de la palabra, respectivamente. Si más operandos siguen en la misma línea (separados sólo conespacios, no comas), compilador se reunirán en cadena de las instrucciones de empuje con estosoperandos. Los ejemplos son con operandos individuales:

empuje hacha ; almacenar registro generalempujar es ; registro de segmento tiendapushw [bx] ; memoria de almacenamientoempuje 1000h ; tienda de valor inmediato

Pusha guarda el contenido del registro general de ocho en la pila. Esta instrucciónno tiene operandos. Hay dos versiones de esta instrucción, uno de 16 bits y uno de 32 bits,ensamblador genera automáticamente la versión correcta para el modo actual, pero puede seranulado por el uso Pushaw o mnemotécnico PUSHAD para obtener siempre la de 16 bits o 32 bitsversión. La versión de 16 bits de esta instrucción empuja registros generales en la pila enel siguiente orden: hacha, cx, dx, bx, el valor inicial de sp anterior a apretar hacha, pb, siy di. La versión de 32 bits empuja registros generales de 32 bits equivalentes en el mismo orden.

Página 23

2.1. LAS INSTRUCCIONES arquitectura x86 23

pop transfiere la palabra o palabra doble en la parte superior de la pila actual hasta el destinooperando y, a continuación, se incrementa especialmente para que apunte al nuevo superior de la pila. El operando puede sermemoria, registro general o registro de segmento. popw y popd mnemotécnicos son variantes deesta instrucción para la restauración de los valores de la palabra o doble palabra tamaño respectivamente. Si másoperandos separados por espacios siguen en la misma línea, compilador montar la cadena delas instrucciones de pop con estos operandos.

bx pop ; restaurar registro generalds pop ; restaurar registro de segmentopopw [si] ; restaurar la memoria

popa restaura los registros guardados en la pila mediante la instrucción Pusha, a excepción de lavalor guardado del sp (o ESP), que se ignora. Esta instrucción no tiene operandos. Para forzarmontaje de la versión de 16 bits o 32 bits de este uso de instrucciones popaw o mnemotécnico POPAD.

2.1.2 Instrucciones de conversión de tipo

Las instrucciones de conversión de tipo convertir bytes en palabras, palabras en palabras dobles, ypalabras dobles en palabras cuádruples. Estas conversiones se pueden hacer usando la extensión de signoo la extensión cero. La extensión de signo llena los bits extra del elemento más grande con lavalor del bit de signo del elemento más pequeño, la extensión cero simplemente los llena con ceros.

cwd y CDQ duplican el tamaño de hacha valor o registro eax, respectivamente, y almacenan elbits adicionales en el dx o edx registro. La conversión se realiza mediante la extensión de signo.Estas instrucciones no tienen operandos.

cbw extiende el signo del byte en al largo de hacha, y cwde extiende el signo dela palabra de hacha en todo eax. Estas instrucciones también tienen ningún operando.

MOVSX convierte un byte de palabra o palabra doble y una palabra a palabra doble usola extensión de signo. MOVZX hace lo mismo, pero utiliza la extensión cero. La fuente

Page 22: Lenguage asembler FASM_esp

operando puede ser registro general o la memoria, mientras que el operando de destino debe ser unaregistro general. Por ejemplo:

hacha MOVSX, al ; registro byte para registro de palabraMOVSX edx, dl ; registro byte a doble palabra de registroeax MOVSX, hacha ; palabra de registro de palabra doble registroMOVSX hacha, byte [bx]; memoria byte para registro de palabraMOVSX edx, byte [bx]; memoria de bytes en una palabra doble registroMOVSX eax, palabra [bx]; memoria de la palabra a palabra doble registro

2.1.3 instrucciones aritméticas binarias

añadir sustituye el operando de destino con la suma de los operandos de fuente y de destinoy conjuntos CF si se ha producido desbordamiento. Los operandos pueden ser bytes, palabras o palabras dobles.El operando destino puede ser registro general o la memoria, el operando fuente puede ser

Página 24

24 CAPÍTULO 2. del conjunto de instrucciones

Registro General o un valor inmediato, sino que también puede ser memoria si el operando de destino esregistrarse.

añadir hacha, bx ; add registrarse para registrarseañadir hacha, [si] ; agregar memoria para registrarañadir [di], al ; añadir registro a la memoriaañadir al, 48 ; agregar valor inmediato para registrarseañadir [Char], 48 ; agregar valor inmediato a la memoria

adc resume los operandos, agrega uno si CF está establecido, y sustituye el operando destinocon el resultado. Reglas para los operandos son los mismos que para la instrucción add. Un complementoseguido de múltiples instrucciones ADC puede ser utilizado para añadir números de más de 32 bits.

inc añade uno al operando, no afecta CF. El operando puede ser un generalregistro o memoria, y el tamaño del operando puede ser byte, palabra o palabra doble.

inc hacha ; registro de la subasta por unoinc byte [bx] ; memoria de la subasta por uno

sub resta el operando fuente del operando destino y sustituye a laoperando de destino con el resultado. Si se necesita un préstamo, el CF se establece. Reglas paralos operandos son los mismos que para la instrucción ADD.

SBB resta el operando fuente del operando destino, resta uno si CFes establecer y almacena el resultado en el operando destino. Reglas para los operandos sonmismo que para la instrucción ADD. Un sub seguido por múltiples instrucciones SBB puede serutilizado para restar números de más de 32 bits.

diciembre resta uno del operando, no afecta CF. Reglas para el operando sonel mismo que para la instrucción inc.

cmp resta el operando fuente del operando destino. Actualiza las banderascomo la instrucción sub, pero no altera los operandos de origen y destino. Reglaspara los operandos son los mismos que para la instrucción sub.

neg resta un operando entero con signo de cero. El efecto de esto es instructoninvertir el signo del operando de positivo a negativo o de negativo a positivo.Reglas para el operando son los mismos que para la instrucción inc.

intercambios xadd el operando destino con el operando de origen, a continuación, carga la suma

Page 23: Lenguage asembler FASM_esp

de los dos valores en el operando de destino. Reglas para los operandos son los mismos quepara la instrucción add.Todo el binario actualización instrucciones aritméticas anterior SF, ZF, PF y OF banderas. SF

siempre se establece en el mismo valor que el bit de signo del resultado, ZF se establece cuando todos los bits deresultado son cero, PF se establece cuando bajo pedido ocho bits de resultado contienen un número par deactivación de bits, DE se establece si el resultado es demasiado grande para un número positivo o demasiado pequeño para un negativonúmero (excluido el bit de signo) para encajar en el operando destino.

mul realiza una multiplicación sin signo del operando y el acumulador. Si eloperando es un byte, el procesador lo multiplica por el contenido de Al y devuelve el 16­bitcomo resultado de ah y al. Si el operando es una palabra, el procesador lo multiplica por el contenido

Página 25

2.1. LAS INSTRUCCIONES arquitectura x86 25

de hacha y devuelve el resultado de 32 bits a dx y el hacha. Si el operando es una palabra doble, elprocesador multiplica por el contenido de eax y devuelve el resultado de 64 bits en EDX yeax. mul establece CF y cuando la mitad superior del resultado es distinto de cero, de lo contrario,se borran. Reglas para el operando son los mismos que para la instrucción inc.

imul realiza una operación de multiplicación firmado. Esta instrucción tiene tres variableciones. En primer lugar tiene un operando y se comporta de la misma manera que la instrucción mul.Segundo tiene dos operandos, en este caso el operando de destino se multiplica por la fuenteoperando y el resultado sustituye el operando de destino. Operando de destino debeser un registro general, puede ser palabra o palabra doble, operando de origen puede ser generalregistro, la memoria o valor inmediato. Tercera forma tiene tres operandos, el destinooperando debe ser un registro, palabra general o palabra doble en tamaño, operando de origen puede serregistro general o la memoria, y el tercer operando debe ser un valor inmediato. La fuenteoperando se multiplica por el valor inmediato y el resultado se almacena en el destinoregistrarse. Todas las tres formas calcular el producto de dos veces el tamaño de los operandos y conjuntoCF y cuando la mitad superior del resultado es distinto de cero, pero segunda y tercera formatruncar el producto con el tamaño de operandos. Así formas segundo y tercero pueden ser tambiénutilizado para operandos sin signo, ya que, si se firman los operandos o sin firma, ella mitad inferior del producto es el mismo. A continuación se presentan los ejemplos de las tres formas:

imul bl ; por el registro acumuladorpalabra imul [si]; acumulador por la memoriabx imul, cx ; registrarse por registrobx imul, [si] ; registrarse por la memoriabx imul, 10 ; registrarse por valor inmediatoimul ax, bx, 10 ; registrarse por valor inmediato para registrarsehacha imul, [si], 10; memoria por valor inmediato para registrarse

div realiza una división sin signo del acumulador por el operando. El dividendo(El acumulador) es dos veces el tamaño del divisor (el operando), el cociente y re­mainder tienen el mismo tamaño que el divisor. Si divisor es el byte, el dividendo se toma deregistro AX, el cociente se almacena en Al y el resto se almacena en ah. Si es divisorpalabra, la mitad superior del dividendo se toma de dx, se toma la mitad inferior del dividendode hacha, el cociente se almacena en hacha y el resto se almacena en dx. Si es divisorpalabra doble, la mitad superior del dividendo se toma de edx, la mitad inferior del dividendo estomado de eax, el cociente se almacena en eax y el resto se almacena en edx. Reglaspara el operando son los mismos que para la instrucción mul.

idiv realiza una división firmada del acumulador por el operando. Se utiliza el mismoregistros como la instrucción div, y las reglas para el operando son los mismos.

Page 24: Lenguage asembler FASM_esp

2.1.4 instrucciones aritméticas decimales

Aritmética decimal se realiza mediante la combinación de las instrucciones aritméticas binarias (al­listo descrito en la sección anterior) con las instrucciones aritméticas decimales. La

Página 26

26 CAPÍTULO 2. del conjunto de instrucciones

instrucciones aritméticas decimales se utilizan para ajustar los resultados de un arith­ binario anterioroperación metic para producir un resultado decimal empaquetado o desempaquetado válido, o para ajustar elentradas a una operación aritmética binaria posterior por lo que la operación producirá un válidoempaquetado o resultado decimal desempaquetado.

daa ajusta el resultado de sumar dos operandos decimales empaquetados válidos en al. daa debesiga siempre la adición de dos pares de números decimales empaquetados (un dígito en cadamedio­byte) para obtener un par de dígitos decimales empaquetados válidos como resultados. La bandera de acarreo esestablecer si era necesario llevar. Esta instrucción no tiene operandos.

das ajusta el resultado de restar dos operandos decimales empaquetados válidos en al. dassiempre debe seguir la sustracción de un par de números decimales empaquetados (un dígito encada medio­byte) de otro para obtener un par de dígitos decimales empaquetados válidos como resultados.La bandera de acarreo se establece si se necesitaba un préstamo. Esta instrucción no tiene operandos.

aaa cambia el contenido del registro al que un número decimal sin envasar válida, ypone a cero los primeros cuatro bits. aaa debe seguir siempre la adición de dos decimales desempacadooperandos en al. La bandera de acarreo se establece y ah se incrementa si un acarreo es necesario. Estela instrucción no tiene operandos.

aas cambia el contenido del registro al que un número decimal sin envasar válida, ypone a cero los primeros cuatro bits. aas siempre deben seguir la sustracción de un decimal desempacadooperando de otro en al. La bandera de acarreo se establece y ah disminuye si un préstamo esnecesario. Esta instrucción no tiene operandos.

AAM corrige el resultado de una multiplicación de dos números decimales descomprimidos válidos.aam debe seguir siempre la multiplicación de dos números decimales para producir una válidaresultado decimal. El alto dígito de orden se deja en ah, el orden bajo dígitos en al. La generaciónlizados versión de esta instrucción permite el ajuste de los contenidos del hacha para creardos dígitos sin envasar de cualquier base. La versión estándar de esta instrucción tieneningún operando, la versión generalizada tiene un operando ­ un valor inmediato especificandola base numérica para los dígitos creados.

aad modifica el numerador de ah ah y para prepararse para la división de dos válidaoperandos decimales descomprimidos para que el cociente producido por la división será unnúmero decimal desempaquetado válida. ah debe contener el dígito de orden superior y al la bajadígito de orden. Esta instrucción se ajusta el valor y coloca el resultado en otros, mientras que ahcontendrá cero. La versión generalizada de esta instrucción permite el ajuste de dosdígitos sin envasar de cualquier base. Reglas para el operando son los mismos que para el AAMinstrucción.

2.1.5 Instrucciones lógicas

no invierte los bits en el operando especificado para formar el complemento a uno del operando.No tiene ningún efecto en las banderas. Reglas para el operando son los mismos que para la instrucción inc.

AND, OR y XOR instrucciones realizan las operaciones lógicas estándar. Se ponen al díalas banderas de SF, ZF y PF. Reglas para los operandos son los mismos que para la instrucción add.

bt, BTS, BTR y las instrucciones BTC operan en un solo bit que puede estar en memoria o

Page 25: Lenguage asembler FASM_esp

Página 27

2.1. LAS INSTRUCCIONES arquitectura x86 27

en un registro general. Se especifica la ubicación del bit como un desplazamiento desde el orden de bajafinal del operando. El valor de la desviación es la toma del segundo operando, seo bien puede ser un byte inmediata o un registro general. Estas instrucciones primero asignan elvalor del bit seleccionado para CF. instrucción bt no hace nada más, bts establece el seleccionadasbit a 1, btr restablece el bit seleccionado a 0, cambios btc el granito de arena para su complemento. Laprimer operando puede ser palabra o palabra doble.

bt hacha, 15 ; bit de prueba en el registrobts palabra [bx], 15; prueba y conjunto de bits en la memoriabtr hacha, cx ; prueba y el bit de reset en el registropalabra btc [bx], cx; prueba y poco complemento en la memoria

instrucciones bsf y bsr escanear una palabra o una palabra doble en el primer set y poco almacenan laÍndice de este bit en el operando de destino, que debe ser registro general. El bitcadena que se está escaneada es especificado por el operando de origen, que puede ser o bien registro general ola memoria. La bandera ZF se establece si la totalidad de la cadena es cero (no hay activación de bits se encuentran); de otra maneraque se haga efectivo. Si no se encuentra ningún bit conjunto, el valor del registro de destino no está definido.bsf de bajo para alto orden (a partir del índice de bit cero). exploraciones bsr de altafin de orden inferior (a partir de índice de bit 15 de una palabra o índice 31 de una palabra doble).

hacha bsf, bx ; scan registrarse adelantebsr hacha, [si] ; inversa memoria exploración

shl desplaza el operando de destino dada por el número de bits especificado en el segundooperando. El operando destino puede ser byte, palabra o palabra doble registro generalo la memoria. El segundo operando puede ser un valor inmediato o el registro cl. Laprocesador cambia ceros en desde el lado de la operando de la derecha (orden bajo) como bits de salida deel lado izquierdo. El último bit que sale se almacena en la FQ sal es sinónimo de SHL.

shl al 1, ; Registro de desplazamiento a la izquierda en un bitshl byte [bx], 1; memoria desviación a la izquierda por un bitshl hacha, cl ; Registro de desplazamiento a la izquierda por el conde de clshl palabra [bx], cl; cambiar la memoria dejada por conteo de cl

shr y sar cambian el operando destino correcto por el número de bits especificado enel segundo operando. Reglas para operandos son los mismos que para la instrucción SHL. shrdesplaza ceros desde el lado izquierdo del operando como bits de salida del lado derecho. El últimobits que salió se almacena en CF. sar conserva el signo del operando desplazando en cerosen el lado izquierdo si el valor es positivo o desplazando en queridos si el valor es negativo.

shld desplaza los bits del operando destino a la izquierda por el número de bits especificadoen tercer operando, al tiempo que cambia los bits de alto orden del operando de origen en el destinooperando nación a la derecha. El operando fuente no se modifica. El destinooperando puede ser una palabra o palabra doble registro general o la memoria, el operando fuentedebe ser un registro general, tercer operando puede ser un valor inmediato o el registro cl.

Page 26: Lenguage asembler FASM_esp

Página 28

28 CAPÍTULO 2. del conjunto de instrucciones

shld ax, bx, 1 ; Registro de desplazamiento a la izquierda en un bitshld [di], bx, 1 ; memoria desviación a la izquierda por un bitshld ax, bx, cl ; Registro de desplazamiento a la izquierda por el conde de clshld [di], bx, cl; cambiar la memoria dejada por conteo de cl

shrd desplaza los bits del operando de destino a la derecha, mientras se cambia bits de menor ordendesde el operando de origen en el operando de destino en la izquierda. El operando fuentepermanece sin modificar. Reglas para operandos son los mismos que para la instrucción shld.

rol y RCL giran el byte, palabra o doble operando destino palabra dada por elnúmero de bits especificado en el segundo operando. Para cada rotación especifica, el altabit de orden que sale de la izquierda de los retornos de operando en el derecho a convertirse en el nuevobit de orden inferior. RCL pone, además, en la FQ cada bit de orden superior que sale de la izquierdalado del operando antes de que vuelva al operando como el bit de orden en la siguienteciclo de rotación. Reglas para operandos son los mismos que para la instrucción SHL.

ror y RCR giran el byte, palabra o doble operando destino palabra correcta por elnúmero de bits especificado en el segundo operando. Para cada rotación especifica, la bajabit de orden que sale de la derecha de la rentabilidad de operando de la izquierda para convertirse en el nuevobit de orden. RCR pone, además, en la FQ cada bit de orden inferior que sale de la derechalado del operando antes de que vuelva al operando como el bit de orden en la siguienteciclo de rotación. Reglas para operandos son los mismos que para la instrucción SHL.

prueba realiza la misma acción que el e instrucción, pero no altera eloperando de destino, sólo actualiza banderas. Reglas para los operandos son los mismos que para lay la instrucción.

bswap invierte el orden de bytes de un registro general de 32 bits: los bits 0 a 7 sonintercambiado con los bits 24 a 31, y los bits 8 a 15 se intercambian con los bits 16 a través deSe proporciona 23. Esta instrucción para convertir valores little­endian en formato big­endiany viceversa.

bswap edx ; intercambio de bytes en el registro

2.1.6 instrucciones de transferencia de control

jmp transfiere incondicionalmente control a la ubicación de destino. La dirección de destino puedeespecificarse directamente dentro de la instrucción o indirectamente a través de un registro o memoria,el tamaño aceptable de esta dirección depende de si el salto es cerca o lejos (que puedeser especificado por el operando de la anterior con el operador de cerca o de lejos) y si laes la instrucción de 16 bits o 32 bits. Operando por cerca de salto debe ser tamaño de palabra de 16instrucción de bits o el tamaño dword para la instrucción de 32 bits. Operando por mucho salto debeser de tamaño DWORD para la instrucción de 16 bits o el tamaño pword para la instrucción de 32 bits. Un directoinstrucción JMP incluye la dirección de destino como parte de la instrucción (y puede serprecedido por el operador corta, cerca o lejos), la dirección del operando especificando debe serla expresión numérica de cerca o salto corto, o dos expresiones numéricas separadocon dos puntos de medida de salto, el primero especifica selector de segmento, el segundo es el desplazamiento

Página 29

Page 27: Lenguage asembler FASM_esp

2.1. LAS INSTRUCCIONES arquitectura x86 29

dentro del segmento. El operador pword puede ser utilizado para forzar la llamada medida de 32 bits, y dwordpara obligar a la llamada medida de 16­bit. Una instrucción jmp indirecta obtiene la dirección de destinoindirectamente a través de un registro o una variable puntero, el operando debe ser registro generalo la memoria. Ver también 1 .2.5 para algunos detalles más.

jmp 100h ; salto cerca directajmp 0FFFFh: 0 ; salto lejos directojmp hacha ; salto cerca indirectajmp pword [ebx]; indirecta salto lejos

llamar transfiere el control al procedimiento, el ahorro en la pila la dirección de la in­construcción después de la llamada para su uso posterior por una instrucción (regreso) ret. Reglas para laoperandos son los mismos que para la instrucción JMP, pero la llamada no tiene ninguna variante corta deinstrucción directa y por lo tanto no optimizado.

ret, instrucciones Retn y RETF terminar la ejecución de un procedimiento y transferenciascontrolar de nuevo al programa que invocó originalmente el procedimiento utilizando la dirección quefue almacenado en la pila por la instrucción de llamada. ret es el equivalente para RETN, quedevuelve desde el procedimiento que se ejecuta usando la llamada de inmediato, mientras que los retornos RETFdel procedimiento que se ejecutó mediante la llamada ahora. Estas instrucciones defectoel tamaño de la dirección apropiada para el ajuste del código actual, pero el tamaño de la dirección pueden serforzado a 16 bits utilizando los mnemónicos retw, retnw y retfw, y para 32 bits por medio dela retd, retnd y mnemotécnicos retfd. Todas estas instrucciones pueden especificar opcionalmente unaoperando inmediato, mediante la adición de esta constante para el puntero de pila, que efectivamente eliminancualquier argumento que el programa llamando empujaron en la pila antes de la ejecución de lainstrucción de llamada.

iret devuelve el control a un procedimiento interrumpido. Se diferencia de ret en que tambiénpops las banderas de la pila en el registro de banderas. Las banderas se almacenan en la pilapor el mecanismo de interrupción. Por defecto es el tamaño de dirección de devolución adecuada para laajuste del código actual, pero puede ser obligado a utilizar 16 bits o 32 bits de direcciones utilizando eliretw o mnemotécnico iretd.

Las instrucciones de transferencias condicionadas son saltos que pueden o no pueden transferir el control,dependiendo del estado de las banderas de la CPU cuando la instrucción se ejecuta. Los mnemónicospara los saltos condicionales pueden obtenerse uniendo la condición mnemónico (ver tabla2.1 ) a la j mnemónico, por ejemplo la instrucción jc transferirá el control cuando elBandera CF se establece. Los saltos condicionales pueden ser a corto o cerca, y dirigir solamente, y puedeoptimizarse (ver 1.2.5 ), el operando debe ser una meta valor inmediato especificandodirección.

Las instrucciones de bucle son saltos condicionales que utilizan un valor que se da en cx (o ecx) aespecificar el número de repeticiones de un bucle de software. Todas las instrucciones de bucle automáticamentecx decremento (o ecx) y terminar el bucle (no transfiera el control) cuando cx (oecx) es cero. Utiliza cx o ecx si el ajuste del código actual es de 16 bits o 32 bits,pero puede ser obligado a utilizar cx con el mnemónico loopw o para utilizar ecx con el loopdmnemotécnico. Loope y loopz son los sinónimos de la misma instrucción, que actúa como

Página 30

30 CAPÍTULO 2. del conjunto de instrucciones

Page 28: Lenguage asembler FASM_esp

Mnemotécnico Condición de prueba Descripción

o DE = 1 desbordamientono DE = 0 No desbordamientoc llevarb CF = 1 abajonae no por encima ni es igualnc No transporteae CF = 0 superior o igualnb no por debajoe ZF = 1 igualz ceroNebraska ZF = 0 no es igualNueva Zelanda no es ceroser CF o ZF = 1 inferior o igualn / a no por encimaun CF o ZF = 0 arribanbe no por debajo, ni iguals SF = 1 signons SF = 0 No firmep PF = 1 paridadpe paridad parnp PF = 0 no paridadcorreos paridad imparl SF xor DE = 1 menosENS no mayor ni igualge SF xor DE = 0 mayor o igualnl no menosle (SF xor DE) o ZF = 1 menor o igualng no mayorg (SF xor DE) o ZF = 0 mayorNLE no menor ni igual

Tabla 2.1: Condiciones.

Página 31

2.1. LAS INSTRUCCIONES arquitectura x86 31

el bucle estándar, pero también termina el bucle cuando el indicador está ajustado ZF. loopew y loopzwmnemotécnicos les obligan a utilizar registro cx mientras bucle y loopzd obligan a utilizarecx registrarse. LOOPNE y LOOPNZ son los sinónimos de las mismas instrucciones, queactúa como el bucle estándar, pero también terminar el bucle cuando el indicador ZF no está establecida. loopnew

Page 29: Lenguage asembler FASM_esp

y mnemotécnicos loopnzw les obligan a utilizar registro cx mientras loopned y fuerza loopnzdque utilicen registro ECX. Cada instrucción bucle necesita un operando ser un inmediatovalor especificando la dirección de destino, puede ser sólo salto corto (en el rango de 128 bytes de nuevoy 127 bytes a plazo efectuadas desde la dirección de la instrucción después de la instrucción de bucle).

ramas jcxz a la etiqueta especificada en la instrucción si encuentra un valor de cero en cx,Jecxz hace lo mismo, pero comprueba el valor de ecx lugar de cx. Reglas para los operandosson los mismos que para la instrucción de bucle.

int activa la rutina de servicio de interrupción que corresponde al número especificadocomo operando para la instrucción, el número debe estar en el rango de 0 a 255. Elrutina de servicio de interrupción termina con una instrucción IRET que devuelve el control alla instrucción que sigue int. códigos mnemotécnicos int3 corto (un byte) que atrapaninvoca la interrupción en la instrucción 3. invoca la interrupción 4 si el de la bandera se fija.

encuadernado verifica que el valor firmado contenida en el registro especificado se encuentra dentrolímites especificados. Una interrupción 5 se produce si el valor contenido en el registro es inferiorque el límite inferior o mayor que el límite superior. Se necesita dos operandos, losprimer operando especifica el registro que se prueba, el segundo operando debe ser memoriafrente a los dos valores límite firmados. Los operandos pueden ser textos o dword de tamaño.

hacha encuadernado, [bx]; comprobar palabra por límiteseax encuadernado, [esi]; comprobar palabra doble de los límites

2.1.7 instrucciones de E / S

en las transferencias de un byte, palabra o palabra doble de un puerto de entrada a otros, hacha, o eax. Puertos de E / Spueden ser tratados ya sea directamente, con el valor de byte inmediata codificado en la instrucción, oindirectamente a través del registro dx. El operando destino debe ser al, hacha, o registro EAX.El operando fuente debe ser un valor inmediato en el rango de 0 a 255, o registro dx.

en otros, 20h ; byte de entrada a partir de las 20h puertoen hacha, dx ; palabra de entrada del puerto dirigida por dx

fuera transfiere un byte, palabra o palabra doble a un puerto de salida de otros, hacha, o eax.El programa puede especificar el número de puerto utilizando los mismos métodos que en lainstrucción. El operando destino debe ser un valor inmediato en el rango de 0 a255, o registro dx. El operando fuente debe ser al, hacha, o registro EAX.

20h a cabo, hacha ; palabra de salida a las 20h puertodx a cabo, al ; byte de salida al puerto dirigida por dx

Página 32

32 CAPÍTULO 2. del conjunto de instrucciones

2.1.8 operaciones de Cuerdas

Las operaciones de cadenas operan en un elemento de una cadena. Un elemento de cadena puede ser unabyte, una palabra o una palabra doble. Los elementos de cadena son abordados por si y di (o esiy edi) registra. Después de cada operación de cadena si y / o di (o esi y / o edi) sonactualizada automáticamente para que apunte al siguiente elemento de la cadena. Si DF (dirección de la bandera)es cero, los registros de índice se incrementan, si DF es uno, se decrementa. Lala cantidad de incremento o decremento es 1, 2, o 4 dependiendo del tamaño de la cadenaelemento. Cada instrucción de operación de cadena tiene formas cortas que no tienen operandos y

Page 30: Lenguage asembler FASM_esp

uso de Si y / o di cuando el tipo de código es de 16 bits, y ESI y / o edi cuando el tipo de códigoes de 32 bits. si y esi por datos de la dirección por defecto en el segmento seleccionados por ds, di y edisiempre tratar los datos en el segmento seleccionado por ES. Forma corta se obtiene uniendoa la regla mnemotécnica de carta funcionamiento cadena que especifica el tamaño del elemento de cadena, lo que deberíaser b para el elemento de bytes, w para el elemento de la palabra, y d de doble elemento denominativo. Forma completa deloperación de cadena necesita operandos proporcionando al operador tamaño y las direcciones de memoria,que puede ser SI o ESI con cualquier prefijo de segmento, di o edi siempre con segmento esprefijo.

MOV transfiere el elemento de cadena apuntada por si (o esi) a la ubicación señalópor di (o EDI). Tamaño de operandos puede ser byte, palabra o DWORD. El operando destinodebe ser de memoria direccionada por di o edi, el operando fuente debe ser la memoriadirigida por si o ESI con cualquier prefijo de segmento.

byte movs [di], [si] ; byte de transferenciapalabra MOV [es: di], [ss: si]; palabra de transferenciamovsd ; transferir palabra doble

CMPS resta el elemento de cadena de destino del elemento cadena de origen yactualiza los indicadores de AF, SF, PF, CF y DE, pero eso no cambia cualquiera de la comparaciónelementos. Si los elementos de cadena son iguales, ZF está establecido, de lo contrario, se restablece. La primeraoperando de esta instrucción debe ser el elemento cadena de origen dirigida por si o esicon cualquier prefijo de segmento, el segundo operando debe ser el elemento de cadena de destinodirigida por di o edi.

CMPSB ; comparar bytespalabra CMPS [DS: SI], [es: di]; comparar palabrasCMPS dword [fs: esi], [edi]; comparar palabras dobles

scas resta el elemento de cadena destino de otros, hacha, o eax (dependiendo de latamaño de elemento de cadena) y actualizaciones de las banderas de la FA, SF, ZF, PF, CF y DE. Si los valoresson iguales, ZF está establecido, de lo contrario, se restablece. El operando debe ser el destinoelemento de cadena dirigida por di o edi.

byte scas [es: di] ; byte exploraciónscasw ; palabra de exploracióndword scas [es: edi] ; exploración doble palabra

Página 33

2.1. LAS INSTRUCCIONES arquitectura x86 33

lods coloca el elemento de cadena de origen en otros, hacha, o eax. El operando debe serel elemento de cadena de origen dirigida por si o esi con cualquier prefijo de segmento.

byte lods [DS: SI] ; byte de cargalods palabra [cs: si] ; palabra de cargaLODSD ; cargar la palabra doble

stos coloca el valor de otros, hacha, o eax en el elemento de cadena de destino. Reglas parael operando son los mismos que para la instrucción SCA.

ins transfiere un byte, palabra o palabra doble de un puerto de entrada dirigida por dxregistrarse para el elemento de cadena de destino. El operando destino debe ser la memoriadirigida por di o edi, el operando fuente debe ser el registro dx.

InSb ; byte de entrada

Page 31: Lenguage asembler FASM_esp

ins palabra [es: di], dx ; palabra de entradains dword [edi], dx ; palabra doble de entrada

outs transfiere el elemento de cadena de origen a un puerto de salida dirigida por el registro dx.El operando destino debe ser el registro dx y el operando fuente debe sermemoria direccionada por si o ESI con cualquier prefijo de segmento.

outs dx, byte [si] ; byte de salidaoutsw ; palabra de salidaouts dx, dword [gs: esi] ; salida doble palabra

La repetición prefijos representante, repe / REPZ y REPNE / repnz especificar cadena repetida operaciónación. Cuando una instrucción de operación de cadena tiene un prefijo de repetición, se ejecuta la operaciónvarias veces, utilizando cada vez un elemento diferente de la cadena. Las termina repeticióncuando una de las condiciones especificadas por el prefijo se cumple. Todos los tres prefijos auto­disminuir automáticamente cx o registro ECX (dependiendo de si la instrucción operación de cadenautiliza el 16 bits o 32­bit de direccionamiento) después de cada operación y repita el asociadooperación hasta cx o ecx es cero. repe / REPZ y REPNE / repnz se utilizan exclusivamentecon las instrucciones del CPEA y CMPS (descrito a continuación). Cuando se usan estos prefijos,la repetición de la siguiente instrucción depende de la bandera de cero (ZF) también, repe y REPZterminar la ejecución cuando la ZF es cero, REPNE y repnz terminar la ejecucióncuando la ZF está establecido.

rep movsd ; transferir varias palabras doblesrepe CMPSB ; comparar los bytes hasta que no igual

2.1.9 instrucciones de control de la bandera

Las instrucciones de control de la bandera proporcionan un método para cambiar directamente el estado de los bits enregistro del pabellón. Todas las instrucciones descritas en esta sección no tienen operandos.

Página 34

34 CAPÍTULO 2. del conjunto de instrucciones

stc establece el CF (pabellón lleven) a 1, ceros clc la CF, cmc cambia el CF a sucomplementar. std establece el DF (indicador de dirección) a 1, cld ceros del DF, sti establece el SI(Bandera interrumpir) a 1 y por lo tanto permite a las interrupciones, ceros cli el SI y por lo tantodesactiva las interrupciones.

LAHF copias SF, ZF, AF, PF, y CF con los bits 7, 6, 4, 2 y 0 del registro ah. Lacontenido de los bits restantes no están definidos. Las banderas no se verán afectados.

transferencias SAHF bits 7, 6, 4, 2, y 0 del registro ah en SF, ZF, AF, PF, yCF.

decrementos PUSHF esp por dos o cuatro y almacena la palabra baja o palabra doble deregistro de banderas en la parte superior de la pila, el tamaño de los datos almacenados depende del ajuste del código actual.variantes fuerzas pushfw almacenar la palabra y las fuerzas pushfd almacenar la palabra doble.

transferencias POPF bits específicos de la palabra o palabra doble en la parte superior de la pila, luegoincrementos esp por dos o cuatro, este valor depende de la configuración del código actual. popfwfuerzas variantes restauración de la palabra y las fuerzas popfd restauración de la palabra doble.

01/02/10 operaciones condicionales

Las instrucciones obtenidas uniendo la condición mnemotécnico (ver tabla 2.1) a la

Page 32: Lenguage asembler FASM_esp

ajuste mnemónico establece un byte a uno si la condición es verdadera y establecer el byte a cero en caso contrario.El operando debe ser una de 8 bits sea registro general o el byte en la memoria.

Setne al ; establecer si al pabellón cero borrabyte seto [bx] ; conjunto de bytes si desbordamiento

instrucción SALC establece los todos los bits de al registrar cuando la bandera de acarreo se establece y cerosel registro al contrario. Esta instrucción no tiene argumentos.

Las instrucciones obtenidas uniendo la condición mnemónico a cmov mnemónicotransferir la palabra o palabra doble del registro general o la memoria a lo generalregistra sólo cuando la condición es verdadera. El operando destino debe ser generalinscribirse, el operando de origen puede ser registro general o la memoria.

hacha cmove, bx ; moverse cuando conjunto bandera de cerocmovnc eax, [ebx]; moverse cuando pabellón lleven aclaró

cmpxchg compara el valor de la col, el hacha, o registro eax con el destinooperando. Si los dos valores son iguales, el operando de origen se carga en el destinooperando. De lo contrario, el operando destino se carga en la col, el hacha, o registro EAX.El operando destino puede ser un registro o memoria en general, el mosto operando fuenteser un registro general.

cmpxchg dl, bl ; comparar e intercambiar con registrocmpxchg [bx], dx; comparar e intercambiar con la memoria

Página 35

2.1. LAS INSTRUCCIONES arquitectura x86 35

CMPXCHG8B compara el valor de 64 bits en los registros EDX y EAX con el destinooperando. Si los valores son iguales, el valor de 64 bits en los registros CEx y se almacena en EBXel operando de destino. De lo contrario, el valor en el operando de destino se carga enEDX y EAX registros. El operando de destino debe ser una palabra de cuatro en la memoria.

CMPXCHG8B [bx] ; comparar e intercambiar 8 bytes

2.1.11 instrucciones Misceláneos

instrucción nop ocupa un byte, pero afecta más que el puntero de instrucción. Esteinstrucción tiene ningún operando y no realiza ninguna operación.

UD2 instrucción genera una excepción opcode no válido. Se proporciona esta instrucciónpara las pruebas de software para generar explícitamente un código de operación no válida. Esta es la instrucción no tieneoperandos.

XLAT reemplaza un byte en el registro AL con un byte índice por su valor en una traducciónmesa dirigida por bx o ebx. El operando debe ser un byte de memoria dirigida por bxo EBX con cualquier prefijo de segmento. Esta instrucción tiene también un corto xlatb forma que tieneningún operando y utiliza la dirección bx o ebx en el segmento seleccionados por ds segúnen la configuración del código actual.

lds transfiere una variable puntero del operando fuente para DS y el destinoregistrarse. El operando fuente debe ser un operando de la memoria, y el operando de destinodebe ser un registro general. El registro DS recibe el selector de segmento del punteromientras que el registro de destino recibe la parte de desplazamiento del puntero. les, lfs, LGS ylss funciona de forma idéntica a lds excepto que en lugar de ds registran los ES, FS, gs y ss

Page 33: Lenguage asembler FASM_esp

se utiliza respectivamente.

lds bx, [si] ; puntero de carga para ds: bx

lea transfiere el desplazamiento del operando fuente (en lugar de su valor) al destinooperando. El operando fuente debe ser un operando de la memoria, y el operando de destinodebe ser un registro general.

dx lea, [bx + si + 1]; cargar dirección efectiva a dx

cpuid vuelve identificación del procesador y cuentan con información en el eax, ebx, ecx,y registros EDX. La información devuelta se selecciona introduciendo un valor en el eaxregistrarse antes de ejecutarse la operación. Esta instrucción no tiene operandos.

la instrucción de pausa retrasa la ejecución de la siguiente instrucción una implementaciónperíodo de tiempo específico. Se puede utilizar para mejorar el rendimiento de los bucles de espera de centrifugado.Esta instrucción no tiene operandos.

introducir crea un marco de pila que se puede utilizar para aplicar las reglas de ámbito debloque estructurado lenguajes de alto nivel. Una instrucción de la licencia al final de un procedimientoel complemento de un escriba al inicio del procedimiento para simplificar la gestión de la pilay para controlar el acceso a las variables para procedimientos anidados. La instrucción incluye entrar

Página 36

36 CAPÍTULO 2. del conjunto de instrucciones

dos parámetros. El primer parámetro especifica el número de bytes de almacenamiento dinámicoque se asignarán en la pila de la rutina que se ingresa. El segundo parámetrocorresponde al nivel de anidamiento léxica de la rutina, puede estar en el rango de 0 a 31.El nivel léxico especificado determina cuántos conjuntos de marco de pila punteros de la CPUcopia en el nuevo marco de pila de la trama precedente. Esta lista de marco de pilapunteros a veces se llama la pantalla. La primera palabra (o palabra doble cuando el códigoes 32­bit) de la pantalla es un puntero a la última trama de la pila. Este puntero permite unadejar instrucciones para invertir la acción de la instrucción entrará anterior con eficaciadescartando el último marco de pila. Después de entrar crea la nueva pantalla de un procedimiento,que asigna el espacio de almacenamiento dinámico para dicho régimen por decremento esp por elnúmero de bytes especificados en el primer parámetro. Para habilitar un procedimiento para hacer frente a supantalla, introduzca deja pb (o ebp) señalando el comienzo del nuevo marco de pila. Si elnivel léxico es cero, anote empuja pb (o ebp), copias sp a pb (o esp a ebp) y luegoresta el primer operando de esp. Para niveles de anidamiento mayor que cero, el procesadorempuja punteros trama adicionales en la pila antes de ajustar el puntero de pila.

entrar en 2048,0 ; introducir y asignar 2048 bytes en la pila

2.1.12 Las instrucciones del sistema

LMSW carga el operando en el estado de la máquina (bits 0 a 15 del registro cr0),mientras smsw almacena el estado de la máquina en el operando destino. El operandotanto para dichas instrucciones pueden ser registro general de 16 bits o de la memoria, por lo que puede smswtambién ser registro general de 32 bits.

LMSW hacha ; estado de la máquina de carga de registrosmsw [bx] ; estado de la máquina tienda para la memoria

instrucciones lgdt y lidt cargan los valores de operando en la tabla de descriptores globales

Page 34: Lenguage asembler FASM_esp

Registrarse o la tabla de descriptores de interrupción registro respectivamente. SGDT y almacenar la sidtcontenido del registro de la tabla de descriptores global o el descriptor de interrupción tabla de registroen el operando de destino. El operando debe ser un 6 bytes en la memoria.

lgdt [ebx] ; cargar la tabla de descriptores globales

lldt carga el operando en el campo selector de segmento de la tabla de descriptores localesregistren y tiendas SLDT el selector de segmento de la tabla de descriptores locales registran enel operando. ltr carga el operando en el campo selector de segmento de la tarea registroy tiendas de str el selector de segmento del registro de tareas en el operando. Reglas paraoperando son los mismos que para las instrucciones LMSW y smsw.

lar carga los derechos de acceso desde el descriptor de segmento especificado por el selectoren el operando de origen en el operando destino y establece la bandera ZF. El destinooperando puede ser un registro de 16 bits o 32 bits general. El operando fuente debe ser unaRegistro General de 16 bits o de memoria.

Página 37

2.1. LAS INSTRUCCIONES arquitectura x86 37

hacha lar, [bx] ; derechos de acceso Cargue en la palabraeax lar, dx ; los derechos de acceso de carga en la palabra doble

lsl carga el límite de segmento del descriptor de segmento especificado por el selector enoperando de origen en el operando destino y establece el indicador ZF. Reglas para el operandoson los mismos que para la instrucción LAR.

verr y verw verificar si el segmento de código o los datos especificados por el operando esleer o escribir desde el nivel de privilegio actual. El operando debe ser una palabra,puede ser registro general o la memoria. Si el segmento es accesible y legible (por verr)o permisos de escritura (por verw) la bandera ZF se fija, si no se borra. Reglas para el operando sonel mismo que para la instrucción lldt.

ARPL compara los campos de dos selectores segmento RPL (nivel de privilegio del solicitante).El primer operando contiene un selector de segmento y el segundo operando contiene elotra. Si el campo RPL del operando de destino es menor que el campo de RPL de la fuenteoperando, la bandera ZF se establece y el campo RPL del operando de destino se incrementapara que coincida con el operando fuente. De lo contrario, la bandera ZF se borra y ningún cambioestá hecho para el operando de destino. El operando destino puede ser una palabra generalRegistrarse o la memoria, el operando fuente debe ser un registro general.

bx ARPL, hacha ; ajustar RPL de selector en el registroARPL [bx], hacha ; ajustar RPL de selector en la memoria

SANTOLIC borra los TS (tarea conmutada) bandera en el Registro cr0. Esta instrucción no tieneoperandos.

prefijo de bloqueo hace que la señal del bus­bloqueo del procesador para afirmar durante la ejecuciónde la instrucción de acompañamiento. En un entorno de multiprocesador, la señal de bus de bloqueoasegura que el procesador tiene el uso exclusivo de cualquier memoria compartida mientras que la señal esaseverado. El prefijo de bloqueo se puede anteponer únicamente a las siguientes instrucciones y sóloa las formas de las instrucciones en el operando destino es un operando de memoria:añadir, adc, y, btc, btr, bts, cmpxchg, CMPXCHG8B, diciembre, inc, neg, no, o, SBB, sub,xor, xadd y xchg. Si el prefijo de bloqueo se utiliza con una de estas instrucciones y laoperando fuente es un operando de memoria, una excepción opcode indefinido se puede generar.También se ha generado una excepción opcode indefinido si el prefijo de bloqueo se utiliza concualquier instrucción no en la lista anterior. La instrucción xchg siempre afirma el bus­lock

Page 35: Lenguage asembler FASM_esp

la señal independientemente de la presencia o ausencia del prefijo de bloqueo.hlt detiene la ejecución de instrucciones y coloca el procesador en un estado detenido. Una

interrupción habilitado, una excepción de depuración, la Binit, INIT o la señal de RESET se reanudaránla ejecución. Esta instrucción no tiene operandos.

invalida invlpg (sofocos) la (tampón lookaside traducción) TLB entrada especificadacon el operando, que debe ser una memoria. El procesador determina la página quecontiene esa dirección y vacía el TLB para esa página.

RDMSR carga el contenido de un 64­bit MSR (modelo específico de registro) de la direcciónespecificado en el registro ECX en registros edx y eax. wrmsr escribe el contenido de

Página 38

38 CAPÍTULO 2. del conjunto de instrucciones

registra edx y eax en el MSR de 64 bits de la dirección especificada en el registro ECX.RDTSC carga el valor actual del contador de marca de tiempo del procesador de 64 bitsMSR en EDX y EAX registros. El procesador incrementa el contador de marca de tiempoMSR cada ciclo de reloj y restablece a 0 cada vez que el procesador se restablece. cargas rdpmcel contenido del contador de monitorización del rendimiento 40­bit especificado en el registro ecxen registros edx y eax. Estas instrucciones no tienen operandos.

wbinvd escribe espalda todas las líneas de caché modificados en la memoria caché interna del procesador to mainmemoria e invalida (sofocos) las cachés internas. La instrucción emite unciclo de bus función especial que dirige cachés externas para también escribir datos de nuevo modificadoy otro ciclo de bus para indicar que los cachés externas deben ser invalidadas. Estela instrucción no tiene operandos.

rsm el control del programa de retorno desde el modo de administración del sistema para el programa quefue interrumpido cuando el procesador recibe una interrupción SMM. Esta instrucción tieneningún operando.

SYSENTER ejecuta una llamada rápida a un procedimiento de sistema de nivel 0, sysexit ejecuta un ayunovolver al nivel 3 del código de usuario. Las direcciones utilizadas por estas instrucciones se almacenan en MSR.Estas instrucciones no tienen operandos.

01/02/13 FPU instrucciones

Los (Floating­Point Unit) instrucciones FPU operan en los valores de punto flotante entres formatos: precisión simple (32­bit), doble precisión (64 bits) y dobles ampliadade precisión (80 bits). Los registros de FPU forman la pila y cada uno de ellos sostiene el dobleprecisión extendido valor de punto flotante. Cuando algunos valores se insertan en la pilao se eliminan de la parte superior, los registros de FPU se desplazan, por lo st0 es siempre el valoren la parte superior de la pila FPU, st1 es el primer valor por debajo de la parte superior, etc. El nombre st0 tienetambién el sinónimo st.

empuja fld el valor de punto flotante en la pila registro FPU. El operando puedesea de 32 bits, 64 bits o ubicación de memoria de 80 bits o el registro de FPU, su valor es entonces cargadoen la parte superior de la pila de registros de FPU (el registro st0) y se convierte automáticamente enel formato de precisión extendida doble.

dword fld [bx] ; cargar valor previsión individual de la memoriast2 fld ; empujar valor de st2 en pila de registros

fld1, fldz, fldl2t, fldl2e, fldpi, fldlg2 y fldln2 cargar el uso comúncontants en la pila registro FPU. Las constantes cargados son 1,0, 0,0, registro 210,log 2e, π, registro102 y LN2 respectivamente. Estas instrucciones no tienen operandos.

Page 36: Lenguage asembler FASM_esp

fild convierte el operando fuente entero con signo en doble precisión ampliadaformato de punto flotante y empuja el resultado en la pila registro FPU. La fuenteoperando puede ser una 16 bits, la ubicación de memoria de 32 bits o 64 bits.

Fild QWORD [bx]; carga entero de 64 bits de la memoria

Página 39

2.1. LAS INSTRUCCIONES arquitectura x86 39

FST copia el valor de registro a st0 el operando de destino, que puede ser de 32 bitso ubicación de memoria de 64 bits o en otro registro FPU. fstp realiza la misma operacióncomo fst y luego aparece la pila de registros, deshacerse de st0. fstp acepta la mismaoperandos como la instrucción FST y también pueden almacenar valor en la memoria 80­bit.

fst st3 ; copiar valor de st0 en el registro st3tword fstp [bx]; almacenar el valor en la memoria y el pop pila

puño convierte el valor en st0 a un entero con signo y almacena el resultado en eloperando destino. El operando puede ser 16 bits o ubicación de memoria de 32 bits. FISTPrealiza la misma operación y después hace estallar la pila de registros, se acepta el mismooperandos como la instrucción puño y también puede almacenar valor entero en la memoria de 64 bits,por lo que tiene las mismas reglas para operandos de instrucción fild.

fbld convierte el entero BCD empaquetados en coma flotante de doble precisión ampliadaformatear y empuja este valor en la pila FPU. fbstp convierte el valor en st0 aun lleno entero BCD 18 dígitos, almacena el resultado en el operando destino y popsla pila de registros. El operando debe ser una ubicación de memoria de 80 bits.

fadd añade el destino y fuente operando y almacena la suma en el destinoubicación. El operando de destino es siempre un registro FPU, si la fuente es una memoriaubicación, el destino es st0 registrarse y sólo operando fuente debe ser especificado.Si ambos operandos son registros de FPU, por lo menos uno de ellos debe haber registro st0. Unaoperando en la memoria puede ser un valor de 32 bits o 64 bits.

fadd QWORD [bx]; agregar valor doble precisión para st0fadd st2, st0 ; añadir st0 a ST2

faddp agrega el destino y fuente operando, almacena la suma en el destinoubicación y luego aparece la pila de registros. El operando de destino debe ser una FPUregistro y el operando fuente debe ser el st0. Cuando no se especifican operandos, st1se utiliza como un operando de destino.

faddp ; añadir st0 a st1 y sacar la pilafaddp st2, st0 ; añadir st0 a st2 y sacar la pila

instrucción fiadd convierte un operando fuente entero en doble precisión ampliadavalor de punto flotante y lo agrega al operando destino. El operando debe ser una16 bits o ubicación de memoria de 32 bits.

palabra fiadd [bx]; añadir palabra entero para st0

fsub, fsubr, FMUL, fdiv, instrucción fdivr son similares a FADD, tienen el mismoreglas para operandos y sólo se diferencian en el cómputo perfomed. fsub sustrae eloperando fuente del operando destino, fsubr Resta el operando destinodesde el operando fuente, FMUL multiplica el destino y origen operandos, fdivdivide el operando destino por el operando fuente y fdivr divide la fuente

Page 37: Lenguage asembler FASM_esp

Página 40

40 CAPÍTULO 2. del conjunto de instrucciones

operando por el operando de destino. fsubp, fsubrp, fmulp, fdivp, fdivrp realizar lamismas operaciones y sacar la pila de registro, las reglas para el operando son los mismos que parala instrucción faddp. FISUB, fisubr, fimul, fidiv, fidivr realizar estas operacionesdespués de convertir el operando fuente entero en valor de punto flotante, que tienen la mismareglas para operandos de instrucción fiadd.

fsqrt calcula la raíz cuadrada del valor en el registro st0, fsin calcula el senode ese valor, fcos calcula el coseno de ese valor, FCHS complementa su bit de signo,fabs borra su signo para crear el valor absoluto, FRNDINT redondea al integrante más cercanavalor, en función del modo actual de redondeo. f2xm1 calcula el valor exponencialde 2 a la potencia de st0 y sustrae el 1.0 de la misma, el valor de st0 debe estar en elvariar ­1,0 a 1,0. Todas estas instrucciones almacenar el resultado en st0 y no tienen operandos.

fsincos calcula tanto el seno y el coseno del valor en el registro st0, tiendasen el seno st0 y empuja el coseno en la parte superior de la pila de registro de FPU. computa fptanla tangente del valor en st0, almacena el resultado en st0 y empuja un 1,0 sobre la FPUregistrarse pila. fpatan calcula el arcotangente del valor en st1 dividido por el valoren st0, almacena el resultado en st1 y hace estallar la pila de registros de FPU. fyl2x calcula lalogaritmo binario de st0, lo multiplica por st1, almacena el resultado en st1 y aparece elPila de registro FPU; fyl2xp1 realiza la misma operación pero añade 1.0 a st0 antescalcular el logaritmo. fprem calcula el resto obtenido de dividir elvalor en st0 por el valor en st1, y almacena el resultado en st0. fprem1 realiza lamisma operación que fprem, pero calcula el resto de la manera especificada por el IEEENorma 754. fscale trunca el valor en st1 y aumenta el exponente de st0 poreste valor. fxtract separa el valor en st0 en su exponente y mantisa, tiendasel exponente en st0 y empuja la mantisa en la pila registro. realiza FNOPninguna operación. Estas instrucciones no tienen operandos.

intercambios FXCH el contenido del registro st0 un otro FPU. El operando debe serun registro FPU, si no se especifica ningún operando, se intercambian los contenidos de st0 y st1.

fcom y FCOMP comparar el contenido de banderas st0 y el operando fuente y establecidosen la palabra de estado FPU según los resultados. FCOMP aparece, además, el registroapilar después de realizar la comparación. El operando puede ser una sola o de doble precisiónvalor en la memoria o el registro de FPU. Cuando no se especifica ningún operando, st1 se utiliza como unaoperando fuente.

fcom ; comparar st0 con st1FCOMP st2 ; comparar st0 con la pila st2 y pop

fcompp compara el contenido de st0 y st1, establece banderas en la palabra de estado FPUde acuerdo con los resultados y hace estallar la pila de registros en dos ocasiones. Esta instrucción no tieneoperandos.

fucom, fucomp y fucompp realiza una comparación desordenada de dos registros de FPU.Reglas para operandos son los mismos que para el fcom, FCOMP y fcompp, pero la fuenteoperando debe ser un registro FPU.

Page 38: Lenguage asembler FASM_esp

Página 41

2.1. LAS INSTRUCCIONES arquitectura x86 41

FICOM y ficomp comparar el valor en st0 con un operando fuente de entero y conjuntolas banderas en la palabra de estado FPU de acuerdo con los resultados. ficomp aparece, además, laregistro de pila después de realizar la comparación. El valor entero se convierte a duplicarprecisión en formato extendido de punto flotante antes de la comparación se hace. El operandodebe ser una ubicación de memoria de 16 bits o 32 bits.

FICOM palabra [bx]; comparar st0 con entero de 16 bits

fcomi, fcomip, FUCOMI, fucomip realizar la comparación de st0 con otro FPUregistrar y configurar las banderas ZF, PF y CF de acuerdo con los resultados. fcomip y fucomipadicionalmente sacar la pila de registro después de realizar la comparación. Las instrucciones de observadorescontenidas uniendo la condición FPU mnemónico (véase la tabla 2. 2) para el mnemónico fcmovtransferir el registro FPU especificado en el registro st0 si la condición fiven prueba es verdadera.Estas instrucciones permiten dos sintaxis diferentes, uno con solo operando especificando elregistro fuente FPU, y otra con dos operandos, en ese caso debería operando destinoser st0 registro y el segundo operando especifica el registro FPU fuente.

fcomi st2 ; comparar st0 con banderas ST2 y establecidosst0 fcmovb, st2 ; transferir st2 a st0 si está por debajo

Mnemotécnico condición probada Descripción

b CF = 1 abajoe ZF = 1 igualser CF o ZF = 1 inferior o igualu PF = 1 desordenadanb CF = 0 no por debajoNebraska ZF = 0 no es igualnbe CF y ZF = 0 no por debajo ni es igualnu PF = 0 No desordenada

Tabla 2.2: Condiciones de FPU.

ftst compara el valor en st0 con 0.0 y establece los indicadores en la palabra de estado FPUsegún los resultados. fxam examina el contenido de la st0 y establece los indicadores enPalabra de estado FPU para indicar la clase de valor en el registro. Estas instrucciones tienenningún operando.

fstsw y fnstsw almacenar el valor actual de la palabra de estado FPU en el destinoubicación. El operando de destino puede ser una memoria de 16 bits o el registro de hacha.cheques fstsw de espera de excepciones FPU umasked antes de guardar la palabra de estado,fnstsw no lo hace.

fstcw y almacenar fnstcw el valor actual de la palabra de control FPU en el especificadodestino en la memoria. fstcw cheques pendientes umasked excepciones FPU antes de almacenamientoing la palabra de control, fnstcw no. fldcw carga el operando en el control FPUpalabra. El operando debe ser una ubicación de memoria de 16 bits.

Página 42

Page 39: Lenguage asembler FASM_esp

42 CAPÍTULO 2. del conjunto de instrucciones

fstenv y fnstenv almacenar el entorno operativo FPU actual en la memorialugar especificado por el operando destino y máscara todas las excepciones FPU.fstenv comprueba espera de excepciones FPU umasked antes de proceder, fnstenv haceno. fldenv carga el entorno operativo completo de memoria en la FPU.FSAVE y almacenar fnsave el estado actual FPU (entorno de operación y registroapilar) en el destino especificado en la memoria y reinicializa la FPU. cheque FSAVEde pendiente excepciones FPU desenmascarados antes de proceder, fnsave no lo hace. frstorcarga el estado FPU de la posición de memoria especificada. Todas estas instrucciones necesitanun operando ser una ubicación de memoria. Para cada una de estas instrucciones existir dos Ademásmnemónicos cionales que permiten seleccionar precisamente el tipo de la operación. El fstenvw,fnstenvw, fldenvw, fsavew, fnsavew y mnemotécnicos frstorw obligan a la instrucción derealizar la operación como en el modo de 16 bits, mientras que fstenvd, fnstenvd, fldenvd, fsaved,fnsaved y frstord forzar la operación como en el modo de 32 bits.

finit y fninit establecer el entorno operativo FPU en su estado predeterminado. finitcomprueba espera de excepción FPU desenmascarado antes de proceder, fninit no. fclexy fnclex quitarles las marcas de excepción FPU en la palabra de estado FPU. cheques fclex parapendiente excepción FPU desenmascarado antes de proceder, fnclex no lo hace. esperar y fwaitson sinónimos de la misma instrucción, que hace que el procesador para comprobar si hay pendientedesenmascarado excepciones FPU y manejarlos antes de continuar. Estas instrucciones tienenningún operando.

ffree que establece la etiqueta asociada con registro FPU especificado para vaciar. El operandodebe ser un registro FPU.

fincstp y fdecstp girar la pila FPU por uno añadiendo o restando unoal puntero de la parte superior de la pila. Estas instrucciones no tienen operandos.

2.1.14 instrucciones MMX

Las instrucciones MMX operan en los tipos enteros en paquetes y utilizan los registros MMX,que son las partes de 64 bits bajas de los registros de FPU 80 bits. Debido a esto MMXinstrucciones no se pueden utilizar al mismo tiempo como instrucciones FPU. Pueden funcionaren bytes empaquetados (ocho enteros de 8 bits), palabras llenas (cuatro enteros de 16 bits) o envasadospalabras dobles (dos enteros de 32 bits), el uso de formatos empaquetados permite realizar operacionesen varios datos a la vez.

movq copia una palabra cuádruple del operando fuente al operando destino. Enmenos uno de los operandos Debe haber un registro MMX, la segunda puede ser también un MMXRegistrarse o posición de memoria de 64 bits.

mm0 movq, mm1 ; mover palabra cuádruple de registro para registrarsemm2 movq, [ebx] ; mover palabra cuádruple de la memoria para registrar

copias MOVD una doble palabra del operando fuente al operando destino. Unode los operandos deben ser un registro MMX, el segundo puede ser un registro general oUbicación de memoria de 32 bits. Sólo se utiliza bajo palabra doble de MMX registro.

Página 43

2.1. LAS INSTRUCCIONES arquitectura x86 43

Page 40: Lenguage asembler FASM_esp

Todas las operaciones generales MMX tienen dos operandos, el operando de destino debe serun registro MMX, el operando de origen puede ser un registro MMX o ubicación de memoria de 64 bitsción. La operación se realiza en los elementos de datos correspondientes de la fuente yoperando destino y se almacena en los elementos de datos del operando destino. paddb,paddw y paddd realizan la adición de bytes de relleno, palabras llenas, o embalados doblepalabras. psubb, psubw y psubd realizan la sustracción de tipos apropiados. paddsb,paddsw, psubsb y psubsw realizar la adición o sustracción de bytes de relleno opalabras llenas con la saturación firmado. paddusb, paddusw, psubusb, psubusw sonanáloga, pero con la saturación sin signo. pmulhw y pmullw realiza una mul­ firmadoplicación de las palabras para llevar y almacenar las palabras altas o bajas de los resultados en eloperando destino. pmaddwd realiza una multiplicación de las palabras envasados y añade elcuatro productos de palabras dobles intermedios en pares para producir resultado como un abarrotado doblepalabras. pand, POR y pxor realizar las operaciones lógicas en las palabras de quad, pandn pe­Los formularios también una negación lógica del operando destino antes de la operación. pcmpeqb,pcmpeqw y pcmpeqd comparar la igualdad de bytes empaquetados, envasados o empaquetados palabraspalabras dobles. Si un par de elementos de datos es igual, el elemento de datos correspondiente enel operando destino está lleno de trozos de valor 1, de lo contrario se pone a 0. pcmpgtb,pcmpgtw y pcmpgtd realizar la operación similar, pero comprueban si los datoselementos en el operando destino son mayores que los elementos de datos en correspodingel operando fuente. conversos packsswb embalados palabras firmados en bytes firmados empaquetadas,packssdw convierte embalado firmó dobles palabras en palabras firmados empaquetadas, con saturaciónción para manejar condiciones de desbordamiento. packuswb convierte lleno palabras firmados en empaquetadobytes sin signo. Elementos de datos convertidos de operando de origen se almacenan en laparte baja del operando destino, mientras que los elementos de datos convertidos desde el destinooperando se almacenan en la parte alta. punpckhbw, punpckhwd y intercalaciones punpckhdqlos elementos de datos de las partes altas de los operandos y tiendas de origen y destinoel resultado en el operando de destino. punpcklbw, punpcklwd y punpckldq realizanla misma operación, pero las partes bajas de la fuente y el operando de destino se utilizan.

mm0 paddsb, [esi]; añadir bytes empaquetados con saturación firmadomm3 pcmpeqw, mm7; comparar palabras para llevar para la igualdad

psllw, pslld y psllq realizar el cambio lógico izquierda de las palabras envasados, embalados doblepalabras o una sola palabra de quad en el operando destino en la cantidad especificada en eloperando fuente. psrlw, psrld y psrlq realizan derecha desplazamiento lógico de las palabras llenas,embalado palabras dobles o una sola palabra quad. psraw y psrad realizan desplazamiento aritméticode las palabras llenas o palabras dobles. El operando destino debe ser un MMXinscribirse, mientras operando de origen puede ser un registro MMX, la ubicación de memoria de 64 bits o de 8 bitsvalor inmediato.

mm2 psllw, mm4 ; palabras desviación a la izquierda, lógicamente,mm4 psrad, [ebx]; cambiar palabras dobles derecho aritméticamente

emms hace que el FPU registra utilizable para las instrucciones FPU, que debe ser utilizadoantes de usar las instrucciones FPU si se utilizaran las instrucciones MMX.

Página 44

44 CAPÍTULO 2. del conjunto de instrucciones

2.1.15 instrucciones SSE

La extensión SSE añade más instrucciones MMX y también introduce las operacionesen valores de punto flotante de precisión simple para llevar. El 128­bit lleno de precisión simpleformato consiste de cuatro valores de un solo punto flotante de precisión. Los registros SSE de 128 bits

Page 41: Lenguage asembler FASM_esp

están diseñados con el propósito de operaciones en este tipo de datos.movaps y movups transferir una doble palabra del operando quad contiene pecado embalado

valores de precisión gle de operando fuente al operando destino. Al menos una de lasoperandos tienen que ser un registro SSE, el segundo puede ser también un registro SSE o 128ubicación de memoria de bit. Operandos de memoria para la instrucción movaps deben estar alineados enlímite de 16 bytes, operandos para la instrucción movups no tienen que estar alineados.

movups xmm0, [ebx]; mover unaligned palabra doble quad

movlps mueve embalados dos valores de precisión simple entre la memoria y la bajapalabra cuádruple de SSE registro. movhps, mueven embalados dos valores de precisión simple entrela memoria y la palabra alta del patio de la ESS registro. Uno de los operandos deben ser unaSSE registro, y el otro operando debe ser una ubicación de memoria de 64 bits.

movlps xmm0, [ebx]; mover a la memoria bajo palabra cuádruple de xmm0movhps [esi], xmm7; mover palabra alta quad de xmm7 a la memoria

movlhps mueve embalados dos valores de precisión simple de la palabra baja del patio de la fuenteregistro para la palabra cuádruple de alta de registro de destino. movhlps mueve dos embalados solavalores de precisión de la palabra de mayor quad de registro de origen a la palabra baja de cuádrupleregistro de destino. Ambos operandos tienen que ser unos registros de la ESS.

movmskps transfiere el bit más significativo de cada uno de los cuatro valores de precisión individualesen la ESS registrarse en bajos cuatro bits de un registro general. El operando fuente debe serun registro SSE, el operando de destino debe ser un registro general.

movss transfiere un solo valor de precisión entre la fuente y el operando de destino(Sólo la palabra doble baja se trasferred). Al menos uno de los operandos tiene que ser un SSEregistro, el segundo puede ser también un registro o memoria de 32 bits ubicación SSE.

movss [edi], XMM3 ; moverse bajo palabra doble de XMM3 a la memoria

Cada una de las operaciones aritméticas de la ESS tiene dos variantes. Cuando los extremos mnemotécnicoscon ps, el operando de origen puede ser un lugar de memoria de 128 bits o un registro SSE, laoperando de destino debe ser un registro SSE y la operación se realiza también en caminos decuatro valores de precisión individuales, para cada par de los elementos de datos correspondientes por separado,el resultado se almacena en el registro de destino. Cuando la tecla de acceso termina con ss,el operando de la fuente puede ser una ubicación de memoria de 32 bits o un registro SSE, el destinooperando debe ser un registro SSE y la operación se realiza sobre los valores de precisión simple,sólo bajos dobles palabras de registros SSE se utilizan en este caso, el resultado se almacena en la bajadoble palabra de registro de destino. addps y addss agregan los valores, subps y subssrestar el valor de la fuente de valor de destino, mulps y mulss multiplicar los valores,

Página 45

2.1. LAS INSTRUCCIONES arquitectura x86 45

divps y divss dividen el valor de destino por el valor de origen, rcpps y rcpsscalcular el recíproco aproximada del valor de origen, sqrtps y calcular sqrtssla raíz cuadrada del valor de origen, rsqrtps y rsqrtss calculan la aproximaciónrecíproco de la raíz cuadrada del valor de origen, maxps y maxss comparan la fuente yvalores de destino y retorno de la mayor, minps y minss comparan la fuente yvalores de destino y retorno el que resulte menor.

xmm0 mulss, [ebx] ; multiplicar los valores de precisión simpleaddps XMM3, xmm7 ; añadir valores de precisión individuales envasados

Page 42: Lenguage asembler FASM_esp

andps, andnps, puestos de rehidratación oral y xorps realizan las operaciones lógicas en caminos de una solavalores de precisión. El operando fuente puede ser una ubicación de memoria de 128 bits o una SSEinscribirse, el operando de destino debe ser un registro SSE.

cmpps compara lleno valores de precisión simple y devuelve un resultado máscara en eloperando de destino, que debe ser un registro SSE. El operando fuente puede ser un 128posición de memoria de bits o SSE registro, el tercer operando debe ser un operando inmediatocódigo de la selección de uno de los ocho comparar condiciones (tabla 2. 3). cmpss realiza lamisma operación sobre los valores de precisión simple, sólo bajo palabra doble del registro de destinose ve afectado, en este caso el operando de origen puede ser una ubicación de memoria de 32 bits o SSE registro.Estas dos instrucciones tienen también variantes con sólo dos operandos y la condicióncodificada dentro mnemotécnico. Sus mnemónicos se obtienen uniendo el mnemónicode la tabla 2.3 de la regla mnemotécnica cmp y luego fijar el ps o ss al final.

XMM2 cmpps, xmm4,0; comparar los valores de precisión individuales envasadoscmpltss xmm0, [ebx]; comparar los valores de precisión simple

Código mnemotécnico Descripción0 eq igual1 lt menos que2 le menor o igual3 unord desordenada4 neq no es igual5 NLT no menos de6 NLE no menos de igual ni7 ord ordenado

Tabla 2.3: Condiciones de la ESS.

comiss y ucomiss comparan los valores de precisión simple y fijan la ZF, PF y CFbanderas para mostrar el resultado. El operando de destino debe ser un registro SSE, la fuenteoperando puede ser una ubicación de memoria de 32 bits o SSE registro.

shufps mueve cualesquiera dos de los cuatro valores de precisión individuales del operando de destinoen la palabra quad bajo del operando de destino, y dos de los cuatro valores de

Página 46

46 CAPÍTULO 2. del conjunto de instrucciones

el operando de origen en la palabra cuádruple de alta del operando destino. El destinooperando debe ser un registro SSE, el operando fuente puede ser una ubicación de memoria de 128 bitso SSE registro, el tercer operando debe ser una selección de valor inmediato de 8 bits quevalores se movieron en el operando destino. Los bits 0 y 1 seleccionar el valor deser trasladado de operando de destino a la doble palabra baja del resultado, los bits 2 y 3seleccionar el valor que ser trasladada desde el operando destino a la segunda palabra doble,los bits 4 y 5 seleccione el valor que vayan a abandonar el operando fuente al tercer doblepalabra, y los bits 6 y 7 de seleccionar el valor que vayan a abandonar el operando fuente al altopalabra doble del resultado.

shufps xmm0, xmm0,10010011b; barajar palabras dobles

unpckhps realiza una desempaquetar intercalada de los valores de las partes altas de laoperandos de origen y destino y almacena el resultado en el operando destino, queDebe haber un registro SSE. El operando fuente puede ser una ubicación de memoria de 128 bits o una SSE

Page 43: Lenguage asembler FASM_esp

registrarse. unpcklps realiza una desempaquetar intercalada de los valores de las partes bajas deel operando de origen y de destino y almacena el resultado en el operando de destino, elreglas para operandos son iguales.

cvtpi2ps conversos embalados dos palabras enteros dobles en el los dos repleto solaprecisión valores de punto flotante y almacena el resultado en la palabra baja de cuádruple del destinooperando nación, que debe ser un registro SSE. El operando fuente puede ser una de 64 bitsubicación de memoria o registro MMX.

xmm0 cvtpi2ps, mm0; enteros a valores de precisión simple

cvtsi2ss convierte una palabra doble entero en un valor de punto flotante de precisión simpley almacena el resultado en la doble palabra baja del operando destino, que deben serun registro SSE. El operando fuente puede ser una ubicación de memoria de 32 bits o de 32 bits en generalregistrarse.

xmm0 cvtsi2ss, eax; número entero de valor de precisión simple

conversos cvtps2pi embalados dos valores de punto flotante de precisión simple en dos embaladoenteros de palabras dobles y almacena el resultado en el operando destino, que debe serun registro MMX. El operando fuente puede ser una ubicación de memoria de 64 bits o SSE registro,sólo se utiliza bajo palabra cuádruple de SSE registro. cvttps2pi realiza la operación similar,excepto que el truncamiento se utiliza para redondear un valores de origen a enteros, las normas para los operandosson los mismos.

mm0 cvtps2pi, xmm0; Los valores de precisión simple en enteros

cvtss2si convertir un solo valor de coma flotante de precisión en una palabra de entero dobley almacena el resultado en el operando de destino, que debe ser un 32­bit en generalregistrarse. El operando fuente puede ser una ubicación de memoria de 32 bits o SSE registro, sólo bajose utiliza la palabra doble de SSE registro. cvttss2si realiza la operación similar, exceptoque el truncamiento se utiliza para redondear un valor de origen a un entero, las normas para los operandos sonmismo.

Página 47

2.1. LAS INSTRUCCIONES arquitectura x86 47

eax cvtss2si, xmm0; valor de precisión simple a entero

copias pextrw la palabra en el operando origen especificado por el tercer operando a laoperando destino. El operando fuente debe ser un registro MMX, el destinooperando debe ser un registro general de 32 bits (la palabra alta del destino se borra),el tercer operando debe un valor inmediato de 8 bits.

pextrw eax, mm0,1 ; extraer palabra en eax

pinsrw inserta una palabra del operando fuente en el operando destino en elubicación especificada con el tercer operando, que debe ser un valor inmediato de 8 bits.El operando de destino debe ser un registro MMX, el operando fuente puede ser una de 16 bits(sólo se utiliza bajo palabra del registro) la ubicación de memoria o registro general de 32 bits.

pinsrw mm1, ebx, 2 ; inserte Palabras ebx

pavgb y media de cómputo pavgw de bytes o palabras empaquetadas. pmaxub volver al maxvalores imum de bytes sin signo envasados, pminub devuelve los valores mínimos de empaquetadobytes sin signo, pmaxsw devuelve los valores máximos de palabras firmados empaquetadas, pminswdevuelve los valores mínimos de palabras firmados empaquetadas. pmulhuw realiza una unsigned

Page 44: Lenguage asembler FASM_esp

multiplicación de las palabras envasados y almacena los altos palabras de los resultados en la des­operando tino. psadbw calcula las diferencias absolutas de bytes sin signo envasados,resume las diferencias, y almacena la suma en la palabra baja del operando destino. Todosestas instrucciones siguen las mismas reglas para los operandos como las operaciones generales MMXdescrito en el apartado anterior.

pmovmskb crea una máscara hecha del bit más significativo de cada byte en la fuenteoperando y almacena el resultado en el byte bajo del operando destino. El operando fuenteDebe haber un registro MMX, el operando de destino debe un registro general de 32 bits.

pshufw inserta palabras del operando fuente en el operando destino de laubicaciones especificadas con el tercer operando. El operando de destino debe ser un MMXregistro, el operando de origen puede ser una ubicación de memoria de 64 bits o MMX registro, tercerooperando debe seleccionar un valor inmediato de 8 bits que valora se trasladó a des­operando tino, en la forma similar a la tercera operando de la instrucción shufps.

movntq mueve la palabra cuádruple del operando fuente de memoria utilizando un no­pista temporal para minimizar la contaminación de caché. El operando fuente debe ser un MMXinscribirse, el operando de destino debe ser una ubicación de memoria de 64 bits. movntps tiendasvalores de precisión de embalaje individual del SSE registran en la memoria con un no­temporalpista. El operando fuente debe ser un registro SSE, el operando de destino debe ser unaPosición de memoria de 128 bits. tiendas maskmovq seleccionados bytes desde el primer operando en unaPosición de memoria de 64 bits con un toque intemporal. Ambos operandos deben ser un MMXregistros, el segundo operando selecciona bytes Wich del operando fuente están escritasa la memoria. La ubicación de la memoria se señala por DI (o EDI) registrarse en el segmentoseleccionada por DS.

Página 48

48 CAPÍTULO 2. del conjunto de instrucciones

prefetcht0, prefetcht1, prefetcht2 y prefetchnta buscar la línea de datos dememoria que contiene el byte especificado por el operando a un lugar determinado en la jerarquía.El operando debe ser una ubicación de memoria de 8 bits.

sfence realiza una operación de serialización en toda la instrucción de almacenamiento de memoria queexpedidos antes de la misma. Esta instrucción no tiene operandos.

ldmxcsr carga el operando de memoria de 32 bits en el registro MXCSR. tiendas stmxcsrel contenido de MXCSR en un operando de memoria de 32 bits.

fxsave guarda el estado actual del registro FPU, MXCSR, y todo el FPUy SSE registra una ubicación de memoria 512 bytes especificado en el operando de destino.datos vuelve a cargar fxrstor previamente almacenados con la instrucción fxsave del especificado 512­ubicación de memoria byte. El operando de la memoria, tanto para esas instrucciones deben estar alineadosel 16 de límite de byte, debe declarar operando de ningún tamaño especificado.

02/01/16 instrucciones SSE2

La extensión SSE2 introduce las operaciones en coma flotante de doble precisión llenovalores, se extiende la sintaxis de instrucciones MMX, y añade también algunas nuevas instrucciones.

movapd y movupd transferir una palabra cuádruple doble operando con adición embalados doblevalores de precisión del operando fuente al operando destino. Estas instrucciones sonanáloga a movaps y movups y tienen las mismas reglas para operandos.

movlpd mueve valor doble precisión entre la memoria y la palabra baja del patio deRegistro SSE. movhpd trasladó valor doble precisión entre la memoria y el altopalabra cuádruple de SSE registro. Estas instrucciones son análogos a movlps y movhps y

Page 45: Lenguage asembler FASM_esp

tener las mismas reglas para operandos.movmskpd transfiere el bit más significativo de cada uno de los dos valores de doble precisiónen la ESS registrarse en bajas dos bits de un registro general. Esta instrucción es análogoa movmskps y tiene las mismas reglas para operandos.

movsd transfiere un valor de doble precisión entre la fuente y el operando de destino(Sólo la palabra baja de cuádruple se trasferred). Al menos uno de los operandos tiene que ser un SSEregistro, el segundo puede ser también un registro o memoria de 64 bits ubicación SSE.

Las operaciones aritméticas sobre los valores de precisión doble son: addpd, addsd, subpd, subsd,mulpd, mulsd, divpd, divsd, sqrtpd, sqrtsd, maxpd, maxsd, minpd, minsd, yson análoga a las operaciones aritméticas sobre los valores de precisión simple descritos en los anterioressección. Cuando el mnemónico termina con pd en lugar de ps, se realiza la operacióntambién en caminos de dos valores de doble precisión, pero las reglas para operandos son iguales. Cuándodel mnemónico termina con sd lugar de ss, el operando fuente puede ser una memoria de 64 bitsubicación o un registro SSE, el operando de destino debe ser un registro SSE y laoperación se realiza en valores de precisión doble, sólo bajos palabras cuádruples de los registros de la ESSse utilizan en este caso.

andpd, andnpd, orpd y xorpd realizar las operaciones lógicas en doble empaquetadovalores de precisión. Son análoga a SSE operaciones lógicas en una sola previsiónvalores y tienen las mismas reglas para operandos.

Página 49

2.1. LAS INSTRUCCIONES arquitectura x86 49

cmppd compara los valores de precisión doble relleno y vuelve y devuelve una máscararesultado en el operando de destino. Esta instrucción es análoga a cmpps y tienelas mismas reglas para operandos. cmpsd realiza la misma operación en doble precisiónvalores, sólo bajo palabra cuádruple de registro de destino se ve afectado, en este caso el operando de origenpuede ser una memoria de 64 bits o SSE registro. Variante con sólo dos operandos se obtienenuniendo la condición mnemónico de la tabla 2. 3 a la mnemónica cmp y luegofijar el pd o sd al final.

comisd y ucomisd comparar los valores de precisión doble y ajuste la ZF, PF yBanderas CF para mostrar el resultado. El operando de destino debe ser un registro SSE, la fuenteoperando puede ser un lugar de memoria de 128 bits o SSE registro.

shufpd mueve cualquiera de los dos valores de precisión doble de la operando de destinoen la palabra baja de cuádruple del operando destino, y cualquiera de los dos valores de laoperando de origen en la palabra cuádruple de alta del operando destino. Esta instrucción esanáloga a shufps y tiene las mismas reglas para el operando. Bit 0 de la tercera operandoselecciona el valor que ser trasladada desde el operando destino, 1 bit selecciona el valor deser trasladado desde el operando de origen, el resto de los bits están reservados y debe poner a cero.

unpckhpd realiza una desempaquetado de las palabras de alta quad desde el origen y destinooperandos, unpcklpd realiza una desempaquetado de las palabras bajas quad de la fuente yoperandos de destino. Son análoga a unpckhps y unpcklps, y tienen lamismas normas para los operandos.

cvtps2pd convierte los dos valores de punto flotante de precisión simple envasados a dos empaquetadovalores de punto flotante de precisión doble, el operando destino debe ser un registro SSE,el operando de origen puede ser una ubicación de memoria de 64 bits o SSE registro. cvtpd2ps conversoslos dos valores de punto flotante de doble precisión para llevar a embalados dos precisión simplevalores de punto flotante, el operando de destino debe ser un registro SSE, el operando fuentepuede ser una ubicación de memoria de 128 bits o SSE registro. cvtss2sd convierte la precisión simplevalor de coma flotante de doble precisión valor de coma flotante, el operando destinoDebe haber un registro SSE, el operando fuente puede ser una ubicación de memoria de 32 bits o SSE

Page 46: Lenguage asembler FASM_esp

registrarse. cvtsd2ss convierte la precisión doble valor de punto flotante de precisión simplevalor de coma flotante, el operando de destino debe ser un registro SSE, el operando fuentepuede ser la posición de memoria de 64 bits o SSE registro.

conversos cvtpi2pd embalados dos palabras enteros dobles en el doble del empaquetadoprecisión los valores de punto flotante, el operando de destino debe ser un registro SSE, laoperando de origen puede ser una ubicación de memoria de 64 bits o MMX registro. cvtsi2sd convierte unapalabra doble entero en un valor de coma flotante de precisión doble, el operando destinoDebe haber un registro SSE, el operando de la fuente puede ser una ubicación de memoria de 32 bits o 32 bitsregistro general. cvtpd2pi convierte lleno de doble precisión valores de punto flotante enenvasados dos palabras enteros dobles, el operando destino debe ser un registro MMX,el operando de origen puede ser un lugar de memoria de 128 bits o SSE registro. cvttpd2pirealiza la operación similar, excepto que el truncamiento se utiliza para redondear un valores de origena enteros, las reglas para operandos son iguales. cvtsd2si convierte un doble precisiónvalor de coma flotante en una palabra de doble entero, el operando de destino debe ser una

Página 50

50 CAPÍTULO 2. del conjunto de instrucciones

Registro general de 32 bits, el operando de origen puede ser una ubicación de memoria de 64 bits o SSEregistrarse. cvttsd2si realiza la operación similar, excepto que el truncamiento se usa paraen torno a un valor de origen a entero, las reglas para operandos son iguales.

cvtps2dq y cvttps2dq converso lleno de precisión simple valores de punto flotante aembalado cuatro palabras enteros dobles, almacenándolos en el operando destino. cvtpd2dqy converso cvttpd2dq lleno de doble precisión valores de punto flotante de empacado dosenteros de palabras dobles, almacenando el resultado en la palabra baja de cuádruple del operando destino.cvtdq2ps conversos embalados cuatro palabras enteros dobles para empacado único flotante de precisiónvalores de punto. Por todas estas operando destino instrucción debe ser un registro SSE, laoperando de origen puede ser un lugar de memoria de 128 bits o SSE registro. conversos cvtdq2pdembalado dos palabras enteros dobles de la palabra quad bajo del operando fuente al empaquetadodoble precisión los valores de punto flotante, el origen puede ser una ubicación de memoria de 64 bits oSSE registro, el destino tiene que ser SSE registro.

movdqa y movdqu transferir una doble palabra del operando quad que contiene números enteros envasadosdel operando fuente al operando destino. Al menos uno de los operandos tienen que estarun registro SSE, la segunda puede ser también un registro SSE o posición de memoria de 128 bits.Operandos de memoria para la instrucción movdqa deben estar alineados en el límite de 16 bytes,operandos para la instrucción movdqu no tienen que estar alineados.

movq2dq mueve el contenido del registro fuente MMX a la palabra baja del patio dedestino SSE registro. movdq2q mueve la palabra baja del patio de la fuente SSE registroal destino MMX registro.

movq2dq xmm0, mm1 ; pasar de MMX SSE registro a registromovdq2q mm0, XMM1 ; pasar de SSE regístrese para MMX registro

Todas las instrucciones MMX que operan en los números enteros de 64 bits para llevar (aquellos con mnemon­ics que empiezan por p) se extienden a operar en números enteros de 128 bits lleno ubicados en SSEregistros. Sintaxis adicional para estas instrucciones necesita un registro SSE donde MMXregistro que se necesitaba, y la ubicación de memoria de 128 bits o SSE registro donde 64 bitsse necesitaban ubicación de memoria o registro MMX. La excepción es la instrucción pshufw,que no permite la sintaxis extendida, pero tiene dos nuevas variantes: pshufhw y pshuflw,que permiten sólo la sintaxis extendida, y realizan la misma operación que en pshufwlas palabras de alta o baja en quad de operandos respectivamente. También el nuevo pshufd instrucciónse introduce, que realiza la misma operación que pshufw, pero en las palabras dobles

Page 47: Lenguage asembler FASM_esp

en lugar de palabras, permite sólo la sintaxis extendida.psubb xmm0, [esi] ; restar 16 bytes envasadoseax pextrw, xmm0,7; extraer más alto palabra en eax

paddq realiza la adición de palabras quad envasados, psubq realiza la sustracciónde palabras quad envasados, pmuludq realiza una multiplicación sin signo de palabras dobles bajasde cada uno correspondientes palabras cuádruples y devuelve los resultados en palabras quad lleno.Estas instrucciones siguen las mismas reglas para los operandos como las operaciones generales MMXse describe en 2.1.14.

Página 51

2.1. LAS INSTRUCCIONES arquitectura x86 51

pslldq y psrldq realizar el cambio lógico hacia la izquierda o derecha de la palabra doble quad en eloperando de destino por la cantidad de bytes especificados en el operando de origen. El destinooperando nación debe ser un registro SSE, operando fuente debe ser una de 8 bits inmediatavalor.

punpckhqdq intercala la palabra alta del patio del operando fuente y el altoquad palabra del operando destino y los escribe en el destino SSE registro.punpcklqdq intercala la palabra quad bajo del operando fuente y la palabra baja de cuádrupledel operando destino y los escribe en el destino SSE registro. La fuenteoperando puede ser un lugar de memoria de 128 bits o SSE registro.

tiendas movntdq envasados datos enteros de la ESS se registran en la memoria utilizando nopista temporal. El operando fuente debe ser un registro SSE, el operando destinodebe ser una ubicación de memoria de 128 bits. tiendas movntpd embalados valores de doble precisióndesde el SSE registro para la memoria utilizando una pista no temporal. Reglas para el operando son lamismo. tiendas movnti número entero de un registro general de memoria utilizando un no­temporalpista. El operando fuente debe ser un registro general de 32 bits, el operando de destinodebe ser una ubicación de memoria de 32 bits. tiendas maskmovdqu seleccionados bytes de la primeraoperando en una posición de memoria de 128 bits utilizando una pista no temporal. Ambos operandosdebe ser un registro de la ESS, el segundo operando selecciona bytes Wich del operando fuentese escriben en la memoria. La ubicación de la memoria se señala por DI (o EDI) inscribirse en elsegmento seleccionado por DS y no necesita estar alineado.

clflush escribe e invalida la línea caché asociada con la dirección de byteespecificada por el operando, que debe ser una ubicación de memoria de 8 bits.

lfence realiza una operación de serialización ocasión de toda carga instrucción de la memoriaque se publicaron antes de ella. mfence realiza una operación de serialización en toda la instrucciónaccediendo memoria que se publicará antes de ella, y por lo que combina las funciones de sfence(Descrito en la sección anterior) y las instrucciones lfence. Estas instrucciones no tienenoperandos.

02/01/17 instrucciones SSE3

Tecnología Prescott introdujo algunas nuevas instrucciones para mejorar el rendimiento deSSE y SSE2 ­ esta extensión se llama SSE3.

fisttp comporta como la instrucción FISTP y acepta los mismos operandos, la únicadiferencia es que siempre se utiliza truncamiento, independientemente de la modalidad de redondeo.

cargas movshdup en el operando destino el valor de 128 bits obtenida de la fuentevalor del mismo tamaño llenando el cada palabra quad con los dos duplicados del valoren su alta palabra doble. movsldup realiza la misma acción, salvo que se solapa con lavalores de palabras dobles bajas. El operando destino debe ser SSE registro, la fuente

Page 48: Lenguage asembler FASM_esp

operando puede ser registro SSE o posición de memoria de 128 bits.movddup carga el valor y la duplica en la palabra alta y baja de cuádruple fuente de 64 bits

del operando de destino. El operando destino debe ser SSE registro, la fuenteoperando puede ser registro SSE o ubicación de memoria de 64 bits.

Página 52

52 CAPÍTULO 2. del conjunto de instrucciones

lddqu es funcionalmente equivalente a movdqu con memoria como operando de origen, peropuede mejorar el rendimiento cuando el operando fuente cruza una frontera cacheline. Laoperando de destino tiene que ser SSE registro, el operando fuente debe ser de 128­bitsubicación.

addsubps realiza sola adición precisión de pares segunda y cuarta y únicasubstracion precisión de los primero y tercero pares de valores de coma flotante en los operandos.addsubpd realiza una suma de precisión doble de la segunda pareja y doble precisiónsustracción de la primera pareja de valores de coma flotante en el operando. haddps realizala suma de dos valores de precisión simple dentro de la palabra cada quad de origen yoperandos de destino, y almacena los resultados de dicha adición horizontal de los valores deoperando de destino en palabra baja de cuádruple del operando destino, y los resultados deel operando de origen en alta palabra cuádruple del operando destino. haddpd realiza laAdemás de los dos valores de doble precisión dentro de cada operando, y almacena el resultado deoperando de destino en palabra baja de cuádruple del operando destino, y el resultado deoperando fuente en alta palabra cuádruple del operando destino. Todos estos necesidad de instruccionesel operando destino sea SSE registro, operando de origen puede ser SSE Registrarse oPosición de memoria de 128 bits.

Monitor establece un rango de direcciones para el monitoreo de las tiendas de write­back. Se necesita sutres operandos sean EAX, ECX y EDX registran en ese orden. MWAIT espera a unwrite­back tienda para el rango de direcciones establecido por la instrucción monitor. Utiliza dosoperandos con parámetros adicionales, siendo el primero el EAX y segundo el registro ECX.

La funcionalidad de SSE3 se extiende aún más por el conjunto de SSE3 Suplementarioinstrucciones (SSSE3). Por lo general, siguen las mismas reglas para los operandos como toda laOperaciones MMX extendieron por SSE.

phaddw y phaddd realizan la horizontal adicional de los pares de valores adyacentesde la fuente y el operando de destino, y las tiendas de los importes en el destino(Sumas del operando de origen entran en la parte inferior del registro de destino). Operanen trozos de 16 bits o de 32 bits, respectivamente. phaddsw realiza la misma operación enfirmado valores empaquetados de 16 bits, pero el resultado de cada adición se satura. phsubw yphsubd realizar análogamente la sustracción horizontal de 16 bits o valor de 32 bits lleno,y phsubsw realiza la resta horizontal de los valores empaquetados de 16 bits firmados consaturación.

pabsb, pabsw y pabsd calcular el valor absoluto de cada uno firmado lleno firmaronvalor en el operando fuente y los almacena en el registro de destino. Ellos operadoren 8 bits, 16 bits y los elementos de 32 bits respectivamente.

multiplica pmaddubsw firmaron valores de 8 bits del operando fuente con el dientepondiente valores sin signo de 8 bits del operando de destino para producir intermediaValores de 16 bits, y cada par adyacente de los valores intermedios se añade entonces hori­talmente y esas sumas de 16 bits se almacenan en el operando destino.

multiplica pmulhrsw correspondientes enteros de 16 bits de la fuente y el destinooperando para producir valores de 32 bits intermedios, y los 16 bits junto al bit más altode cada uno de esos valores son entonces redondeado y embalado en el operando destino.

Page 49: Lenguage asembler FASM_esp

Página 53

2.1. LAS INSTRUCCIONES arquitectura x86 53

pshufb baraja los bytes en el operando destino de acuerdo a la máscara proporcionadopor el operando de origen ­ cada uno de los bytes en el operando de origen es un índice de la posición de destinopara el byte correspondiente en el destino.

psignb, psignw y psignd realizan la operación en 8 bits, enteros de 16 bits o 32 bitsen el operando de destino, en función de los signos de los valores en la fuente. Si el valoren fuente es negativo, el valor correspondiente en el registro de destino es negado, siel valor en la fuente es positivo, ninguna operación se realiza en el valor correspondiente selleva a cabo, y si el valor de fuente es cero, el valor se pone a cero en destino, también.

palignr anexa el operando fuente al operando destino para formar la inter­mediar en valor de dos veces el tamaño, y luego extrae en el destino registrar el 64 o128 bits que se haga alineados con el byte de desplazamiento especificado por el tercer operando, quedebe ser un valor inmediato de 8 bits. Esta es la única instrucción SSSE3 que tiene tresargumentos.

2.1.18 AMD 3DNow! instrucciones

El 3DNow! extensión agrega un nuevo instrucciones MMX a las descritas en 2.1.14 , yintroduce la operación sobre los valores de punto flotante en paquetes de 64 bits, cada uno compuesto por dossimple precisión los valores de punto flotante.

Estas instrucciones siguen las mismas reglas que las operaciones generales de MMX, el destinooperando nación debe ser un registro MMX, el operando fuente puede ser un registro MMXo ubicación de memoria de 64 bits. pavgusb calcula los promedios redondeadas de empaquetado sin signobytes. pmulhrw realiza una multiplicación firmada de las palabras llenas, alrededor del altopalabra de cada uno dobles resultados de palabras y las almacena en el operando destino. pi2fdconvierte empaquetados palabra doble enteros en valores de punto flotante para llevar. conversos pf2idembalado valores de punto flotante en palabras enteros dobles envasados utilizando el truncamiento. pi2fwconvierte palabra enteros empaquetados en valores de punto flotante envasados, sólo bajos palabras de cadapalabra doble en el operando fuente se utilizan. pf2iw convierte los valores de punto flotante envasadosen enteros de palabras llenas, los resultados se extienden a palabras dobles utilizando la extensión de signo.pfadd añade lleno valores de punto flotante. flotante PFSUB y pfsubr substratos embaladovalores de puntos, el primero sustrae valores de origen de los valores de destino, el sectorond uno sustrae valores de destino de los valores de origen. multiplica pfmul embaladosvalores de coma flotante. pfacc suma los valores de punto flotante de alta y baja de la des­operando tino, almacenando el resultado en la doble palabra baja de destino, y agregalos valores de punto flotante de alta y baja del operando fuente, almacenar el resultado en elalta doble palabra de destino. pfnacc sustrae el alto valor de coma flotante deel operando destino de la baja, almacenando el resultado en la doble palabra baja de des­tino, y sustrae el alto valor de coma flotante del operando fuente de labajo, almacenando el resultado en la alta doble palabra de destino. pfpnacc sustrae elalto valor de coma flotante del operando destino de la baja, almacenando el resultadoen la doble palabra baja de destino, y añade el punto va­ flotante de baja y altaues del operando fuente, almacenar el resultado en el alto doble palabra de destino.

Page 50: Lenguage asembler FASM_esp

Página 54

54 CAPÍTULO 2. del conjunto de instrucciones

pfmax y pfmin calculan los valores máximo y mínimo de valores de punto flotante. pswapdinvierte la palabra doble de alto y bajo del operando fuente. pfrcp devuelve un es­timaciones de los recíprocos de valores de punto flotante del operando fuente, pfrsqrtDevuelve una estimación de las raíces cuadradas recíprocas de valores de punto flotante de laoperando de origen, pfrcpit1 realiza la primera etapa en la iteración de Newton­Raphson pararefinar la aproximación recíproca producido por la instrucción pfrcp, pfrsqit1 realizael primer paso en la iteración de Newton­Raphson para refinar la raíz cuadrada recíproca APaproxi­ producida por la instrucción pfrsqrt, pfrcpit2 realiza el segundo paso finalen la iteración de Newton­Raphson para refinar la aproximación recíproca o la los desti­Rocal aproximación de la raíz cuadrada. pfcmpeq, pfcmpge y pfcmpgt comparan el empaquetadovalores de punto flotante y establece todos los bits o ceros todos los bits del dato correspodingen el operando de destino de acuerdo con el resultado de la comparación, primero comprueba silos valores son iguales, segundo cheques si el valor de destino es mayor o igual a la fuentevalor, tercero comprueba si el valor de destino es mayor que el valor de origen.

prefetch y prefetchw cargar la línea de datos de la memoria que contiene bytesespecificada por el operando en la memoria caché de datos, la instrucción prefetchw debe utilizarsecuando se espera que los datos en la línea de caché que ser modificado, de lo contrario la captación previala instrucción debe ser utilizado. El operando debe ser una ubicación de memoria de 8 bits.

femms realiza un ayuno clara del estado MMX. No tiene operandos.

02.01.19 Las instrucciones del modo de largos x86­64

Las arquitecturas AMD64 y EM64T (vamos a utilizar el nombre x86­64 común para ellosambos) ampliar el conjunto de instrucciones x86 para el procesamiento de 64 bits. Mientras legado y compatibilidadmodos bilidad utilizan el mismo conjunto de registros e instrucciones, el nuevo modo de largo se extiendelas operaciones de x86 a 64 bits y presenta varios registros nuevos. Puede activargenerar el código de este modo con la directiva use64.

Cada uno de los registros de propósito general se extiende a 64 bits y el conjunto ocho nuevosse agregan registros de propósito general y también ocho nuevos registros de la ESS. Consulte la tabla 2.4 parael resumen de los nuevos registros (sólo los que no se enumeran en la tabla 1. 9). Laregistros de propósito general de smallers tamaños son las porciones de orden inferior de los más grandes.Todavía se puede acceder a los registros de la ah, bh, dh ch y en el modo de tiempo, pero no puede utilizaren la misma instrucción con cualquiera de los nuevos registros.

En general, cualquier instrucción de arquitectura x86, lo que permitió de 16 bits o 32 bits, tamaños de operando en el modo de tiempo permite también los operandos de 64 bits. Los registros de 64 bits deberíaser usado para tratar en modo de largo, también se permite el direccionamiento de 32 bits, pero no esposible utilizar las direcciones basadas en registros de 16 bits. A continuación se presentan las muestras de nuevooperaciones posibles en el modo de tiempo en el ejemplo de la instrucción mov:

mov rax, r8 ; transferencia de registro general de 64 bitsmov al, [rbx]; memoria de transferencia dirigida por el 64­bit de registro

El modo largo utiliza también las direcciones basadas puntero de instrucciones, puede especificarlo

Página 55

Page 51: Lenguage asembler FASM_esp

2.1. LAS INSTRUCCIONES arquitectura x86 55

Tipo General SSE AVXBits 8 16 32 64 128 256

raxrcxrdxrbx

spl rspBPL rbpsil rsidil idiR8b r8w R8d r8 xmm8 ymm8R9b r9w R9D r9 xmm9 ymm9R10b r10w r10d r10 xmm10 ymm10R11b r11w r11d r11 xmm11 ymm11R12b r12w r12d r12 xmm12 ymm12R13b r13w r13d r13 xmm13 ymm13R14b r14w R14d r14 xmm14 ymm14R15b r15w r15d r15 xmm15 ymm15

Tabla 2.4: Nuevos registros en modo largo.

manualmente con el RIP símbolo especial de registro, pero tal abordar también es automáticamentegenerada por el ensamblador plana, ya que no hay 64 bits en el modo de direccionamiento absoluto de largo.Aún puede forzar el ensamblador de usar el 32­bit direccionamiento absoluto poniendo eloverride tamaño dword dirección dentro de los corchetes. También hay una excepción,donde el 64­bit direccionamiento absoluto es posible, es la instrucción mov con uno de losoperando siendo registro acumulador, y siendo segundo el operando de memoria. Para forzarel ensamblador de usar el 64­bit direccionamiento absoluto existe, utilice el operador tamaño QWORDdirección dentro de los corchetes. Cuando no se aplica operador de tamaño para abordar,ensamblador genera la forma óptima automáticamente.

mov [QWORD 0], rax; absoluta direccionamiento de 64 bitsmov [dword 0], r15d; absoluta direccionamiento de 32 bitsmov [0], rsi ; RIP­relativa direccionamiento automáticomov [rip + 3], sil ; RIP­relativa direccionamiento manual

También como los operandos inmediatos para las operaciones de 64 bits sólo los valores con signo de 32 bitsson posibles, con la única excepción de la instrucción mov con el operando destinoun 64­bit de registro de propósito general. Tratar de forzar la 64­bit inmediata con cualquierotra instrucción se producirá un error.

Si no se realiza ninguna operación en los registros de 32 bits generales en modo largo, la parte superior32 bits de los registros de 64 bits contienen se rellenan con ceros. Esto es a diferencia de la

Página 56

56 CAPÍTULO 2. del conjunto de instrucciones

Page 52: Lenguage asembler FASM_esp

operaciones en porciones de 16 bits o 8 bits de los registros, que conservan los bits superiores.Tres nuevas instrucciones de conversión de tipos están disponibles. El signo cdqe extiende el

palabra doble en EAX en palabra quad y almacena el resultado en el registro RAX. CQO signose extiende la palabra quad en RAX en palabra doble quad y almacena los bits adicionales en elRegistro RDX. Estas instrucciones no tienen operandos. signo movsxd amplía el dobleoperando fuente palabra, siendo o bien el registro de 32 bits o de la memoria, en el destino de 64 bitsoperando, que tiene que ser regístrate. No se necesita ninguna instrucción análoga para el ceroextensión, ya que se realiza de forma automática por cualquier operación en registros de 32 bits, como señalóen el párrafo anterior. Y las instrucciones MOVZX y MOVSX, conforme a lo generalregla, se puede utilizar con el operando de destino de 64 bits, lo que permite la extensión de byte o palabravalores en palabras cuádruples.

Toda la aritmética binaria y la enseñanza lógica se han promovido para permitir 64 bitsoperandos en modo largo. El uso de instrucciones aritméticas decimales en modo largo esprohibida.

Las operaciones de pila, como empuje y pop en el modo por defecto de largo a operandos de 64 bits yque no es posible utilizar operandos de 32 bits con ellos. El Pusha y popa se desautorizanen el modo de largo.

Los cerca de saltos y llamadas indirectas en modo por defecto de largo a operandos de 64 bits y esno es posible utilizar los operandos de 32 bits con ellos. Por otro lado, la indirectalejos saltos y llamadas permiten ningún operandos que se permitió en la arquitectura x86 yTambién se permite operando de memoria de 80 bits (aunque sólo EM64T parece aplicar talesvariante), con los primeros ocho bytes y la definición de los dos últimos bytes de compensación que especifican laselector. Los saltos lejanos directo y llamadas no están permitidos en modo largo.

Las instrucciones de E / S, adentro, afuera, entradas y salidas son las instrucciones excepcionales queno se extienden a aceptar operandos de palabra quad en modo largo. Pero el resto de la cadenaoperaciones son, y hay nuevas formas cortas movsq, cmpsq, scasq, lodsq y stosqintroducido para las variantes de las operaciones de cadena de elementos de cadena de 64 bits. El RSI yRegistros de IDI se utilizan por defecto para hacer frente a los elementos de cadena.

La EPA, LGS y las instrucciones lss se extienden a aceptar memoria de origen de 80 bitsoperando con registro de destino de 64 bits (aunque sólo EM64T parece poner en práctica talesvariante). Los lds y les están permitidas en el modo de tiempo.

Las instrucciones del sistema como lgdt que requerían el operando de memoria de 48 bits, enmodo de larga requiere el operando de la memoria de 80 bits.

El cmpxchg16b es el equivalente de 64 bits de instrucción CMPXCHG8B, utiliza el doblequad operando de memoria palabra y de 64 bits registra para realizar la operación análoga.

El fxsave64 y fxrstor64 de nuevas variantes de instrucciones fxsave y fxrstor,disponible sólo en el modo largo, que utilizan un formato diferente de área de almacenamiento con el fin dealmacenar algunos punteros en tamaño completo de 64 bits.

swapgs es la nueva instrucción, que intercambia los contenidos de GS registro y laKernelGSbase modelo específico registro (MSR dirección 0C0000102h).

syscall y sysret es el par de nuevas instrucciones que proporcionan la funcionalidadsimilar a SYSENTER y sysexit en modo largo, donde no está permitido el último par. La

Página 57

2.1. LAS INSTRUCCIONES arquitectura x86 57

sysexitq y mnemotécnicos sysretq proporcionan las versiones de 64 bits de sysexit y sysretinstrucciones.

Los mnemónicos rdmsrq y wrmsrq son las variantes de 64 bits de la RDMSR y wrmsrinstrucciones.

Page 53: Lenguage asembler FASM_esp

02/01/20 instrucciones SSE4

En realidad, hay tres diferentes conjuntos de instrucciones bajo el nombre SSE4. Intel de­firmado dos de ellos, SSE4.1 y SSE4.2, con este último se extiende la antigua en el plenoSSE4 de Intel establece. Por otro lado, la aplicación por AMD incluye sólo unos pocosinstrucciones de este conjunto, pero también contiene algunas instrucciones adicionales, que se llamanla SSE4a establecido.

Las instrucciones SSE4.1 su mayoría siguen las mismas reglas para operandos, como la ESS básicaoperaciones, por lo que requieren operando destino a ser SSE registro y operando fuentesiendo la posición de memoria de 128 bits o SSE registro, y algunas operaciones requieren una terceraoperando, el valor inmediato de 8 bits.

pmulld realiza una multiplicación firmada de las palabras y las tiendas de los dobles envasadosbajos dobles palabras de los resultados en el operando de destino. pmuldq realiza una dosmultiplicaciones firmados de las palabras dobles correspondientes en las palabras quad inferiores deoperandos, y almacena los resultados como palabras quad envasados en el registro de destino.pminsb y pmaxsb devolver los valores máximos de bytes firmados empaquetadas mínimo o,pminuw y pmaxuw devuelven el valor máximo de las palabras no firmados empaquetadas mínimo y,pminud, pmaxud, pminsd y retorno pmaxsd valores máximos de empaquetado mínimo opalabras sin firmar o firmados. Estas instrucciones complementan las instrucciones de computaciónembalado mínimo o máximo introducido por SSE.

ptest establece el indicador ZF a uno cuando el resultado de AND bit a bit de los dos operandoses cero, y pone a cero el ZF lo contrario. También establece la bandera CF a uno, cuando el resultado deY a nivel de bits del operando destino con el bit a bit NO del operando fuente escero, y pone a cero el CF lo contrario. pcmpeqq compara palabras quad lleno por la igualdad,y llena los elementos correspondientes del operando de destino, ya sea con unos o ceros,dependiendo del resultado de la comparación.

packusdw convierte embalado firmó dobles palabras de la fuente y el destinooperando en las palabras sin firmar utilizando saturación, y almacena la palabra resultante ochovalores en el registro de destino.

phminposuw encuentra la palabra valor sin signo mínimo en el operando fuente y lugaresen la palabra más bajo del operando de destino, el establecimiento de los bits superiores restantes dedestino a cero.

roundps, roundss, roundpd y roundsd realizar el redondeo de empaquetado o indivi­ual valor de coma flotante de precisión simple o doble, usando el modo de redondeo especificadopor el tercer operando.

xmm0 roundsd, xmm1,0011b; ronda hacia cero

Página 58

58 CAPÍTULO 2. del conjunto de instrucciones

DPPs calcula producto escalar de los valores de punto flotante de precisión simple lleno, es decirmultiplica los correspondientes pares de valores de la fuente y el operando de destino yluego suma los productos arriba. Los altos cuatro bits de la tercera 8­bit operando inmediatoel control de los productos que se calculan y llevados a la suma, y el bajo control de cuatro bits,en la que los elementos de destino del producto punto resultante se copia (los otros elementosestán llenos de cero). DPPD calcula producto escalar de lleno doble precisión flotantevalores de punto. Los bits 4 y 5 del tercer control operando, las cuales se calculan los productosy añadió, y los bits 0 y 1 de este control de valor, que los elementos en el registro destinodebe llenarse con el resultado. mpsadbw calcula múltiples sumas de las diferencias absolutasbytes de no firmados. El tercer controles de operando, con valor en bits 0­1, que de la

Page 54: Lenguage asembler FASM_esp

bloques de cuatro bytes en el operando de origen se toma para calcular una de las diferencias absolutas, ycon un valor en el bit 2, en el que de los dos primeros bloques de cuatro bytes en el destino de inicio del operandocálculo de múltiples sumas. La suma se calcula a partir de cuatro differencies absolutas entrelos bytes sin signo en el bloque de origen y de destino correspondiente, y cada ladosuma se calcula de la misma manera, pero teniendo los cuatro bytes de destino en elposicionar un byte después de la posición del bloque anterior. Los cuatro bytes de la fuentesiendo el mismo cada vez. De esta manera se calculan ocho sumas de differencies absolutos yalmacenan como valores de palabra envasados en el operando destino. Las instrucciones describenen este párrafo sigue las mismas reglas para operandos, como la instrucción roundps.

blendps, blendvps, blendpd y blendvpd condicionalmente copiar los valores deoperando de origen en el operando de destino, en función de los bits de la máscara proporcionadopor tercera operando. Si un bit de la máscara se establece, el elemento correspondiente de la fuente se copia enel mismo lugar en destino, de lo contrario esta posición es el destino se deja sin cambios.Las reglas para los dos primeros operandos son iguales, como para obtener instrucciones generales de la ESS.blendps y blendpd necesitan tercer operando a ser de 8 bits inmediata, y que operan envalores individuales o dobles de precisión, respectivamente. blendvps y blendvpd requieren tercerooperando a ser el registro XMM0.

blendvps XMM3, xmm7, xmm0; mezclar de acuerdo con máscara

pblendw condicionalmente copias elementos denominativos del operando fuente en el des­tino, dependiendo de los bits de máscara proporcionadas por tercer operando, que necesita estarValor inmediato de 8 bits. pblendvb condicionalmente copias elementos de bytes de la fuenteoperandos en destino, en función de máscara definidos por el tercer operando, que tieneser XMM0 registro. Estas instrucciones siguen las mismas reglas para los operandos como blendpsy blendvps instrucciones, respectivamente.

insertps inserta un único valor de coma flotante de precisión desde el lugar enoperando de origen especificado por los bits 6­7 del tercer operando en la ubicación en el registro destinoseleccionado por los bits 4­5 de la tercera operando. Además, el bajo cuatro bits de tercer operandocontrol, que los elementos de registro de destino se ponen a cero. Los dos primeros operandosseguir las mismas reglas que para el funcionamiento general SSE, el tercer operando debe ser de 8 bitsinmediata.

extractps extrae un único valor de coma flotante de precisión tomado de la ubicación

Página 59

2.1. LAS INSTRUCCIONES arquitectura x86 59

en fuente de operando especificado por dos bits bajos de tercer operando, y lo almacena en laoperando destino. El destino puede ser un valor de memoria de 32 bits o de propósito generalregistro, el operando fuente debe ser SSE registro, y el tercer operando debe serValor inmediato de 8 bits.

extractps edx, xmm3,3; extraer el valor más alto

pinsrb, pinsrd y pinsrq copiar un byte, palabra o palabra doble quad de la fuenteoperando en la ubicación del operando de destino determinado por el tercer operando. Laoperando de destino tiene que ser SSE registro, el operando de origen puede ser una ubicación de memoriade tamaño apropiado, o el registro de propósito general de 32 bits (pero de propósito general de 64 bitsregistrarse para pinsrq, que sólo está disponible en el modo de tiempo) y el tercer operando tieneser de 8 bits valor inmediato. Estas instrucciones complementan la instrucción pinsrwoperando en SSE destino registro, que fue presentado por SSE2.

pinsrd XMM4, eax, 1; insertar la palabra doble en segunda posición

Page 55: Lenguage asembler FASM_esp

pextrb, pextrw, pextrd y pextrq copiar un byte, palabra, palabra doble o cuádruple palabradesde la ubicación en el operando fuente especificada por tercer operando, en el destino. Laoperando fuente debe ser SSE registro, el tercer operando debe ser de 8 bits inmediata,y el operando de destino puede ser la ubicación de memoria de tamaño apropiado, o la de 32 bitsregistro de propósito general (pero 64­bit de registro de propósito general para pextrq, que es sólodisponible en el modo de largo). La instrucción pextrw con SSE registrarse como fuente ya estabaintroducido por SSE2, pero SSE4 se extiende para permitir operando de memoria como destino.

pextrw [ebx], xmm3,7; extraer más alto palabra en la memoria

pmovsxbw y pmovzxbw realizar extensión de signo o cero extensión de ocho valores de bytesdesde el operando de origen en valores de palabra envasados en el operando de destino, que tiene queser SSE registro. La fuente puede ser memoria de 64 bits o SSE registro ­ cuando se registra,sólo se utiliza su baja porción. pmovsxbd y pmovzxbd realizan extensión de signo o ceroextensión de los cuatro valores de bytes desde el operando de origen en los valores de palabra doble envasadosen el operando de destino, la fuente puede ser memoria de 32 bits o SSE registro. pmovsxbqy pmovzxbq realizan extensión de signo o cero extensión de los dos valores de bytes desde eloperando de origen en los valores de palabra quad envasados en el operando destino, el origen puede serMemoria de 16 bits o SSE registro. pmovsxwd y pmovzxwd realizan extensión de signo o ceroextensión de los cuatro valores de palabra desde el operando fuente en palabras dobles envasadosen el operando destino, el origen puede ser la memoria de 64 bits o SSE registro. pmovsxwqy pmovzxwq realizan extensión de signo o cero extensión de los dos valores de las palabras deel operando fuente en palabras quad envasados en el operando destino, el origen puede serMemoria de 32 bits o SSE registro. pmovsxdq y pmovzxdq realizan extensión de signo o ceroextensión de los dos valores de palabras dobles del operando fuente en palabras quad envasadosen el operando destino, el origen puede ser la memoria de 64 bits o SSE registro.

xmm0 pmovzxbq, palabra [si]; cero extender bytes a palabras quadpmovsxwq xmm0, XMM1 ; inscribirse extender palabras para Quad palabras

Página 60

60 CAPÍTULO 2. del conjunto de instrucciones

cargas movntdqa palabra doble quad desde el operando fuente al destino medianteuna pista no temporal. El operando destino debe ser registro SSE, y la fuenteoperando debe ser la posición de memoria de 128 bits.

El SSE4.2, se describe a continuación, añade no sólo algunas de las operaciones nuevas en un registro de la ESS,pero también introduce algunas completamente nuevas instrucciones operan propósito generalregistra solamente.

pcmpistri compara dos (longitud implícita) cuerdas cero de composición previstos en su fuentey operando destino y genera un índice almacenado a ECX; realiza pcmpistrmla misma comparación y genera una máscara almacenado para XMM0. pcmpestri compara doscuerdas de longitudes explícitas, con longitud proporcionada en EAX para el operando destinoy en EDX para el operando fuente, y genera un índice almacenado para ECX; pcmpestrmrealiza la misma comparación y genera una máscara almacenado para XMM0. La fuentey operando de destino sigue las mismas reglas que para las instrucciones generales de la ESS, la terceraoperando debe ser 8­bit valor inmediato determinar los detalles de operación realizada­ Consulte la documentación de Intel para obtener información sobre los detalles.

pcmpgtq compara palabras quad lleno, y llena los elementos correspondientes del destinooperando nación, ya sea con unos o ceros, dependiendo de si el valor de destinoes mayor que la de la fuente, o no. Esta instrucción sigue las mismas reglas paraoperandos como pcmpeqq.

Page 56: Lenguage asembler FASM_esp

crc32 acumula un valor CRC32 para el operando fuente comenzando con valor inicialproporcionada por el operando de destino, y almacena el resultado en el destino. A menos que en el largomodo, el operando de destino debe ser un registro de propósito general de 32 bits, y eloperando de origen puede ser un byte, palabra o palabra doble registro o posición de memoria. Enmodo largo del operando de destino también puede ser un registro de propósito general de 64 bits, yel operando fuente en tal caso puede ser un byte o palabra quad registro o posición de memoria.

eax crc32, dl ; acumular CRC32 en el valor de byteeax crc32, palabra [ebx]; acumular CRC32 en el valor de la palabrarax crc32, QWORD [rbx]; acumular CRC32 en el valor de la palabra quad

POPCNT calcula el número de bits puestos en el operando de origen, que puede ser de 16 bits,32­bit o 64­bit de registro de propósito general o memoria de localización, y almacena esta cuenta enel operando de destino, que tiene que ser registro del mismo tamaño que el operando de origen.La variante de 64 bits sólo está disponible en el modo de tiempo.

POPCNT ecx, eax ; bits de recuento establecen en 1

La extensión SSE4a, que también incluye la instrucción introducida por POPCNTSSE4.2, al mismo tiempo añade la instrucción lzcnt, que sigue la misma sintaxis,y calcula el recuento de liderar bits cero en el operando fuente (si el operando de origen estodos los bits a cero, el número total de bits en el operando de origen se almacena en destino).

extrq extraer la secuencia de bits de la palabra baja del patio de la ESS registro previstocomo primer operando y los almacena en el extremo inferior de este registro, llenando los bits restantesen la palabra baja de cuádruple con ceros. La posición de la cadena de bits y su longitud puede o

Página 61

2.1. LAS INSTRUCCIONES arquitectura x86 61

dispondrán de dos valores inmediatos de 8 bits como segundo y tercer operando, o por SSEregistrarse como segundo operando (y no hay tercer operando en tal caso), que debecontener el valor de posición en los bits 8­13 y la longitud de cadena de bits en los bits 0­5.

extrq xmm0,8,7 ; extraer 8 bits de la posición 7extrq xmm0, xmm5 ; bits extraídos definido por el registro

insertq escribe la secuencia de bits de la palabra de cuatro bajo del operando fuenteen la posición especificada en palabra baja de cuádruple del operando destino, dejando el otrobits de palabra baja del patio de destino intacto. La posición donde los bits deben ser escritosy la longitud de cadena de bits o bien puede estar provista de dos valores de 8 bits inmediatos comotercero y cuarto de operando, o por los campos de bits en el operando de origen (y sólo hay dosoperandos en este caso), que debe contener el valor de posición en los bits 72 a 77 y de longitud decadena de bits en los bits 64­69.

XMM1 insertq, xmm0,4,2; inserte 4 bits en la posición 2insertq XMM1, xmm0 ; insertar bits definidos por el registro

movntss y movntsd tienda valor de coma flotante de precisión simple o doble de lafuente SSE registro en 32 bits o ubicación de memoria de destino de 64 bits respectivamente, usandoinsinuación no temporal.

02/01/21 instrucciones AVX

Los Advanced Vector Extensions introducir instrucciones que son nuevas variantes de SSE

Page 57: Lenguage asembler FASM_esp

instrucciones, con nuevo esquema de codificación que permite la sintaxis extendida que tiene un destinooperando nación separada de todos los operandos de origen. También introduce 256 bits AVXregistros, que se extienden hasta las viejas 128 bits registros SSE. Cualquier instrucción AVX quepone algún resultado en SSE registro, pone cero bits en alta porción del registro AVXque lo contiene.

La versión AVX de instrucciones SSE tiene el nemotécnico obtenido anteponiendo SSEnombre de la instrucción con v. Para cualquier SSE instrucción aritmética que tenía un destinooperando también ser utilizado como uno de los valores de origen, la variante AVX tiene una nueva sintaxiscon tres operandos ­ el destino y las dos fuentes. El destino y la primera fuentepueden ser registros SSE y segunda fuente puede ser SSE registro o memoria. Si la operaciónse realiza en un solo par de valores, los bits restantes de primera fuente SSE registran soncopiado en el registro del destino.

vsubss xmm0, XMM2, XMM3 ; Restar dos flotadores de 32 bitsvmulsd xmm0, xmm7, QWORD [esi]; multiplicar dos flotadores de 64 bits

En caso de operaciones envasados, cada instrucción también puede operar en el tamaño de los datos de 256 bitscuando los registros AVX se especifican en lugar de los registros de ESS, y el tamaño de la memoriaoperando también se duplica a continuación.

Página 62

62 CAPÍTULO 2. del conjunto de instrucciones

vaddps ymm1, ymm5, yword [esi]; ocho sumas de pares de flotador 32 bits

Las instrucciones que operan sobre los tipos enteros empaquetados (en particular los que auricular puedelier había sido promovido de MMX SSE) también adquirió la nueva sintaxis con tresoperandos, sin embargo, son sólo puedan operar en Bolsa tipo 128­bits y por lo tantono puede utilizar todo los registros AVX.

vpavgw XMM3, xmm0, XMM2 ; promedio de enteros de 16 bitsvpslld XMM1, xmm0,1 ; cambiar palabras dobles izquierda

Si la versión SSE de la instrucción tenía una sintaxis con tres operandos, siendo el tercero unaun valor inmediato, la versión AVX de tal instrucción tiene cuatro operandos, conrestante inmediata el último.

vshufpd ymm0, ymm1, ymm2,10010011b; barajar carrozas de 64 bitsvpalignr xmm0, XMM4, xmm2,3 ; extraer byte alineado valor

La promoción de una nueva sintaxis de acuerdo con las reglas descritas anteriormente se ha aplicadoa todas las instrucciones de las extensiones SSE hasta SSE4, con las excepciones descritasa continuación.

instrucción vdppd ha sintaxis extendida a cuatro operans, pero no tiene una de 256 bitsversión.

El son unas pocas instrucciones, a saber vsqrtpd, vsqrtps, vrcpps y vrsqrtps, quepuede operar en tamaño de datos de 256 bits, pero conservó la sintaxis con sólo dos operandos,porque utilizan los datos de una sola fuente:

vsqrtpd ymm1, ymm0 ; poner raíces cuadradas en otro registro

De una manera similar vroundpd y vroundps conservan la sintaxis con tres operandos, laúltimo siendo un valor inmediato.

vroundps ymm0, ymm1,0011b; ronda hacia cero

Page 58: Lenguage asembler FASM_esp

También algunas de las operaciones sobre los enteros envasados mantuvieron su operando de dos o tres operandosintaxis mientras que siendo promovido a la versión AVX. En tal caso, estas instrucciones siguen ex­exacta­ mente las mismas reglas para operandos como sus contrapartes de la ESS (desde operaciones de empaquetadoenteros no tienen variantes de 256 bits en extensión AVX). Estos incluyen vpcmpestri,vpcmpestrm, vpcmpistri, vpcmpistrm, vphminposuw, vpshufd, vpshufhw, vpshuflw.Y hay más instrucciones que en AVX versiones mantienen exactamente la misma sintaxis paraoperandos como el de SSE, sin opciones adicionales: vcomiss, vcomisd,vcvtss2si, vcvtsd2si, vcvttss2si, vcvttsd2si, vextractps, vpextrb, vpextrw,vpextrd, vpextrq, vmovd, vmovq, vmovntdqa, vmaskmovdqu, vpmovmskb, vpmovsxbw,vpmovsxbd, vpmovsxbq, vpmovsxwd, vpmovsxwq, vpmovsxdq, vpmovzxbw, vpmovzxbd,vpmovzxbq, vpmovzxwd, vpmovzxwq y vpmovzxdq.

Las instrucciones de transferencia y conversión en su mayoría se han promovido para permitir 256 bitsoperandos de tamaño, además de la variante de 128 bits con una sintaxis idéntica a la de SSE

Página 63

2.1. LAS INSTRUCCIONES arquitectura x86 63

versión de la misma instrucción. Cada uno de los vcvtdq2ps, vcvtps2dq y vcvttps2dq,vmovaps, vmovapd, vmovups, vmovupd, vmovdqa, vmovdqu, vlddqu, vmovntps, vmovntpd,vmovntdq, vmovsldup, vmovshdup, vmovmskps y vmovmskpd hereda la sincronización de 128 bitsimpuesto desde Sur sin ningún cambio, y también permite una nueva forma con operandos 256 bitsen lugar de los 128 bits.

vmovups [edi], ymm6 ; almacenar datos no alineados 256 bits

vmovddup tiene la sintaxis de 128 bits idéntica a su versión SSE, y también tiene unaVersión de 256 bits, que almacena los duplicados de la palabra quad más bajo de la fuenteoperando en la mitad inferior del operando de destino, y en la mitad superior de destinolos duplicados de la palabra cuádruple baja de la mitad superior de la fuente. Tanto la fuente yoperandos de destino deben entonces ser valores de 256 bits.

vmovlhps y vmovhlps sólo tienen versiones de 128 bits, y cada tres operandos,que todos deben ser registros SSE. vmovlhps copia dos valores de precisión simple de labajo palabra quad de segunda fuente regístrese para la palabra alta del patio del registro de destino,y copia la palabra baja quad de primera fuente registran en la palabra quad bajo de destinoregistrarse. vmovhlps copia dos valores de precisión simple de la palabra cuádruple de alta del segundoregistro de origen a la palabra baja de cuádruple del registro de destino, y copia el alta quadpalabra de primera fuente registra en la palabra cuádruple de alta de registro de destino.

vmovlps, vmovhps, vmovlpd y vmovhpd tiene sólo versiones de 128 bits y su sintaxisvaría dependiendo de si el operando de memoria es un destino o de origen. Cuando la memoriaes el destino, la sintaxis es idéntica a la de la instrucción SSE equivalente, y cuandola memoria es la fuente, la instrucción requiere tres operandos, los dos primeros son los registros de la ESSy la tercera memoria de 64 bits. El valor puesto en destino es entonces el valorcopiado de primera fuente, ya sea con la palabra baja o alta quad sustituido por valor desegunda fuente (el operando de la memoria).

vmovhps [esi], xmm7 ; almacenar media superior a la memoriavmovlps xmm0, xmm7, [ebx]; baja de la memoria, descanso de registro

vmovss y vmovsd tienen una sintaxis idéntica a sus equivalentes de la ESS mientras unode los operandos es la memoria, mientras que las versiones que operan exclusivamente en registros requierentres operandos (siendo cada registro SSE). El valor almacenado en destino es entonces lavalor copiado de primera fuente con el elemento de datos más baja reemplazado con el valor más bajodesde la segunda fuente.

Page 59: Lenguage asembler FASM_esp

vmovss XMM3, [edi] ; baja de la memoria, descansar puesto a cerovmovss xmm0, XMM1, XMM2 ; un valor de XMM2, tres de XMM1

vcvtss2sd, vcvtsd2ss, vcvtsi2ss y vcvtsi2d utilizan la sintaxis de tres operando,donde destino y la primera fuente son siempre los registros de la ESS y la segunda fuentesigue las mismas reglas y la fuente en la sintaxis de instrucciones SSE equivalente. Lavalor almacenado en destino es entonces el valor copiado de primera fuente con datos más bajoelemento reemplazado con el resultado de la conversión.

Página 64

64 CAPÍTULO 2. del conjunto de instrucciones

XMM4 vcvtsi2sd, XMM4, ecx; Entero de 32 bits a 64 bits floatxmm0 vcvtsi2ss, xmm0, rax; Entero de 64 bits a 32 bits float

vcvtdq2pd y vcvtps2pd permiten la misma sintaxis que sus equivalentes de la ESS, más elnuevas variantes con AVX registro como destino y SSE registro o memoria de 128 bits comofuente. Análogamente vcvtpd2dq, vcvttpd2dq y vcvtpd2ps, además de la variantecon una sintaxis idéntica a la versión SSE, permitir una variante con SSE registro como destinoy registro AVX o de memoria de 256 bits como fuente.

vinsertps, vpinsrb, vpinsrw, vpinsrd, vpinsrq y vpblendw utilizar una sintaxis concuatro operandos, donde destino y primera fuente tienen que ser los registros de la ESS, y el terceroy cuarto operando sigue las mismas reglas que el segundo y tercer operando en la sintaxis deinstrucciones SSE equivalente. Valor almacenado en destino es el valor copiado de primerafuente con algunos elementos de datos sustituido con valores extraídos de la segunda fuente,de forma análoga a la operación de las correspondientes instrucciones SSE.

xmm0 vpinsrd, xmm0, eax, 3; insertar la palabra doble

vblendvps, vblendvpd y vpblendvb utilizar una sintaxis nueva con cuatro operandos de registro:destino, dos fuentes y una máscara, en segunda fuente también puede ser un operando en memoria.vblendvps y vblendvpd tener la variante de 256 bits, donde operandos son registros o AVXMemoria de 256 bits, así como la variante de 128 bits, que tiene ser operandos registra SSE oMemoria de 128 bits. vpblendvb tiene sólo una variante de 128 bits. Valor almacenado en destino esel valor copiado de la primera fuente con algunos elementos de datos reemplazados, de acuerdo conenmascarar, por los valores de la segunda fuente.

vblendvps ymm3, ymm1, ymm2, ymm7; mezclar de acuerdo con máscara

vptest permite la misma sintaxis que su versión SSE y también cuenta con una versión de 256 bits,con ambos operandos duplicado su tamaño. También hay dos nuevas instrucciones, y vtestpsvtestpd, que realizan pruebas análogas, pero sólo de los bits de signo de las correspondientes solaprecisión o valores de doble precisión, y establecer la ZF y CF en consecuencia. Siguenlas mismas reglas de sintaxis como vptest.

ymm0 vptest, yword [ebx]; valores de 256 bits de pruebavtestpd xmm0, XMM1 ; bits de signo prueba de carrozas de 64 bits

vbroadcastss, vbroadcastsd y vbroadcastf128 de nuevas instrucciones, quetransmitir el elemento de datos definido por el operando de origen en todos los elementos de corresponingtamaño en el registro de destino. vbroadcastss necesita ser fuente de memoria de 32 bits ydestino sea cualquiera SSE o AVX registro. vbroadcastsd requiere memoria de 64 bits

Page 60: Lenguage asembler FASM_esp

como fuente, y AVX registro como destino. vbroadcastf128 requiere memoria de 128 bitscomo fuente, y AVX registro como destino.

vbroadcastss ymm0, dword [eax]; conseguir ocho ejemplares de valor

Página 65

2.1. LAS INSTRUCCIONES arquitectura x86 65

vinsertf128 es la nueva instrucción, que tiene cuatro operandos. El destinoy la primera fuente tiene que ser registros AVX, segunda fuente puede ser SSE Registrarse o 128­posición de memoria de bits y cuarto operando debe ser un valor inmediato. Almacena endestino, el valor obtenido mediante la adopción de contenido de primera fuente y la sustitución de uno de susUnidades de 128 bits con valor de la segunda fuente. El bit más bajo del cuarto especifica de operandoen el que la posición de que la sustitución se hace (ya sea 0 o 1).

vextractf128 es la nueva instrucción con tres operandos. Las necesidades de destinoser registro SSE o posición de memoria de 128 bits, la fuente debe ser AVX registro, yel tercer operando debe ser un valor inmediato. Extrae en destino uno delas unidades de 128 bits de la fuente. El bit más bajo del tercer operando especifica, cuya unidad esextraído.

vmaskmovps y vmaskmovpd son las nuevas instrucciones con tres operandos quealmacenar selectivamente en destino los elementos de segunda fuente en función de la señaltrozos de elementos correspondientes de primera fuente. Estas instrucciones pueden operar endatos, ya sea de 128 bits (registros SSE) o datos de 256 bits (registros AVX). De cualquier destinoo segunda fuente tiene que ser una ubicación de memoria de tamaño apropiado, los otros dos operandosdebe ser registros.

vmaskmovps [edi], xmm0, xmm5; tienda condicionalmentevmaskmovpd ymm5, ymm0, [esi]; carga condicional

vpermilpd y vpermilps son las nuevas instrucciones con tres operandos que per­silenciar los valores de la primera fuente de acuerdo a los campos de control de origen y segundoponer el resultado en el operando destino. Se permite usar cual­ tres registros SSE otres AVX registra como sus operandos, la segunda fuente puede ser una memoria de igual tamañoa los registros utilizados. En forma alternativa, la segunda fuente puede ser un valor inmediato yentonces la primera fuente puede ser una ubicación de memoria del tamaño igual al registro de destino.

vperm2f128 es la nueva instrucción con cuatro operandos, que selecciona bloques de 128 bitsde datos de punto flotante de primera y segunda fuente de acuerdo con los campos de bits decuarto operando, y los almacena en el destino. Destino y primera fuente deben serAVX registra, segunda fuente puede ser registro AVX o área de memoria de 256 bits, y cuartooperando debe ser un valor inmediato.

vperm2f128 ymm0, ymm6, ymm7,12h; permutar bloques de 128 bits

instrucción vzeroall establece todo el AVX registra a cero. vzeroupper coloca la parte superiorPorciones de 128 bits de todos AVX registra a cero, dejando la ESS registra intacta. Estosnuevas instrucciones toman ningún operando.

vldmxcsr y vstmxcsr son las versiones AVX de ldmxcsr e instrucciones stmxcsr.Las reglas para sus operandos se mantienen sin cambios.

01/02/22 instrucciones AVX2

La extensión AVX2 permite todas las instrucciones AVX operan en números enteros para llevar autilizar los tipos de datos de 256 bits, e introduce algunas nuevas instrucciones también.

Page 61: Lenguage asembler FASM_esp

Página 66

66 CAPÍTULO 2. del conjunto de instrucciones

Las instrucciones AVX que operan en números enteros envasados y sólo tenía una de 128 bits variablehormigas, se han complementado con las variantes de 256 bits, y por lo tanto sus reglas de sintaxis se convirtióanáloga a las instrucciones AVX operan en Bolsa tipo de punto flotante.

vpsubb ymm0, ymm0, [esi] ; restar 32 bytes envasadosvpavgw ymm3, ymm0, ymm2 ; promedio de enteros de 16 bits

Sin embargo, hay algunas instrucciones que no han sido equipados con el de 256 bits variablehormigas. vpcmpestri, vpcmpestrm, vpcmpistri, vpcmpistrm, vpextrb, vpextrw, vpextrd,vpextrq, vpinsrb, vpinsrw, vpinsrd, vpinsrq y vphminposuw no se ven afectados porAVX2 y permitir que sólo los operandos 128 bits.

Las instrucciones de desplazamiento para llevar, lo que permitió el tercer operando especificando cantidad deser registro SSE o posición de memoria de 128 bits, utilice las mismas reglas para el tercer operandoen su variante de 256 bits.

vpsllw ymm2, ymm2, XMM4 ; palabras desviación a la izquierdavpsrad ymm0, ymm3, xword [ebx]; cambiar palabras dobles derecha

También hay nuevas instrucciones de desplazamiento empaquetados con estándar de tres operando AVX sin­impuesto, que cambiar cada elemento de primera fuente por la cantidad especificada en el correspondienteelemento de la segunda fuente, y almacenar los resultados en destino. vpsllvd desplaza 32 bitselementos fueron, vpsllvq desplaza elementos de 64 bits a la izquierda, vpsrlvd desplaza elementos de 32 bits derechológicamente, vpsrlvq desplaza elementos de 64 bits a la derecha de manera lógica y vpsravd desplaza 32 bits elementomentos derecho aritméticamente.

El inicio de sesión se extienden y cero extender instrucciones, que en AVX versiones permitieron fuenteoperando a ser registro SSE o una memoria de tamaño específico, en la nueva necesidad variante de 256 bitsla memoria de ese tamaño se duplicó o SSE registrarse como fuente y AVX registro como destino.

ymm0 vpmovzxbq, dword [esi] ; bytes a palabras quad

También vmovntdqa se ha actualizado con la variante de 256 bits, lo que permite transferirValor de 256 bits de memoria para AVX registro, necesita la dirección de memoria que se ajusta a32 bytes.

vpmaskmovd y vpmaskmovq son las nuevas instrucciones con sintaxis idéntica avmaskmovps o vmaskmovpd, y realiza la operación análoga en empacado de 32 bitso valores de 64 bits.

vinserti128, vextracti128, vbroadcasti128 y vperm2i128 son la nueva in­construcciones con sintaxis idénticas a vinsertf128, vextractf128, vbroadcastf128 yvperm2f128 respectivamente, y realizar operaciones análogas en bloques de 128 bits dedatos enteros.

instrucciones vbroadcastss y vbroadcastsd se han ampliado para permitir SSEregistrarse como operando de origen (que en AVX sólo podía ser un recuerdo).

vpbroadcastb, vpbroadcastw, vpbroadcastd y vpbroadcastq son la nueva in­trucciones que emiten el byte, palabra, palabra doble o cuádruple palabra de la fuente

Page 62: Lenguage asembler FASM_esp

Página 67

2.1. LAS INSTRUCCIONES arquitectura x86 67

operando en todos los elementos de corresponing tamaño en el registro de destino. El destinoción operando puede ser o SSE o AVX registro, y el operando de origen puede ser SSERegistrarse o de memoria de tamaño igual al tamaño del elemento de datos.

vpbroadcastb ymm0, byte [ebx]; obtener 32 bytes idénticos

vpermd y vpermps de nuevas instrucciones de tres operandos, que utilizan cada uno de 32 bitselemento de primera fuente como un índice de elemento en segunda fuente que se copia endestino en la posición correspondiente al elemento que contiene índice. El destino yprimera fuente tiene que ser registros AVX, y la segunda fuente puede ser AVX registro oMemoria de 256 bits.

vpermq y vpermpd de nuevas instrucciones de tres operandos, que utilizan los índices de 2 bitsdesde el valor inmediato especificado como tercer operando para determinar qué elemento dealmacén de origen en la posición dada en destino. El destino tiene que ser AVX registro,fuente puede ser AVX registro o memoria de 256 bits, y el tercer operando debe ser de 8 bitsvalor inmediato.

La familia de las nuevas instrucciones que realizan reúnen operación tiene una sintaxis especial, comoen su operando de memoria que utilizan el modo de que es única para ellos abordar. La basede dirección puede ser un registro de propósito general de 32­bit o 64­bit (este último sólo en largomodo), y el índice (posiblemente multiplicado por valor de la escala, como en el tratamiento estándar) esespecificada por SSE o AVX registro. Es posible utilizar solamente índice sin base y cualquierdesplazamiento numérico puede ser añadido a la dirección. Cada una de esas instrucciones tomatres operandos. En primer operando es el registro de destino, segundo operando es la memoriase dirigió con un índice de vectores y tercer operando es un registro que contiene la máscara. La mayor partebit más significativo de cada elemento de máscara determina si un valor se carga desdememoria en elemento correspondiente de destino. La dirección de cada elemento para cargarse determina mediante el elemento correspondiente de registro de índice en el operando de memoriapara calcular la dirección final con base y desplazamiento dado. Cuando el registro de índicecontiene menos elementos que los registros de destino y máscara, los elementos superiores dedestino se pone a cero. Después de que el valor está cargado exitosamente, el elemento correspondienteen la máscara de registro se establece en cero. El destino, el índice y la máscara de todos deben ser distintosregistros, no se les permite usar el mismo registro en dos papeles diferentes.

vgatherdps cargas precisión simple valores de los puntos abordados por los índices de 32 bits flotante.El destino, el índice y la máscara de todos los registros deben ser del mismo tipo, ya sea SSE oAVX. Los datos dirigida por el operando de memoria es de 32 bits de tamaño.

vgatherdps xmm0, [eax + XMM1], XMM3 ; reunir cuatro carrozasvgatherdps ymm0, [ebx + ymm7 * 4], ymm3; reunir ocho carrozas

vgatherqps cargas precisión simple valores de los puntos abordados por los índices de 64 bits flotante.El destino y la máscara deben estar siempre los registros de la ESS, mientras que el registro de índice puede serya sea SSE o AVX registro. Los datos dirigida por el operando de memoria es de 32 bits de tamaño.

vgatherqps xmm0, [XMM2], XMM3 ; reunir dos flotadoresvgatherqps xmm0, [ymm2 + 64], XMM3 ; reunir cuatro carrozas

Página 68

Page 63: Lenguage asembler FASM_esp

68 CAPÍTULO 2. del conjunto de instrucciones

cargas vgatherdpd valores de coma flotante de doble precisión dirigidas por los índices de 32 bits.El registro de índice debe ser siempre SSE registro, el destino y la máscara deben serdos registros del mismo tipo, ya sea SSE o AVX. Los datos tratados por la memoriaoperando es de 64 bits de tamaño.

vgatherdpd xmm0, [ebp + XMM1], XMM3 ; reunir dos doblesymm0 vgatherdpd, [XMM3 * 8], ymm5 ; reunir cuatro dobles

cargas vgatherqpd valores de coma flotante de doble precisión dirigidas por los índices de 64 bits.El destino, el índice y la máscara de todos los registros deben ser del mismo tipo, ya sea SSE oAVX. Los datos dirigida por el operando de memoria es de 64 bits de tamaño.

valores vpgatherdd y vpgatherqd carga de 32 bits abordadas ni en 32­bit o 64­bitíndices. Siguen las mismas reglas que vgatherdps y vgatherqps respectivamente.

valores vpgatherdq y vpgatherqq carga de 64 bits abordadas ni en 32­bit o 64­bitíndices. Siguen las mismas reglas que vgatherdpd y vgatherqpd respectivamente.

01/02/23 conjuntos auxiliares de instrucciones computacionales

Hay un número de extensiones de conjuntos de instrucciones adicionales relacionados con AVX. Se intro­ducir instrucciones nuevo vector (ya veces también a sus equivalentes SSE que utilizan clásicocodificación de instrucciones), e incluso algunas nuevas instrucciones de funcionamiento en los registros generalesque utilizan la codificación AVX­como la de permitir la sintaxis extendida con destino separaday operandos de origen. El soporte de CPU para cada uno de estos conjuntos de instrucciones debe serdeterminada por separado.

La extensión AES proporciona un conjunto especializado de instrucciones para el propósito decálculos criptográficos definidos por Advanced Encryption Standard. Cada uno de estosinstrucción, tiene dos versiones: la AVX uno y el otro con la sintaxis SSE­asíclásico utiliza codificación. Consulte los manuales de Intel para los detalles de la operación de estosinstrucciones.

aesenc y aesenclast realizan una sola ronda de cifrado AES en datos deprimera fuente con una clave de vuelta de la segunda fuente, y el resultado de tienda en destino. Ladestino y primera fuente son registros de la ESS, y la segunda fuente pueden ser SSE registroo una memoria de 128 bits. Las versiones de estas instrucciones AVX, vaesenc y vaesenclast,utilizar la sintaxis con tres operandos, mientras que la versión SSE­como sólo tiene dos operandos,con primer operando ser a la vez el destino y primera fuente.

aesdec y aesdeclast realizan una sola ronda de AES descifrado de los datos delprimera fuente con una clave de vuelta desde segunda fuente. Las reglas de sintaxis para ellos y suVersiones AVX son los mismos que para aesenc.

aesimc realiza la transformación InvMixColumns del operando fuente y almacénel resultado en el destino. Tanto aesimc y uso vaesimc sólo dos operandos, destinosiendo SSE registro, y las fuentes esté SSE Registrarse o posición de memoria de 128 bits.

aeskeygenassist es una instrucción de ayudante para generar la clave de ronda. Necesita tresoperandos: destino de ser SSE registro, las fuentes esté SSE Registrarse o de memoria de 128 bits,

Página 69

2.1. LAS INSTRUCCIONES arquitectura x86 69

Page 64: Lenguage asembler FASM_esp

y tercer operando siendo de 8 bits valor inmediato. La versión de esta instrucción AVXutiliza la misma sintaxis.La extensión CLMUL introduce una sola instrucción, pclmulqdq, y su AVX

versión también. Esta instrucción realiza una multiplicación carryless de dos valores de 64 bitsseleccionado de primera y segunda fuente de acuerdo con los campos de bits en un valor inmediato.El destino y la primera fuente son registra SSE, segunda fuente es registro SSE o 128­marcas, y un valor inmediato se ofrece como último operando. vpclmulqdq toma de cuatrooperandos, mientras pclmulqdq lleva sólo tres operandos, a la primera sirve tantoel papel de destino y la primera fuente.

La extensión FMA (Fused Multiply­Add) introduce instrucciones adicionales AVXque realizar la multiplicación y la suma como una sola operación. Cada uno tiene tresoperandos, primero uno que sirve tanto el papel de destino y la primera fuente, y la siguientelos siendo la segunda y tercera fuente. Se obtiene el mnemónico de instrucción FMAanexando al prefijo vf: primero m o nm para seleccionar si resultado de la multiplicacióndebe tomarse como está o negada, entonces o bien añadir o sub para seleccionar si tercer valor seser añadido al producto o restado del producto, entonces o bien 132, 213 o 231para seleccionar qué operandos fuente se multiplican y que se añade uno o restó,y finalmente el tipo de datos en los que opera la instrucción, ya sea ps, pd, ss o SD.Como lo fue con instrucciones SSE promovidos a AVX, instrucciones de uso en caminos devalores de puntos flotantes permiten sintaxis 128 bits o 256 bits, en la antigua todos los operandos sonSSE registra, pero el tercero también puede ser una memoria de 128 bits, en este último caso los operandosson registros AVX y la tercera también pueden ser una memoria de 256 bits. Las instrucciones quecomputar sólo un resultado de coma flotante necesita operandos ser registros SSE, y el tercerooperando también puede ser un recuerdo, ya sea de 32 bits para precisión simple o de 64 bits de doblede precisión.

vfmsub231ps ymm1, ymm2, ymm3 ; multiplicar y restarvfnmadd132sd xmm0, xmm5, [ebx] ; multiplicar, negar y añadir

Además de las instrucciones creadas por la regla descrita anteriormente, hay familiasde instrucciones con mnemónicos de partida, ya sea con o vfmaddsub vfmsubadd, seguidopor cualquiera de las 132, 213 o 231 y luego o bien ps o pd (la operación siempre debe estar envalores envasados en este caso). Se añaden al resultado de la multiplicación o restar deque dependiendo de la posición del valor en los datos embalado ­ instrucciones del vfmaddsubgrupo agrega cuando la posición es impar y restar cuando la posición es aún, instruccionesdel grupo vfmsubadd añadir cuando la posición es aún y cuando el subtstractposición es impar. Las reglas para operandos son los mismos que para otras instrucciones FMA.

Las instrucciones FMA4 son similares a FMA, pero el uso de la sintaxis con cuatro operandos ypor que permitan destino sea diferente a todas las fuentes. Sus mnemotécnicos son idénticosa las instrucciones FMA con el 132, 213 o 231 cortado, como tener destino separadaoperando hace que tal selección de los operandos superfluos. La multiplicación es siemprerealizado en los valores de la primera y segunda fuente, y luego el valor de tercera

Página 70

70 CAPÍTULO 2. del conjunto de instrucciones

se añade o sustrae fuente. Cualquiera de segunda o tercera fuente puede ser un operando de la memoria,y las reglas para el tamaño de los operandos son los mismos que para obtener instrucciones FMA.

vfmaddpd ymm0, ymm1, [esi], ymm2; multiplicar y sumarvfmsubss xmm0, XMM1, XMM2, [ebx]; multiplicar y restar

Page 65: Lenguage asembler FASM_esp

La extensión F16C consta de dos instrucciones, vcvtps2ph y vcvtph2ps, queconvertir valores de punto único entre la precisión y la media de precisión (el 16­bit flotante flotanteformato de punto ing). vcvtps2ph tres operandos: destino, de origen y de redondeocontroles. El tercer operando es siempre una inmediata, la fuente es o bien SSE o AVXregistro que contiene los valores de precisión simple, y el destino es el registro SSE o broria, el tamaño de la memoria es de 64 bits cuando la fuente es SSE registro y 128 bits cuandola fuente es AVX registro. vcvtph2ps toma dos operandos, el destino que puede serSSE o AVX registro, y la fuente que es registro SSE o la memoria con el tamaño de laun medio de tamaño de destino del operando.

La extensión AMD XOP introduce una serie de nuevas instrucciones vectoriales con en­la codificación y la sintaxis análoga a las instrucciones AVX. vfrczps, vfrczss, vfrczpd yvfrczsd extraer partes fraccionarias de valores simples o dobles de precisión, todos tomandos operandos. Las operaciones envasados permitir ya sea registro SSE o AVX como destino,para los otros dos que tiene que ser SSE registro. Fuente puede registrar del mismo tipo quedestino, o la memoria de tamaño apropiado (de 256 bits para el destino de ser AVX registro,128­bit para la operación embalado con destino siendo registro SSE, 64­bit para la operaciónen un valor de aislamiento de doble precisión y de 32 bits para la operación en una sola precisión solitariovalor).

vfrczps ymm0, [esi] ; cargar partes fraccionarias

vpcmov copias bits desde el primer o segunda fuente en destino en función delos valores de los bits correspondientes en el cuarto operando (el selector). Si el bit enselector está establecido, el bit correspondiente de la primera fuente se copia en la misma posiciónen destino, de lo contrario el bit de segunda fuente se copia. De cualquier segunda fuente opuede ser la posición de memoria de selección, 128 bits o 256 bits, dependiendo de si los registros de la ESSo registros AVX se especifican como los otros operandos.

vpcmov xmm0, XMM1, XMM2, [ebx]; selector en la memoriavpcmov ymm0, ymm5, [esi], ymm2; fuente en la memoria

La familia de instrucciones de comparación empaquetados tomar cuatro operandos, el destino yprimero las fuentes esté SSE registro, segunda fuente de ser SSE registro o memoria de 128 bitsy el cuarto operando ser un valor inmediato que define el tipo de comparación. Lainstrucción mnemónica o se crea añadiendo a vpcom tiene el prefijo sea bo ub a com­pare palabras firmaron o bytes sin signo, w o sus fechas para comparar con o sin signo, d o uda comparar con o sin signo doble palabras, q o uq para comparar con o sin signopalabras cuádruples. Los valores respectivos de la primera y la segunda fuente se comparan y se

Página 71

2.1. LAS INSTRUCCIONES arquitectura x86 71

el elemento de datos correspondiente en destino se ha configurado como todos unos o ceros de­en espera del resultado de la comparación. El cuarto operando tiene que especificar uno de los ochotipos de comparación (tabla 2 ) 0.5 . Todas estas instrucciones también tienen variantes con sólo tresoperandos y el tipo de comparación codificada en el nombre de la instrucción mediante la inserción dedel mnemónico comparación después vpcom.

vpcomb xmm0, XMM1, xmm2,4 ; prueba de bytes igualesxmm0 vpcomgew, XMM1, [ebx] ; comparar palabras firmados

Código mnemotécnico Descripción

Page 66: Lenguage asembler FASM_esp

0 lt menos que1 le menor o igual2 gt más que3 ge mayor o igual4 eq igual5 neq no es igual6 falso falso7 verdadero verdadero

Tabla 2.5: comparaciones XOP.

vpermil2ps y vpermil2pd fijan los elementos de registro de destino a cero o a unavalor seleccionado de primera o segunda fuente en función de los campos de bits correspondientes deel cuarto operando (el selector) y el valor inmediato proporcionada en quinto operando.Consulte los manuales de AMD para la explicación detallada de la operación realizada porestas instrucciones. Cada uno de los cuatro primeros operandos pueden ser un registro, y, o bien segundofuente o selector pueden ser ubicación de memoria, 128 bits o 256 bits, dependiendo de siSSE registra o registros AVX se utilizan para los otros operandos.

vpermil2ps ymm0, ymm3, ymm7, ymm2,0; permutar de dos fuentes

vphaddbw añade pares de bytes firmados adyacentes para formar valores de 16 bits y los almacenaen las mismas posiciones en destino. vphaddubw hace lo mismo, pero trata a los bytescomo sin firmar. vphaddbd y suma vphaddubd todos los bytes (ya sea con o sin signo) encada bloque de cuatro bytes a los resultados de 32 bits, vphaddbq y suma vphaddubq todos los bytes en cadabloque de ocho bytes de los resultados de 64 bits, vphaddwd y vphadduwd añadir pares de palabras de 32resultado de los bits, vphaddwq y suma vphadduwq Todas las palabras en cada bloque de cuatro palabras y 64 bitsresultados, vphadddq y vphaddudq añadir pares de palabras dobles a los resultados de 64 bits. vphsubbwsubstratos de cada dos bytes bloquean el byte en la posición más alta de la que a menorposición, y almacena el resultado como un valor de 16 bits con signo en la posición correspondiente endestino, substratos vphsubwd de cada dos palabras bloquear la palabra en una posición más altade la que en la posición más baja y hace firmado resultados de 32 bits, vphsubdq restar en

Página 72

72 CAPÍTULO 2. del conjunto de instrucciones

cada bloque de dos palabras el doble de la de una en una posición más alta de la que en la posición más bajay marcas firmaron resultados de 64 bits. Cada una de estas instrucciones toma dos operandos, losdestino siendo SSE registro, y la fuente de ser SSE Registrarse o de memoria de 128 bits.

vphadduwq xmm0, XMM1 ; cuatrillizos suma de las palabras

vpmacsww y vpmacssww multiplicar los valores de 16 bits correspondientes firmados por elprimera y segunda fuente y luego añadir los productos a los valores paralelos de la tercerafuente, entonces vpmacsww toma los 16 bits más bajos de ácidos grasos saturados y el resultado vpmacsswwel resultado hasta el valor de 16 bits, y almacenar los resultados finales de 16 bits en el destinonación. vpmacsdd y vpmacssdd realizar la operación análoga en valores de 32 bits.vpmacswd y vpmacswd hacer el mismo cálculo sólo en los bajos valores de 16 bits decada bloque de 32 bits y la forma de los resultados de 32 bits. vpmacsdql y vpmacssdql realizartal operación en los bajos valores de 32 bits de cada bloque de 64 bits y forman la 64­bitresultados, mientras vpmacsdqh y vpmacssdqh hagan lo mismo en los valores de 32 bits de altacada bloque de 64 bits, formando también los resultados de 64 bits. vpmadcswd y vpmadcsswd multiplican

Page 67: Lenguage asembler FASM_esp

el valor de 16 bits con signo correspondiente de la primera y segunda fuente, entonces resumir todo elcuatro productos y añadir esta suma a cada elemento 16 bits de la tercera fuente, el almacenamiento de laresultado truncado o saturada en destino. Todas estas instrucciones toman cuatro operandos,la segunda fuente puede ser memoria de 128 bits o SSE registro, todos los otros operandos tienenser registros SSE.

vpmacsdd xmm6, XMM1, [ebx], xmm6; acumular producto

vpperm selecciona bytes de primera y segunda fuente, opcionalmente se aplica una separadatransformación a cada uno de ellos, y los almacena en el destino. Los campos de bitsen cuarto operando (el selector) especificar para cada posición en el destino lo byte dequé fuente se toma y qué operación se aplica a ella antes de que se almacena allí. Remitirlos manuales de AMD para la información detallada sobre estos campos de bits. Esta instrucciónlleva cuatro operandos, ya sea segunda fuente o el selector puede ser una memoria de 128 bits (o ellospuede ser SSE registra ambos), todos los otros operandos tienen que ser registra SSE.

vpshlb, vpshlw, vpshld y vpshlq cambiar lógicamente bytes, palabras, palabras dobles opalabras quad respectivamente. Se especifica la cantidad de bits a desplazar por para cada elementopor separado por el byte con signo colocado en la posición correspondiente en el tercer operando.La fuente que contiene elementos para desplazar se proporciona como segundo operando. Cualquiera de segundao tercer operando puede ser memoria de 128 bits (o pueden ser SSE registra ambos) y laotros operandos tienen que ser los registros de la ESS.

XMM3 vpshld, XMM1, [ebx] ; cambiar bytes de XMM1

vpshab, vpshaw, vpshad y vpshaq aritméticamente cambiar bytes, palabras, palabras dobleso palabras cuádruples. Estas instrucciones siguen las mismas reglas que los cambios lógicos descritosanteriormente. vprotb, vprotw, vprotd y vprotq gire byte, palabra, palabras dobles o quadpalabras. Siguen las mismas reglas que los turnos, pero, además, permiten tercer operando aser un valor inmediato, en cuyo caso se especifica la misma cantidad de giro para toda laelementos en la fuente.

Página 73

2.1. LAS INSTRUCCIONES arquitectura x86 73

vprotb xmm0, [esi], 3 ; girar bytes a la izquierda

La extensión MOVBE introduce sólo una nueva instrucción, movbe, que intercambiabytes en el valor de la fuente antes de guardarla en el destino, por lo que se puede utilizar para cargar yalmacenar valores grandes endian. Se necesitan dos operandos, ya sea el destino o de origen debeser una de 16 bits, 32 bits o de memoria de 64 bits (el último de los cuales sólo se permite en el modo de longitud),y el otro operando debe ser un registro general del mismo tamaño.

La extensión del IMC, que consta de dos subconjuntos ­ BMI1 y BMI2, introduce nuevaManual de instrucciones en los registros generales, que utilizan la misma codificación que AVX in­trucciones y así permiten la sintaxis extendida. Todas estas instrucciones utilizan operandos de 32 bits,y en el modo de tiempo que también permiten que las formas con operandos de 64 bits.

ANDN calcula la función Y de segunda fuente con los bits invertidos de primeroorigen y almacena el resultado en destino. El destino y la primera fuente tienen queser registros generales, la segunda fuente puede ser registro general o la memoria.

ANDN edx, eax, [ebx] ; bit­multiplicar eax invertida con la memoria

bextr extrae de la primera fuente de la secuencia de bits utilizando un índice y la longitudespecificado por los campos de bits en el segundo operando de origen y lo almacena en el destino. Lamás 8 bits de segunda fuente especifican la posición de secuencia de bits para extraer y lasiguientes 8 bits de segunda fuente se especifica la longitud de la secuencia. La primera fuente puede ser una

Page 68: Lenguage asembler FASM_esp

registro general o la memoria, los otros dos operandos tienen que ser registros generales.

bextr eax, [esi], ecx; extraer campo de bits de la memoria

BLSI extrae el conjunto de bits más baja de la fuente, ajustar todos los otros bits en destinonación a cero. El destino debe ser un registro general, la fuente puede ser generalRegistrarse o memoria.

BLSI rax, r11 ; aislar el bit de control más bajo

blsmsk establece todos los bits en el destino hasta el bit de control más bajo en la fuente,incluyendo este bit. copias BLSR todos los bits de la fuente al destino, excepto para elmás bajo bits set, que se sustituye por cero. Estas instrucciones siguen las mismas reglas paraoperandos como BLSI.

tzcnt cuenta el número de valores cero bits, que es los bits de cero hasta el más bajoestablecer el bit de valor de origen. Esta instrucción es análoga a lzcnt y sigue el mismoreglas para operandos, por lo que también tiene una versión de 16 bits, a diferencia de las otras instrucciones de IMC.

bzhi es la instrucción BMI2, que copia los bits del primer origen al destino,la reducción a cero todos los bits a partir de la posición especificada por segunda fuente. Se sigue el mismoreglas para operandos como bextr.

Pext utiliza una máscara en segundo operando fuente al seleccionar bits de primera operandos y putslos bits seleccionados como una secuencia continua en destino. PDEP realiza la inversaoperación ­ que toma secuencia de bits del primer origen y los coloca de forma consecutivaen las posiciones en las que se establecen los bits en segunda fuente, el establecimiento de todos los demás bits en

Página 74

74 CAPÍTULO 2. del conjunto de instrucciones

destino a cero. Estas instrucciones BMI2 siguen las mismas reglas para los operandos comoANDN.

mulx es una instrucción BMI2 que realiza una multiplicación sin signo de valor deEDX o registro RDX (dependiendo del tamaño de operandos especificados) por el valor detercer operando, y almacena la mitad baja del resultado en el segundo operando, y el altola mitad de resultado en el primer operando, y lo hace sin afectar las banderas. La terceraoperando puede ser registro general o la memoria, y tanto los operandos de destino queser registros generales.

mulx edx, eax, ecx ; multiplicar edx por ecx en edx: eax

shlx, shrx y sarx son instrucciones BMI2, que realizan lógica o aritméticacambios de valor de primera fuente en la cantidad especificada por segunda fuente, y almacenan eldar lugar a destino sin afectar las banderas. El tener las mismas reglas para operandoscomo bzhi instrucción.

rorx es una instrucción BMI2 que gira a la derecha el valor del operando fuente porla cantidad constante especifica en tercer operando y almacena el resultado en el destinosin afectar a las banderas. El operando destino tiene que ser registro general, eloperando de origen puede ser registro general o la memoria, y el tercer operando tiene que ser unavalor inmediato.

rorx eax, edx, 7 ; girar sin afectar banderas

La tuneladora es una extensión diseñada por AMD para complementar el conjunto de IMC. El bextrinstrucción se amplía con una nueva forma, en el que la segunda fuente es una de 32 bits inmediatavalor. blsic es una nueva instrucción que realiza la misma operación que BLSI, pero con

Page 69: Lenguage asembler FASM_esp

los bits del resultado invierten. Utiliza las mismas reglas para operandos como BLSI. blsfill es unanueva instrucción, que toma el valor de la fuente, establece todos los bits por debajo del conjunto más bajopoco y almacenar el resultado en el destino, sino que también utiliza las mismas reglas para operandos como BLSI.

BLCI, blcic, BLCS, blcmsk y blcfill son instrucciones análogas a BLSI, blsic,BLSR, blsmsk y blsfill respectivamente, pero que llevan a cabo las versiones bits invertida delas mismas operaciones. Siguen las mismas reglas para operandos como las instrucciones quereflexionar.

tzmsk encuentra el conjunto de bits más baja en el valor del operando fuente, establece todos los bits debajo de él para1 y todo el resto de bits a cero, luego escribe el resultado en el destino. t1mskc encuentra elbit menos significativo cero en el valor del operando fuente, establece los bits de abajo a ceroy todos los otros bits a 1, y escribe el resultado en el destino. Estas instrucciones tienenlas mismas reglas para operandos como BLSI.

02.01.24 Otras extensiones de conjunto de instrucciones

Hay un número de extensiones de conjuntos de instrucciones adicionales reconocido por el ensamblador plana,y se proporciona la sintaxis general de las instrucciones introducidas por esas extensionesaquí. Para una información detallada sobre las operaciones realizadas por ellos, revisar la

Página 75

2.1. LAS INSTRUCCIONES arquitectura x86 75

manuales de Intel (por el VMX, SMX, xSave, RDRAND, FSGSBASE, INVPCID,HLE y extensiones RTM) o AMD (para la extensión SVM).

Las extensiones de máquina virtual (VMX) proporcionan un conjunto de instrucciones para el mandatogestión de máquinas virtuales. La instrucción vmxon, que entra en la operación VMX,requiere un único operando de memoria de 64 bits, que debe ser una dirección física de la memoriaregión, que el procesador lógico puede utilizar para apoyar la operación VMX. El vmxoffde instrucciones, lo que deja la operación VMX, no tiene operandos. El vmlaunch yvmresume, que lanzar o reanudar las máquinas virtuales, y vmcall, que permitesoftware de invitados para llamar al monitor de máquina virtual, utilice ningún operando bien.

El vmptrld carga la dirección física de la actual estructura de control de la máquina virtual(VMCS) de su operando de memoria, vmptrst almacena el puntero actual VMCS endirección especificada por su operando de memoria, y vmclear establece el estado lanzamiento delVMCS referenciado por su operando de memoria para borrar. Estos tres instrucción todos requierenúnico operando de memoria de 64 bits.

El vmread lee de VCMS un campo especificado por el operando de origen y lo almacenaen el operando de destino. El operando fuente debe ser un registro de propósito general,y el operando de destino puede ser un registro de memoria. El vmwrite escribe en unaVMCS campo especificado por el operando de destino el valor proporcionado por el operando de origen.El operando fuente puede ser un registro de propósito general o de la memoria, y el destinooperando debe ser un registro. El tamaño de operandos para esas instrucciones debe ser de 64 bitscuando está en modo de largo, y 32­bit de otra manera.

El invept y invvpid invalida los buffers de traducción de direcciones (TLB) ycachés de paginación de las obras, ya sea derivados de tablas de páginas extendidas (EPT), o en base ael identificador de procesador virtual (VPID). Estas instrucciones requieren dos operandos, el primerouno es el registro de propósito general, especificando el tipo de invalidación, y el segundouno de ellos un operando de memoria de 128 bits proporciona el descriptor de invalidación. La primeraoperando debe ser un registro de 64 bits en el modo de largo, y 32­bit de registro de otra manera.

Las extensiones del modo más seguro (SMX) proporcionan las funcionalidades TRAVÉS disponiblela instrucción getsec. Esta instrucción tiene ningún operando, y la función que es

Page 70: Lenguage asembler FASM_esp

ejecutado es determinado por el contenido del registro EAX al ejecutar esta instrucción.La máquina virtual segura (SVM) es una variante de la extensión de máquina virtual utilizado porAMD. La instrucción Skinit reinicializa de forma segura el procesador que permite la puesta en marchade confianza de software, como el monitor de máquina virtual (VMM). Esta instrucción se llevaun único operando, que debe ser EAX, y proporciona una dirección física de la segurobloque cargador (SLB).

La instrucción vmrun se utiliza para iniciar una máquina virtual invitada, su único operandodebe ser un registro acumulador (AX, EAX o RAX, la última disponible sólo enmodo largo) proporcionar la dirección física del bloque de control de la máquina virtual (VMCB).El vmsave almacena un subconjunto de estado del procesador en VMCB especificado por su operando, yvmload carga el mismo subconjunto de estado de procesador de un VMCB especificado. Lo mismoreglas de operando como para el vmrun aplican a esos dos instrucciones.

vmmcall permite que el software de invitados a llamar a la VMM. Esta instrucción no se hace

Página 76

76 CAPÍTULO 2. del conjunto de instrucciones

operandos.

stgi establece el indicador global de interrupción a 1 y ceros clgi it. Estas instrucciones tomanningún operando.

invlpga invalida la asociación TLB para una página virtual especificada por el primer operando(Que tiene que ser registro acumulador) y el identificador de espacio de dirección especificada por elsegundo operando (que debe ser ECX registro).

El conjunto de instrucciones xSave permite guardar y restaurar los componentes de estado del procesador.xSave y almacenar xsaveopt los componentes de estado del procesador definidos por la máscara de bits en EDXy EAX registra en zona definida por el operando de la memoria. xrstor restaura de la zonaespecificado por el operando de memoria los componentes de estado del procesador definidos por la máscara enEDX y EAX. El xsave64, xsaveopt64 y xrstor64 son versiones de 64 bits de estosinstrucciones, se admiten únicamente en el modo largo.

xgetbv leer el contenido de 64 bits XCR (registro de control extendido) especificados en ECXinscribirse en los registros EAX y EDX. xsetbv escribe el contenido de EDX y EAX enla XCR 64 bits especificado por ECX registro. Estas instrucciones no tienen operandos.

La extensión RDRAND introduce una nueva instrucción, rdrand, que carga elhardware genera valor aleatorio en el registro general. Se necesita un operando, el cualpuede ser de 16 bits, 32 bits o registro de 64 bits (con el último de los cuales permitió sólo en largomodo).

La extensión FSGSBASE añade instrucciones del modo largos que permiten leer y escribirlos registros base segmento para los segmentos de FS y GS. rdfsbase y rdgsbase leen elcorrespondientes registros base segmento en operando, mientras wrfsbase y wrgsbase escriturael valor del operando en los registro. Todas estas instrucciones toman un operando, quepuede ser de 32 bits o registro general de 64 bits.

La extensión INVPCID añade instrucción invpcid, que invalida la cartografía enlas memorias caché TLB y de radiobúsqueda basado en el tipo de invalidación se especifica en primer operandoy descriptor invalidate PCID especifica en segundo operando. Los operandos primero debeser registro general de 32 bits cuando no está en modo de tiempo, o registro de 64 bits en general cuando enmodo largo. El segundo operando debe ser la posición de memoria de 128 bits.

Las extensiones HLE y RTM que proporcionar una serie de instrucciones para el mandato transaccionalgestión. El xacquire y xrelease son nuevos prefijos que se pueden utilizar con algunos de

Page 71: Lenguage asembler FASM_esp

las instrucciones para empezar o terminar la elisión de bloqueo en la dirección de memoria especificada por el prefijoinstrucción. La instrucción xbegin inicia la ejecución de transacciones, su operando esla dirección de una rutina de repliegue que se ejecuta en caso de abortar la transacción, se especificacomo el operando de instrucción de salto próximo. xend marca el final de transcational ejecuciónregión ción, se necesita ningún operando. xabort fuerzas abortar la transacción, que se necesita un niño de 8 bitsvalor inmediato como su único operando, este valor se pasa en los bits más altos de EAX ala rutina de reserva. cheques XTEST si hay ejecución de transacciones en curso,esta instrucción no toma operandos.

Página 77

2.2. DIRECTIVAS DE CONTROL 77

2.2 directivas de control

Esta sección describe las directivas que controlan el proceso de montaje, son pro­sar durante el montaje y puede causar algunos bloques de instrucciones para ser ensambladosdiferente o no ensamblados en absoluto.

2.2.1 constantes numéricas

La directiva = permite definir la constante numérica. Se debe ir precedida de lanombrar para la constante y seguido de la expresión numérica que proporciona el valor.El valor de tales constantes puede ser un número o una dirección, pero ­ a diferencia de las etiquetas ­las constantes numéricas no se les permite mantener las direcciones basados en registros. Ademásesta diferencia, en su variante básica constantes numéricas se comportan muy parecido etiquetase incluso se puede con visión de hacer referencia a ellos (acceso a sus valores antes de que realmente consiguendefinido).

Hay, sin embargo, una segunda variante de constantes numéricas, que es reconocido porensamblador cuando intenta definir la constante de nombre con el que ya había unaconstante numérica definida. En tales golosinas caso ensamblador que constantes como montaje­variable de tiempo y permite que se asigna con el nuevo valor, pero prohíbe hacia adelante referenciasque (por razones obvias). Vamos a ver, tanto la variante de constantes numéricas en un ejemplo:

suma ddx = 1x = x + 2suma = x

Aquí, la x es una variable de tiempo de montaje, y cada vez que se accede, el valor que eraasignado a él los más recientemente se utiliza. Así, si intentamos acceder a la x antes de que lleguedefinido por primera vez, como si escribimos dd x en lugar de la instrucción suma dd, seríacausar un error. Y cuando se redefine con el x = x + 2 Directiva, el valor anteriorde x se utiliza para calcular la nueva. Así que cuando la suma constante se define, la x tienevalor de 3, y este valor se asigna a la suma. Desde éste se define sólo una vez enfuente, es la constante numérica estándar, y puede ser hacia adelante referenciado. Así que lasuma dd se monta como dd 3. Para leer más acerca de cómo el ensamblador es capaz de resolveresto, consulte la sección 2.2.6.

El valor de la constante numérica puede ser precedido por el operador de tamaño, que puede asegurarque el valor se ajusta en el rango para el tamaño especificado, y puede afectar también cómo algunosde los cálculos dentro de la expresión numérica se realizan. En este ejemplo:

c8 = byte ­1

Page 72: Lenguage asembler FASM_esp

c32 = dword ­1

define dos constantes diferentes, el primero se ajusta en 8 bits, el segundo se ajusta en 32 bits.

Página 78

78 CAPÍTULO 2. del conjunto de instrucciones

Cuando es necesario definir constante con el valor de la dirección, que puede ser Registro­basado (y por lo tanto no se puede emplear constante numérica para este propósito), puede utilizarla sintaxis extendida de directiva etiqueta (ya se ha descrito en el apartado 1. 2.3), como:

MYADDR etiqueta en ebp + 4

que declara etiqueta colocada en ebp + 4 direcciones. Sin embargo recuerde que las etiquetas, a diferencia deconstantes numéricas, no pueden convertirse en variables de tiempo de montaje.

2.2.2 ensamblaje condicional

si la directiva hace que algunos bloques de instrucciones para su montaje sólo en determinadas con­condición. Se debe ir seguido de la expresión lógica que especifica las condiciones, instruccionesen próximas líneas se montará sólo cuando se cumple esta condición, de lo contrario lo haránomitir. La opción más si directiva siguió con expresión lógica especificandocondición adicional comienza el siguiente bloque de instrucciones que se montará si pre­no se cumplían las condiciones ante­, y se cumple la condición adicional. El opcional demásDirectiva comienza el bloque de instrucciones que se montará si todas las condicionesno se cumplieron. El final si directiva termina el último bloque de instrucciones.

Debe tener en cuenta que si la directiva se procesa en la etapa de montaje y, por tanto,no afectará a las directivas del preprocesador, como las definiciones de constantes simbólicas ymacroinstrucciones ­ cuando el ensamblador reconoce la Directiva si, todo el preprocesamientoya se ha terminado.

La expresión lógica consiste en valores lógicos y operadores lógicos. La lógicaoperadores de la negación lógica, y por lógica y, | por lógica o. La negación tienela más alta prioridad. Valor lógico puede ser una expresión numérica, será falso sies igual a cero, de lo contrario será verdadera. Dos expresión numérica puede ser comparadousando uno de los siguientes operadores para hacer el valor lógico: = (igual), <(menor),>(Mayor), <= (menor o igual),> = (mayor o igual), <> (no igual).

El operador utilizado, seguido de un nombre de símbolo, es el valor lógico que los chequessi el símbolo dado se utiliza en alguna parte (devuelve resultado correcto aun cuando signosutilizado sólo después de esta comprobación). El operador definido puede ser seguido por cualquier expresión,por lo general sólo por un solo nombre del símbolo; comprueba si la expresión dada contienesólo símbolos que se definen en la fuente y accesibles desde la posición actual.

Con operador relativeTo es posible comprobar si los valores de dos expresionesdifieren sólo en cantidad constante. La sintaxis válida es una expresión numérica seguida derelativeTo y luego otra expresión (posiblemente basados en registros). Las etiquetas que no tienenvalor numérico simple puede ser probado esta forma de determinar qué tipo de operaciones puedeser posible con ellos.

El siguiente ejemplo utiliza la constante de recuento que debe definirse alguiendonde en la fuente:

si count> 0

Page 73: Lenguage asembler FASM_esp

Página 79

2.2. DIRECTIVAS DE CONTROL 79

cx mov, cuenterep movsb

end if

Estas dos instrucciones de montaje se ensamblan sólo si la constante del contador es mayorque 0. El siguiente ejemplo muestra la estructura condicional más complejo:

si el conteo y recuento mod 4cx mov, cuente / 4rep movsd

más si count> 4cx mov, cuente / 4rep movsdcx mov, Conde mod 4rep movsb

máscx mov, cuenterep movsb

end if

El primer bloque de instrucciones se monta cuando el recuento es distinto de cero y divisiblepor cuatro, si no se cumple esta condición, la segunda expresión lógica, que sigue lamás si, se evalúa y si es cierto, el segundo bloque de instrucciones conseguir montado,de lo contrario el último bloque de instrucciones, que sigue la línea que contiene sólo otra cosa, esensamblado.

También hay operadores que permiten la comparación de los valores que son cualquier cadena de símbolos.El eq compara si dos de estos valores son exactamente lo mismo. Los controles del operador ensi el valor dado es un miembro de la lista de valores después de dicho operador, la listadebe ser encerrado entre <y> personajes, sus miembros deben ser separados concomas. Los símbolos se consideran la misma cuando tienen el mismo significado parael ensamblador ­ por ejemplo pword y fword para ensamblador son los mismos y por lo tantono se distinguen por los operadores anteriores. De la misma manera 16 eq 10h es el verdaderocondición, sin embargo 16 eq 10 + 4 no lo es.

El operador eqtype Comprueba que los dos valores comparados tienen la misma estructuratura, y si los elementos estructurales son del mismo tipo. Los tipos distinguidosincluir expresiones numéricas, cadenas entre comillas individuales, números de punto flotante, direcciónexpresiones (las expresiones entre corchetes o precedido por el operador PTR),mnemónicos de instrucciones, registros, los operadores de tamaño, saltan operadores de tipo y el tipo de código.Y cada uno de los caracteres especiales que actúan como separadores, como coma o dos puntos, esel propio tipo separado. Por ejemplo, dos valores, cada uno consistente en nombre de registroseguido de coma y la expresión numérica, será considerado como del mismo tipo, sinimporta qué tipo de registro y lo complicado que se utiliza la expresión numérica; conexcepción de las cadenas entre comillas y punto flotante valores, que son los tipos especiales de

Page 74: Lenguage asembler FASM_esp

Página 80

80 CAPÍTULO 2. del conjunto de instrucciones

expresiones numéricas y son tratados como diferentes tipos. Así eax, 16 eqtype fs, 3 + 7condición es verdadera, pero eax, 16 eqtype eax, 1.6 es falsa.

2.2.3 bloques de repetición de instrucciones

Directiva veces se repite una instrucción número determinado de veces. Se debe seguirsepor la expresión numérica especificando el número de repeticiones y la instrucción para repetir(Colon opcionalmente se puede utilizar para el número y la instrucción separada). Cuando símbolo especial% Se utiliza dentro de la instrucción, es igual al número de repetición actual. Por ejemploTiempos 5 db% definirá cinco bytes con valores de 1, 2, 3, 4, 5. El uso recurrente de vecesTambién se permite la directiva, por lo que los tiempos 3 veces% db% definirán seis bytes con los valores 1,1, 2, 1, 2, 3.

Directiva repetición repite todo el bloque de instrucciones. Se debe ir seguida deexpresión numérica especificando el número de repeticiones. Se espera Instrucciones para repetiren próximas líneas, terminó con la directiva de final de repetición, por ejemplo:

repetir 8byte mov [bx],%inc bx

final de repetición

El código generado almacenará valores de bytes de uno a ocho en la memoria direccionadapor BX registrarse.

Número de repeticiones puede ser cero, en ese caso las instrucciones no se ensamblan entodos.

La directiva descanso permite dejar de repetir anterior y continuar el montaje dela primera línea después del final de repetición. En combinación con la directiva si se permite detenerrepitiendo bajo alguna condición especial, como:

s = x / 2repetir 100

si x / s = srotura

end ifs = (s + x / s) / 2

final de repetición

La directiva mientras repite el bloque de instrucciones mientras la condición especificadapor la expresión lógica siguiendo es cierto. El bloque de instrucciones que se repitadebe terminar con el extremo mientras Directiva. Antes de cada repetición de la expresión lógicase evalúa y cuando su valor es false, el conjunto se continuó empezando desde el primerlínea después del tiempo final. También en este caso el símbolo% contiene el número de la corrienterepetir. La directiva de interrupción se puede utilizar para detener este tipo de bucle en la misma forma quecon la directiva de repetición. El ejemplo anterior se puede reescribir para utilizar el tiempo en lugarde repetir de esta manera:

Página 81

Page 75: Lenguage asembler FASM_esp

2.2. DIRECTIVAS DE CONTROL 81

s = x / 2mientras que x / s <> s

s = (s + x / s) / 2si% = 100

roturaend if

extremo mientras

Los bloques definidos con si, repetir y mientras se puede anidar en cualquier orden, sin embargoque deben estar cerrados en el mismo orden en que se iniciaron. La directiva descansoSiempre deja de procesar el bloque que se inició el pasado, ya sea con la repetición o mientrasDirectiva.

2.2.4 espacios de direccionamiento

conjuntos directiva ORG dirección en la que se espera que el siguiente código para aparecer en la memoria.Se debe ser seguido por la expresión numérica especificando la dirección. Esta directivacomienza el nuevo espacio de direccionamiento, el código siguiente en sí no se mueve de ninguna manera, perotodas las etiquetas definidas dentro de ella y el valor del símbolo $ se ven afectados como si se pusoen la dirección indicada. Sin embargo, es responsabilidad del programador para poner el código endirección correcta en el tiempo de ejecución.

La directiva de carga permite definir constante con un valor binario cargado desde elya montado código. Esta directiva debe ser seguido por el nombre de la constante,a continuación, el operador tamaño opcionalmente, a continuación, a partir del operador y una expresión numérica que especificauna dirección válida en el espacio de direcciones actual. El operador de tamaño tiene un significado inusual eneste caso ­ se dice cuántos bytes (hasta 8) tienen que ser cargado para formar el binariovalor de la constante. Si no se especifica ningún operador de tamaño, se carga un byte (por lo tanto el valor está envariar de 0 a 255). Los datos cargados no pueden exceder la corriente de offset.

La directiva de la tienda puede modificar el código ya generado mediante la sustitución de algunos delos datos generados anteriormente con el valor definido por la expresión numérica dada,que sigue. La expresión puede ser precedida por el operador de tamaño opcional para especificarcómo valor grande la expresión define, y por lo tanto la cantidad de bytes se almacena, sino hay ningún operador tamaño, se supone que el tamaño de un byte. Entonces el operador y enla expresión numérico que define la dirección válida en la corriente de espacio de direccionamiento de código, enque el valor dado tiene que ser almacenado después de ellas. Esta es una directiva para avanzadoselectrodomésticos y deben usarse con cuidado.

Ambas directivas de carga y almacenamiento se limitan a operar en lugares en los actuales abordarespacio. La $$ símbolo es siempre igual a la dirección base del espacio de direccionamiento actual,y el símbolo $ es la dirección de la posición actual en ese espacio de direccionamiento, por lo tantoestos dos valores definen los límites de la zona, donde la carga y almacén pueden operar.

La combinación de las directivas de carga y almacenamiento permite hacer cosas como codificar algunas deel código ya generado. Por ejemplo, para codificar todo el código generado en la corrienteespacio de direccionamiento puede utilizar como bloque de directivas:

Página 82

82 CAPÍTULO 2. del conjunto de instrucciones

repetir $ ­ $$

Page 76: Lenguage asembler FASM_esp

cargar un byte de $$ +% ­ 1tienda Byte a xor c en $$ +% ­ 1

final de repetición

y cada byte de código se XOR con el valor definido por c constante.virtuales definen datos virtuales en la dirección especificada. Estos datos no se incluirá

en el archivo de salida, pero etiquetas definidas no pueden ser utilizados en otras partes de la fuente. Estedirectiva puede ser seguido por al operador y la expresión numérica que especifica elabordar de datos virtuales, de lo contrario es decir utiliza la dirección actual, lo mismo que virtual en $.Instrucciones que definen los datos se espera que en las próximas líneas, terminaron con fines directiva virtual.El bloque de instrucciones virtuales en sí es un espacio de direccionamiento independiente, después de que seaterminado, se restaura el contexto de espacio de direccionamiento anterior.

La directiva virtual puede ser utilizado para crear la unión de algunas variables, por ejemplo:

GDTR dp?virtual en GDTR

Dw GDT_limit?Dd GDT_address?

terminar virtuales

Define dos etiquetas para las partes de la variable de 48 bits en la dirección GDTR.También puede ser usado para definir etiquetas para algunas estructuras abordados por un registro, por

ejemplo:

virtual en bxLDT_limit dw?Dd LDT_address?

terminar virtuales

Con tal mov ax instrucción definición, [LDT_limit] será ensamblado a la mismainstrucción mov ax, [bx].

La declaración de valores de datos definidos o instrucciones dentro del bloque virtual también seríaútil, porque la Directiva de carga se puede utilizar para cargar los valores de la virtualmentegenera código en una constantes. Esta directiva se debe utilizar después del código que se cargapero antes de que el bloque virtual termina, porque sólo puede cargar los valores de la mismaespacio de direccionamiento. Por ejemplo:

virtual en 0xor eax, eaxy edx, eaxcarga zeroq dword de 0

terminar virtuales

Página 83

2.2. DIRECTIVAS DE CONTROL 83

La pieza de código anterior definirá la constante zeroq contiene cuatro bytes de lacódigo de la máquina de las instrucciones definidas dentro del bloque virtual. Este método puede serTambién se utiliza para cargar un valor binario de archivo externo. Por ejemplo, este código:

virtual en 0archivo 'a.txt': 10h, 1

Page 77: Lenguage asembler FASM_esp

Char carga de 0terminar virtuales

carga el byte de 10h desplazamiento en archivo a.txt en la constante de carbón.Cualquiera de las directrices que se describen en la sección 2.4 también se inicia un nuevo espacio de direccionamiento.

2.2.5 Otras directivas

alinear Directiva alinea código o datos hasta el límite especificado. Se debe seguirsepor una expresión numérica que especifica el número de bytes, a la multiplicación de los cuales eldirección actual tiene que ser alineado. El valor límite tiene que ser la potencia de dos.

La directiva align llena los bytes que tuvieron que ser omitidos para realizar la alineacióncon las instrucciones NOP y al mismo tiempo marca esta área como datos no inicializados, por losi se coloca entre otros datos sin inicializar que no tomarían el espacio en el archivo de salida,los bytes de alineación actuarán de la misma manera. Si usted necesita para llenar el área de alineación conalgunos otros valores, se puede combinar con align virtual para obtener el tamaño de la alineaciónes necesario y luego crear la alineación a ti mismo, como:

virtualalinear 16a = $ ­ $$

terminar virtualesdb un dup 0

La constante se define como la diferencia entre la dirección después de la alineación ydirección del bloque virtual (ver sección anterior), lo que es igual al tamaño de la necesariaespacio de alineación.

Directiva pantalla muestra el mensaje en el tiempo de montaje. Se debe seguirsepor las cadenas entre comillas o valores de bytes, separados por comas. Se puede utilizar para mostrarvalores de algunas constantes, por ejemplo:

los bits = 16display 'desplazamiento actual es 0x'bits de repetición / 4

d = '0' + $ shr (bits ­% * 4) y 0Fhsi d> '9'

d = d + 'A' ­ '9' 1­end if

Página 84

84 CAPÍTULO 2. del conjunto de instrucciones

pantalla dfinal de repeticiónpantalla 13,10

Este bloque de directivas calcula los cuatro dígitos hexadecimales de valor de 16 bits y con­les Verts en personajes para mostrar. Tenga en cuenta que esto no funcionará si las direcciones enespacio de direccionamiento actual son reubicable (como podría ocurrir con PE o salida objetoformatos), ya que sólo valores absolutos se pueden utilizar de esta manera. El valor absoluto puede serobtenido mediante el cálculo de la dirección relativa, como $ ­ $$, o rva $ en el caso de formato PE.

La directiva err termina inmediatamente el proceso de montaje cuando se encuen­cados por el ensamblador.

Page 78: Lenguage asembler FASM_esp

Las pruebas directivos afirman si la expresión lógica que sigue es cierto, ysi no, se señala el error.

2.2.6 pases múltiples

Debido a que el ensamblador permite hacer referencia a algunas de las etiquetas o constantes antes de que seconseguir realmente definido, tiene que predecir los valores de tales etiquetas y si hay incluso unasospecha que la predicción falló en al menos un caso, lo hace uno más pase, montajetoda la fuente, esta vez haciendo mejor predicción basada en los valores de las etiquetas recibieronen la pasada anterior.

Los valores cambiantes de etiquetas pueden causar algunas instrucciones para tener codificaciones dediferente longitud, y esto puede causar el cambio en los valores de las etiquetas de nuevo. Y puesto que laetiquetas y constantes también se pueden usar dentro de las expresiones que afectan al comportamientode las directivas de control, todo el bloque de fuente puede ser procesado completamente diferentedurante el nuevo pase. Así, el ensamblador hace más y más pases, cada vez tratandohacer mejores predicciones para acercarse a la solución final, cuando todos los valores quedan predijeroncorrectamente. Se utiliza diversos métodos para predecir los valores, que ha sido elegido parapermitir encontrar en algunos pases la solución de longitud posiblemente más pequeña para la mayoría de laprogramas.

Algunos de los errores, al igual que los valores que no encaja en los límites exigidos, no se señalizandurante esos pases intermedios, ya que puede suceder que cuando algunos de los valoresse predice mejor, estos errores desaparecerán. Sin embargo, si ensamblador reúne algunosla construcción ilegal de sintaxis o instrucción desconocida, siempre se detiene inmediatamente. Tambiéndefinir alguna etiqueta más de una vez hace que dicho error, porque hace que las prediccionesfundamento.

Sólo los mensajes creados con la directiva de la pantalla durante la última pasada realizadoconseguir realmente aparece. En caso de que el montaje se ha detenido debido a un error,estos mensajes siempre son representativas de los valores pronosticados que aún no se resuelven correctamente.

La solución a veces no exista y que en tales casos el ensamblador nuncaarreglan para hacer predicciones correctas ­ por esta razón hay un límite para un número depasa, y cuando ensamblador alcanza este límite, se detiene y muestra el mensaje de queno es capaz de generar la salida correcta. Considere el siguiente ejemplo:

Página 85

2.2. DIRECTIVAS DE CONTROL 85

si alfa definidoalpha:

end if

El operador definido da el verdadero valor cuando la expresión siguiente podría sercalculada en este lugar, lo que en este caso significa que la etiqueta alfa se define alguiendónde. Pero el bloque anterior hace que esta etiqueta debe definirse sólo cuando el valor dadopor el operador definido es falso, lo que conduce a un antynomy y hace que sea imposible volver aresolver dicho código. Al procesar el caso ensamblador directiva tiene que predecir si eletiqueta alfa será definido en alguna parte (que no tendría que predecir cuando la etiqueta fueya definido anteriormente en este paso), y lo que la predicción es, lo contrario siempresucede. Así, el montaje fallará, a menos que la etiqueta alfa se define en algún lugarfuente anterior al bloque por encima de las instrucciones ­ en tal caso, como ya se señaló,la predicción no es necesario y el bloque sólo se omita.

El ejemplo anterior podría haber sido escrito como una oportunidad para definir la etiqueta sólo cuandoaún no se definió. Se produce un error, porque el operador definido no comprueba si la etiqueta

Page 79: Lenguage asembler FASM_esp

es definido en ninguna parte, y esto incluye la definición dentro de este condicionalmente procesadobloque. Sin embargo la adición de alguna condición adicional puede hacer que sea posible lograr que se resolvió:

si alfa definido |f definidoalpha:@@:

end if

Elf es siempre la misma etiqueta que la@@símbolo más cercano en la fuente que le sigue,por lo que la muestra anterior significaría lo mismo si cualquier nombre exclusivo se utilizó en lugar de laetiqueta anónima. Cuando alfa no está definida en cualquier otro lugar de origen, la únicasolución posible es cuando este bloque se define, y esta vez esto no conduce a laantynomy, a causa de la etiqueta anónima que hace que este bloque de auto­establecimiento.Para entender mejor esto, mira a los bloques que tiene nada más que este autoel establecimiento de:

sif definido@@:

end if

Este es un ejemplo de fuente que puede tener más de una solución, ya que ambos casoscuando este bloque se procesa o no son igualmente correctos. ¿Cuál de los dossoluciones que obtenemos depende del algoritmo en el ensamblador, en caso de ensamblador plana ­en el algoritmo de predicciones. Volver a la muestra anterior, cuando alfa no está definidoen cualquier otro lugar, la condición para que si el bloque no puede ser falsa, por lo que nos quedamos con una solaposible solución, y podemos esperar que el ensamblador llegará ella. Por otra parte,cuando alfa se define en otro lugar, tenemos dos soluciones posibles de nuevo, perouno de ellos provoca alfa que se definirá en dos ocasiones, y tal error provoca ensamblador

Página 86

86 CAPÍTULO 2. del conjunto de instrucciones

abortar el montaje de inmediato, ya que este es el tipo de error que perturba profundamente laproceso de resolución. Así que podemos obtener tal fuente sea resuelto correctamente o causar unaerror, y lo que obtenemos puede depender de las elecciones internas realizadas por el ensamblador.

Sin embargo, hay algunos datos sobre este tipo de decisiones que son ciertas. Cuando ensambladortiene que comprobar si se ha definido el símbolo dado y que ya se definió en elpaso de la corriente, no se necesita la predicción ­ que ya se señaló anteriormente. Y cuando lo dadosímbolo se ha definido nunca antes, incluyendo todos los pases ya terminados, laensamblador predice que sea no definido. Sabiendo esto, podemos esperar que la simple auto­bloque de establecer los indicados arriba no será ensamblado en absoluto y que la muestra anteriorresolverá correctamente cuando alfa se define antes en alguna parte de nuestro bloque condicional,mientras que será en sí definir alfa cuando no está ya definido antes, por tanto, potencialmenteque causa el error por la doble definición si el alfa también se define en alguna partemás tarde.

El operador que se utiliza se puede esperar que se comporte de una manera similar en análogacasos, sin embargo cualquier otro tipo de predicciones mi no ser tan simple y que nunca debeconfiar en ellos de esta manera.

La directiva se equivocan, por lo general utiliza para detener la asamblea cuando se cumpla alguna condición,se detiene el conjunto de inmediato, independientemente de si la pasada actual es final o in­intermedio. Así que incluso cuando la condición que causó esta directiva para ser interpretada esmispredicted y temporal, y eventualmente desaparecer en las pasadas posteriores, la

Page 80: Lenguage asembler FASM_esp

Asamblea se detiene de todos modos.La directiva afirman señala el error sólo si su expresión es falsa, después de todo elsímbolos han sido resueltos. Puede utilizar afirman 0 en lugar de err cuando no lo hacenquiero tener el montaje se detuvo durante los pases intermedios.

2.3 directivas del preprocesador

Todas las directivas de preprocesador se procesan antes que el proceso de montaje principal, y por lo tantono se ven afectados por las directivas de control. En este tiempo también todos los comentarios son despojadosa cabo.

2.3.1 archivos de origen Incluidos

directiva de inclusión incluye el archivo de origen especificado en la posición en que se utiliza. Elladebe ser seguido por el nombre de cotización de archivo que se debe incluir, por ejemplo:

incluir 'macros.inc'

El archivo incluido todo es preprocesado antes de procesamiento previo de las líneas siguientes a la líneaque contiene la directiva include. No hay límites para el número de archivos incluidos comosiempre y cuando encajen en la memoria.

El camino citado puede contener variables de entorno encerrados dentro de% caracteres,serán reemplazados con sus valores dentro de la trayectoria, tanto el \ y / personajes son

Página 87

2.3. Directivas del preprocesador 87

permitida como un camino separadores. El archivo está primero busca en el directorio que contienearchivo que incluía y cuando no se encuentra allí, la búsqueda se continúa en eldirectorios especificados en la variable de entorno llamada INCLUYEN (los múltiples caminosseparados con punto y coma puede definirse allí, se buscarán en el mismo ordencomo se especifica). Si el archivo no se encuentra en ninguno de estos lugares, preprocesador lo busca en eldirectorio que contiene el archivo fuente principal (el que se especifica en la línea de comandos). Estosreglas preocupación también rutas proporcionadas con la directiva del archivo.

2.3.2 Las constantes simbólicas

Las constantes simbólicas son diferentes de las constantes numéricas, antes de la Asambleaproceso blea que se reemplacen por sus valores en todas partes en las líneas de código después de sudefiniciones, y cualquier cosa puede convertirse en sus valores.

La definición de constante simbólica consiste en el nombre de la constante seguido por laDirectiva equ. Todo lo que sigue esta directiva se convertirá en el valor de la constante.Si el valor de la constante simbólica contiene otras constantes simbólicas, son reemplazadascon sus valores antes de asignar este valor a la nueva constante. Por ejemplo:

d equ dwordNULL equ d 0d equ edx

Después de estas tres definiciones del valor de la constante NULL es DWORD 0 y el valor de d esedx. Así, por ejemplo, empujar NULL será montado como empuje dword 0 y empuje d seráensamblarse como empuje edx. Y si entonces la siguiente línea se puso:

Page 81: Lenguage asembler FASM_esp

d equ d, eax

la constante d obtendría el nuevo valor de edx, eax. De esta manera las crecientes listas desímbolos pueden ser definidos.

restaurar la Directiva permite obtener el valor de vuelta previa de constante simbólica redefinida.Debe ser seguido por uno más nombres de constantes simbólicas, separados por comas.Así restaurar d después de las definiciones anteriores dará d constante ir el edx valor,segundo será restaurarlo a valor DWORD, y uno más volverá a d significado originalcomo si no se definió como constante. Si no hubo constante definida de nombre dado,restauración no se producirá un error, será ignorado.

Constante simbólica se puede utilizar para ajustar la sintaxis de ensamblador para preferencias personalescias. Por ejemplo, el siguiente conjunto de definiciones proporciona los atajos útiles para todoslos operadores de tamaño:

b byte equpalabra equ wd equ dwordp equ pword

Página 88

88 CAPÍTULO 2. del conjunto de instrucciones

f equ fwordq equ QWORDt equ twordx equ dqwordy equ qqword

Debido constante simbólica puede tener también un valor vacío, puede ser utilizado para permitirla sintaxis con offset de palabra antes de que cualquier valor de dirección:

equ desplazamiento

Después de esta definición mov ax, char desplazamiento será la construcción válida para copiar ladesplazamiento de variable de tipo char en el registro hacha, porque compensar se sustituye con un valor vacío,y por lo tanto se ignoran.

La directiva definir seguido por el nombre de la constante y luego el valor, es elforma alternativa de definir una constante simbólica. La única diferencia entre definir yequ es que definir asigna el valor que sea, que no reemplaza a las constantes simbólicascon sus valores dentro de él.

Las constantes simbólicas también se pueden definir con la directiva de revisión, que tiene el mismosintaxis que equ, pero define constantes de alta prioridad ­ que se reemplacen por su bolovalores bolic incluso antes de procesar las directivas de preprocesador y macroinstrucciones,la única excepción es la directiva solución en sí, que tiene la prioridad más alta posible, por lo quepermite redefinición de constantes definidas de esta manera.

La directiva fija puede ser utilizado para los ajustes de sintaxis relacionados con las directivas de pre­procesador, lo que no se puede hacer con la directiva de la ecuación. Por ejemplo:

incl solución incluye

define un nombre corto para incluir Directiva, mientras que la definición similar hace con equDirectiva no daría como resultado, como constantes simbólicas estándar se sustituyen porsus valores después de buscar la línea de las directivas de preprocesador.

Page 82: Lenguage asembler FASM_esp

2.3.3 macroinstrucciones

macro directiva le permite definir sus propias instrucciones complejas, llamado macroinstruc­ciones, mediante el cual se puede simplificar en gran medida el proceso de programación. En su forma más simpleque es similar a la definición constante simbólica. Por ejemplo los siguientes define Definiciónun atajo para la col de prueba, instrucciones 0xFF:

macro tst prueba al, 0xFF

Después de la directiva macro hay un nombre de macroinstruction y luego su contenido penetrecerrado entre los caracteres y. Puede utilizar tst instrucción en cualquier lugar después de estadefinición y será montada como al ensayo, 0xFF. Definición tst constante simbólica de

Página 89

2.3. Directivas del preprocesador 89

que el valor daría el resultado similar, pero la diferencia es que el nombre de macroin­construcción sólo se reconoce como un mnemónico de instrucción. Además, son macroinstruccionessustituido por un código correspondiente, incluso antes de las constantes simbólicas son reemplazados porsus valores. Así que si usted define macroinstruction y constante simbólica del mismo nombre,y utiliza este nombre como un mnemónico de instrucción, será reemplazado por el contenido demacroinstruction, pero será reemplazado con valor si constante simbólica si se usa alguiendonde dentro de los operandos.

La definición de macroinstruction puede constar de varias líneas, porque y carac­personajes no tienen que estar en la misma línea que la macro Directiva. Por ejemplo:

macro stos0

xor al, alSTOSB

El stos0 macroinstruction será reemplazado con estos dos instrucciones de montaje Any­donde se utiliza.

Al igual que las instrucciones que necesita un poco de número de operandos, la macroinstruction puededefinir a necesitar un poco número de argumentos separados por comas. Los nombresde argumentación necesaria debe seguir el nombre de macroinstruction en la línea de macroDirectiva y deberán ser separados por comas si hay más de uno. Dondequierauno de estos nombres se produce en el contenido de macroinstruction, será reemplazado convalor correspondiente, siempre y cuando se utiliza la macroinstrucción. He aquí un ejemplode un macroinstruction que va a hacer la alineación de datos para el formato de salida binaria:

valor de la macro align rb (valor­1) ­ ($ + valor­1) Valor mod

Cuando la instrucción align 4 se encuentra después se define esta macroinstrucción, seráreemplazado con contenido de esta macroinstrucción, y el valor se había convertido en 4, por loel resultado será RB (4­1) ­ ($ + 4.1) mod 4.

Si un macroinstruction se define que utiliza una instrucción con el mismo nombre in­lado su definición, se utiliza el significado anterior de este nombre. Redefinición útil demacroinstrucciones se pueden hacer de esa manera, por ejemplo:

macro mov op1, op2

Page 83: Lenguage asembler FASM_esp

si op1 en <ds, es, fs, gs, ss> & op2 en <cs, ds, es, fs, gs, ss>empuje op2música popop1

másmov op1, op2

end if

Página 90

90 CAPÍTULO 2. del conjunto de instrucciones

Este macroinstruction extiende la sintaxis de la instrucción mov, permitiendo a ambos operandosser registros de segmento. Por ejemplo mov ds, es serán ensamblados como es empuje y ds pop.En todos los demás casos se utilizará la instrucción mov estándar. La sintaxis de este mov puedeextenderse más allá, definiendo junto macroinstruction de ese nombre, que utilizará elmacroinstruction anterior:

macro mov OP1, OP2, OP3si eq op3mov op1, op2

másmov op1, op2mov op2, op3

end if

Permite que la instrucción mov tener tres operandos, pero todavía puede tener dos operandossolamente, porque cuando macroinstruction se da menos argumentos de lo que necesita, el resto deargumentos tendrán valores vacíos. Cuando tres operandos se dan, este macroinstructionse convertirá en dos macroinstrucciones de la definición anterior, por lo mov es, ds, dx seránmontado como ds empuje, es pop y mov ds, dx.

Al colocar el * después del nombre del argumento puede marcar el argumento según sea necesario­ Preprocesador no permitirá que tenga un valor vacío. Por ejemplo, el macroin­ anteriormenteconstrucción podría ser declarada como macro mov op1 *, * op2, op3 para asegurarse de que dos primeroargumentos siempre tendrán que dar algunos valores no vacíos.

Alternativamente, se puede proporcionar el valor por defecto para el argumento, mediante la colocación de los =seguido de valor después del nombre del argumento. Entonces, si el argumento tiene un valor vacíoproporcionado, el valor por defecto será utilizado en su lugar.

Cuando sea necesario para proporcionar macroinstruction con el argumento de que contiene algunoscomas, tal argumento debe encerrarse entre caracteres <y>. Si contienemás de un carácter <, el mismo número de> se debe usar para decirle que el valordel argumento termina.

Directiva de purga permite la eliminación de la última definición de macroinstruction especificado. Elladebe ser seguido por uno o más nombres de macroinstrucciones, separados por comas.Si tales macroinstruction no se ha definido, usted no conseguirá ningún error. Por ejem­ple después de tener la sintaxis de mov ampliado con las macroinstrucciones definidas anteriormente,puede desactivar la sintaxis con tres operandos espalda utilizando directiva mov purga. Siguientemov purga desactivará también la sintaxis de dos operandos ser registros de segmento, y todo elpróximos tales directivas no harán nada.

Si después de la directiva macro se encierra algún grupo de nombres de argumentos 'en la plaza

Page 84: Lenguage asembler FASM_esp

soportes, permitirá dar más valores para este grupo de argumentos cuando se utiliza quemacroinstruction. Cualquier más argumento dado después de que el último argumento de dicho grupo lo harácomenzar el nuevo grupo y se convertirá en el primer argumento de la misma. Es por eso que después de cerrar

Página 91

2.3. Directivas del preprocesador 91

los corchetes no más nombres de argumentos puede seguir. El contenido de macroin­construcción será procesado respecto de cada grupo de argumentos por separado. El más simpleejemplo es encerrar un argumento de nombre entre corchetes:

stoschar macro [Char]

mov al, charSTOSB

Este macroinstruction acepta un número ilimitado de argumentos, y cada uno seráprocesado en estos dos instrucciones por separado. Por ejemplo stoschar 1,2,3 serámontado como las siguientes instrucciones:

mov al, 1STOSBmov al, 2STOSBmov al, 3STOSB

Hay algunas directivas especiales disponibles sólo dentro de las definiciones de macroin­trucciones. Directiva local define nombres locales, que serán sustituidos por únicavalores cada vez que se utiliza la macroinstrucción. Debe ser seguido por los nombres de separaciónnominal con comas. Si el nombre que recibe como parámetro a la directiva local, comienza con unapunto o dos puntos, las etiquetas únicas generadas por cada evaluación de macroinstruction voluntadtienen las mismas propiedades. Esta directiva es generalmente necesaria para las constantes o etiquetasmacroinstrucción que define y utiliza internamente. Por ejemplo:

macro movstr

de movimiento localmover:

lodsbSTOSBprobar al, aljnz movimiento

Cada vez que se utiliza este macroinstruction, movimiento será otro nombre único en suinstrucciones, por lo que no obtendrá un error que normalmente se obtiene cuando se define alguna etiquetamás de una vez.

adelante, atrás y directivas comunes dividen macroinstruction en bloques, cada unouno procesados después de que se termine el procesamiento de los anteriores. Se diferencian en el comportamiento sólo

Page 85: Lenguage asembler FASM_esp

Página 92

92 CAPÍTULO 2. del conjunto de instrucciones

si macroinstruction permite que varios grupos de argumentos. Bloque de instrucciones quesigue adelante Directiva se procesa para cada grupo de argumentos, desde el primero al último­ Exactamente igual que el bloque por defecto (no precedida por ninguna de estas directivas). Bloque quesigue Directiva inversa se procesa para cada grupo de discusión en el orden inverso ­ desdeúltimo al primero. Bloquear que sigue Directiva común se procesa sólo una vez, comúnmente paratodos los grupos de argumentos. Nombre local se define en uno de los bloques está disponible en todo elsiguientes bloques al procesar el mismo grupo de argumentos como cuando fue definido,y cuando se define en el bloque común que está disponible en todos los siguientes bloques nodependiendo del grupo de argumentos se procesa.

He aquí un ejemplo de macroinstruction que creará la tabla de direcciones paracuerdas seguidas por estas cadenas:

nombre strtbl macro, [cadena]comúnnombre de la etiqueta dword

adelantesello localetiqueta dd

adelantecadena db etiqueta, 0

Primer argumento dado a este macroinstruction se convertirá en la etiqueta para la tabla de administraciónvestidos, próximos argumentos deben ser las cuerdas. Primer bloque se procesa sólo una vez ydefine la etiqueta, segundo bloque para cada cadena declara su nombre local y define laentrada de la tabla que sostiene la dirección de esa cadena. Tercer bloque define los datos de cadacadena con la etiqueta correspondiente.

La directiva de iniciar el bloque en macroinstruction puede ser seguido por la primerainstrucción de este bloque en la misma línea, como en el siguiente ejemplo:

macro stdcall proc, [arg]arg empuje inversoproc llamado común

Este macroinstruction se puede utilizar para llamar a los procedimientos que utilizan STDCALL convencionalción, que tiene todos los argumentos empujó en la pila en el orden inverso. Por ejemplofoo stdcall, 1,2,3 será montado como:

empujar 3empujar 2empujar 1foo llamada

Page 86: Lenguage asembler FASM_esp

Página 93

2.3. Directivas del preprocesador 93

Si algún nombre dentro macroinstruction tiene varios valores (que es uno de los terminalesargumentos encerrados entre corchetes o nombre local definidos en el bloque siguienteavance o retroceso Directiva) y se utiliza en el bloque siguiente la directiva común,será reemplazado con todos sus valores, separados por comas. Por ejemplo, lasiguiente macroinstruction pasará todos los argumentos adicionales a la anteriormentemacroinstruction stdcall definido:

macro invoke proc, [arg]Stdcall común [proc], argumento

Se puede utilizar para llamar indirectamente (por el puntero almacenado en la memoria) el procedimiento utilizandoConvención STDCALL.

Macroinstruction interior también operador especial # pueden ser utilizados. Este operador causasdos nombres que se concatenan en un solo nombre. Puede ser útil, porque se hacedespués de los argumentos y los nombres locales se sustituyen por sus valores. La siguientemacroinstruction generará el salto condicional de acuerdo con el argumento cond:

macro jif op1, cond, op2, etiqueta

cmp op1, op2j etiqueta # cond

Por ejemplo hacha jif, ae, 10h, salida será montado como cmp ax, 10h y salida jae in­trucciones.

El operador # también se puede utilizar para concatenar dos cadenas entre comillas en una sola. Tambiénconversión del nombre en una cadena entre comillas es posible, con la «operador, que igualmentese puede utilizar dentro de la macroinstruction. Se convierte el nombre que le sigue en unacadena entre comillas ­ pero tenga en cuenta, que cuando es seguida por un argumento macro que se estáreemplazado con el valor que contiene más de un símbolo, sólo el primero de ellos seráconvertido, como el "operador convierte sólo un símbolo que sigue inmediatamente.He aquí un ejemplo de la utilización de esas dos características:

nombre de la etiqueta macro

nombre de la etiquetasi el nombre utilizadodisplay 'nombre # "está definido, pero no se utiliza.", 13,10

end if

Cuando etiqueta definida con tanta macro no se utiliza en la fuente, macro le advertirá conel mensaje, informando a qué etiqueta se aplica.

Para hacer macroinstruction comportarse de manera diferente cuando algunos de los argumentos sonde algún tipo especial, por ejemplo unas cadenas entre comillas, puede utilizar eqtype comparación

Página 94

Page 87: Lenguage asembler FASM_esp

94 CAPÍTULO 2. del conjunto de instrucciones

operador. He aquí un ejemplo de utilizarla para distinguir una cadena entrecomillada de otroargumento.

mensaje arg macrosi eqtype arg ""str localesjmp fstr arg db, 0Dh, 0Ah, 24h@@:mov dx, str

másmov dx, arg

end ifmov ah, 9int 21h

La macro anterior está diseñado para la visualización de los mensajes en los programas de DOS. Cuando elargumento de esta macro es algún número, etiqueta, o variable, la cadena de esa direcciónse muestra, pero cuando el argumento es una cadena entre comillas, el código creado mostraráesa cadena seguido por el retorno de carro y avance de línea.

También es posible poner una declaración de macroinstruction dentro de otro macroin­construcción, por lo que una macro se puede definir otro, pero hay un problema con tales definicionescausado por el hecho de que personaje no puede ocurrir dentro de la macroinstrucción, ya quesiempre significa el fin de la definición. Para superar este problema, el escape de los símbolosmacroinstruction interior puede ser utilizado. Esto se realiza mediante la colocación de una o más barras invertidas enfrente a cualquier otro símbolo (incluso el carácter especial). Preprocessor ve tal secuenciacomo un solo símbolo, pero cada vez que cumple con ese símbolo durante el pro­ macroinstructionprocesamiento, se corta la barra invertida desde el frente de la misma. Por ejemplo \ se trata comosolo símbolo, pero durante el procesamiento de la macroinstrucción se convierte en el símbolo.Esto permite poner una definición de macroinstruction dentro de otro:

macro ext instrmacro instr OP1, OP2, OP3\ si eq op3

op1 instr, op2más

op1 instr, op2op2 instr, op3

end if

Página 95

2.3. Directivas del preprocesador 95

\

Page 88: Lenguage asembler FASM_esp

ext añadirsub ext

El ext macro se define correctamente, pero cuando se utiliza, el \ y \ convertirse en el y símbolos. Así que cuando se procesa el complemento ext, el contenido de macro se vuelve válidadefinición de una macroinstrucción y de esta manera se convierte en el macro add definido. En elmisma sub manera ext define el sub macro. El uso de \ símbolo no era realmente necesarioaquí, pero que se hace de esta manera para que la definición más clara.

Si se necesitan algunas directivas específicas para macroinstrucciones, como local o comunesdentro de algunos macro incluida esta manera, se puede escapar de la misma manera. Escaparel símbolo con más de una barra invertida también está permitido, lo que permite múltiples nivelesde anidación de las definiciones macroinstruction.

La otra técnica para definir una macroinstrucción por otro, es utilizar la soluciónDirectiva, que llega a ser útil cuando algunos macroinstruction sólo comienza la definiciónde otro, sin cerrarla. Por ejemplo:

macro tmacro [params]params macro comunes

Tmacro fix MACROFix ENDM

define una sintaxis alternativa para macroinstrucciones que definen, que se parece:

Char stoschar MACROmov al, charSTOSB

ENDM

Tenga en cuenta que el símbolo que ha dicha definición personalizada debe ser definido con la directiva de revisión,porque sólo las constantes simbólicas priorizados se procesan antes que el preprocesadorbusca el personaje, mientras que la definición de la macro. Esto podría ser un problema si unonecesaria para realizar algunas tareas adicionales uno al final de dicha definición, pero hayUna característica más que ayuda en estos casos. Es decir que es posible poner cualquier directiva,instrucción o macroinstruction justo después del carácter que termina la macroinstructiony se procesa de la misma manera como si se puso en la siguiente línea.

Página 96

96 CAPÍTULO 2. del conjunto de instrucciones

2.3.4 Estructuras

Directiva estruc es una variante especial de macro directiva que se utiliza para definir estructura de datosturas. Macroinstruction define usando la directiva estruc debe ir precedida de una etiqueta(Como la directiva de definición de datos) cuando se utiliza. Esta etiqueta se atribuye también aal principio de cada nombre que empieza con el punto en el contenido de macroinstrucción. La

Page 89: Lenguage asembler FASM_esp

macroinstruction define usando la directiva estruc puede tener el mismo nombre que algunosotra macroinstruction define usando la directiva macro, estructura macroinstructionno impedirá que el macroinstruction norma sea procesada cuando no hayetiqueta antes de él y viceversa. Todas las reglas y características relativas macroin­ estándarconstrucciones se aplican a estructurar macroinstrucciones.

Aquí está la muestra de estructura macroinstruction:

estruc punto x, y

.x dw x

.y dw y

Por ejemplo mi punto 7,11 definirá estructura etiquetada mi, que consta de dos variables:my.x con valor de 7 y my.y con valor 11.

Si en algún lugar dentro de la definición de la estructura del nombre que consta de un solo punto quese encuentra, se sustituye por el nombre de la etiqueta para el ejemplo dado de la estructura y esteetiqueta no se definirá automáticamente en tal caso, lo que permite personalizar completamentela definición. El siguiente ejemplo utiliza esta función para ampliar la definición de datosdirectiva db con la capacidad para calcular el tamaño de los datos definidos:

db estruc [Datos]

común. datos db.size = $ ­.

Con tal db definición msg '¡Hola!', 13,10 definirá también msg.size constante, igualcon el tamaño de los datos definidos en bytes.

Estructuras de datos que definen abordados por registros o valores absolutos se debe hacerusando la directiva virtual con estructura macroinstruction (véase 2 .2.5) .

Directiva tructuración elimina la última definición de la estructura, al igual que lo hace la purgacon macroinstrucciones y restaurar con constantes simbólicas. También tiene el mismo sín­impuesto ­ debe ser seguido por uno o más nombres de estructura macroinstrucciones, separadopor comas.

Página 97

2.3. Directivas del preprocesador 97

2.3.5 macroinstrucciones repetitivos

La directiva rept es un tipo especial de macroinstruction, lo que hace determinada cantidad deduplicados de la manzana cerrada con llaves. La sintaxis básica es seguida Directiva reptpor número y luego el bloque de fuente encerrada entre los caracteres y. Laejemplo más simple:

rept 5 en otros, dx

hará cinco duplicados de la de Al, línea dx. El bloque de instrucciones se define en elmisma manera que para la macroinstrucción estándar y cualquier operadores y directivas especialesque puede ser utilizado sólo en el interior macroinstrucciones también están permitidos aquí. Cuando el dado

Page 90: Lenguage asembler FASM_esp

count es cero, el bloque es simplemente saltó, como si definió macroinstruction pero nuncausado. El número de repeticiones puede ser seguido por el nombre de símbolo mostrador,que obtendrá reemplazado simbólicamente con el número de duplicados actualmente generada.Así que este:

rept 3 counter

byte # db contador contador

generará líneas:

byte1 db 1Byte2 db 2byte3 db 3

El mecanismo de repetición aplicada a bloques rept es la misma que la utilizada para procesarvarios grupos de argumentos para macroinstrucciones, así como las directivas de avance, comúny inversa se puede utilizar en su significado habitual. Así como macroinstruction:

rept 7 num revertir pantalla 'num

mostrará los dígitos 7­1 como texto. La directiva local de comporta de la misma manera quemacroinstruction interior con múltiples grupos de argumentos, por lo que:

rept 21

sello localetiqueta: etiqueta bucle

generará etiqueta única para cada duplicado.El símbolo del contador por el recuento de defecto de 1, pero se puede declarar base diferente

valor, colocando el número precedido por dos puntos inmediatamente después del nombre del contador.Por ejemplo:

Página 98

98 CAPÍTULO 2. del conjunto de instrucciones

rept 8 n: 0 pxor XMM # n, XMM # n

generará código que borrar el contenido de ocho registros de SSE. Puede definirvarios contadores separados por comas, y cada uno puede tener diferentes base.

El número de repeticiones y los valores de base para los contadores se puede especificar utilizandolas expresiones numéricas con operador reglas idénticas como en el caso de ensamblador.Sin embargo, cada valor utilizado en dicha expresión debe ser un número especificado directamente,o una constante simbólica con valor también ser una expresión que se puede calcular porpreprocesador (en tal caso el valor de la expresión asociada con constante simbólica escalculado primero, y luego sustituido en la expresión externa en lugar de la constante).Si necesita repeticiones basada en valores que sólo se pueden calcular en tiempo de montaje,utilizar una de las directivas de código repitiendo que son procesados por el ensamblador, véase la sección2.2.3.

La directiva IRP itera el único argumento a través de la lista dada de parámetros.La sintaxis se IRP seguido por el nombre de argumento, luego de la coma y luego la listade los parámetros. Los parámetros se especifican en la misma forma como en la invocación de

Page 91: Lenguage asembler FASM_esp

macroinstruction estándar, por lo que tienen que ser separados por comas y cada uno puedeser cerrado con los caracteres <y>. También el nombre de argumento puede ser seguidopor * para marcar que no se puede obtener un valor vacío. Tal bloque:

valor IRP, 2,3,5Valor db

generará líneas:

db 2db 3db 5

Los itera directiva IRP a través de la lista dada de símbolos, que deben ser seguidos por elNombre del argumento, entonces la coma y luego la secuencia de los símbolos. Cada símboloen esta secuencia, no importa si es el nombre de símbolo, carácter de símbolo o cotizarcadena, se convierte en un valor de argumento para una iteración. Si no hay símbolos siguientesla coma, sin iteración se hace en absoluto. En este ejemplo:

IRP reg, al bx ecxXor reg, reg

generará líneas:

xor al, albx xor, bxecx xor, ecx

Los bloques definidos por las directivas del IRP y IRP también se procesan de la misma maneracomo cualquier macroinstrucciones, por lo que los operadores y directivas específicas para macroinstrucciones mayoser libremente utilizados también en este caso.

Página 99

2.3. Directivas del preprocesador 99

2.3.6 preprocesamiento condicional

Directiva partido hace que algunos bloques de la fuente que se preprocesa y se pasa al ensambladorsólo cuando la secuencia dada de símbolos coincide con el patrón especificado. El patrónes lo primero, terminó con una coma, entonces los símbolos que tienen que ser igualada con lapatrón, y, finalmente, el bloque de la fuente, encerrada entre llaves como macroinstrucción.

Hay las pocas reglas para la construcción de la expresión para la coincidencia, en primer lugar es que cualquierde caracteres de símbolos y cualquier cadena entre comillas debe corresponder exactamente como es. En esteejemplo:

partido +, + include 'first.inc'partido +, ­ include 'second.inc'

el primer archivo conseguirá incluido, desde + después de coma ajusta con el + en el patrón, y lasegundo archivo no será incluida, ya que no hay ninguna coincidencia.

Para que coincida con cualquier otro símbolo, literalmente, tiene que estar precedida por = carácter en elpatrón. También para que coincida con el carácter = sí, o la coma, el == y =, construccionestienen que ser utilizados. Por ejemplo, los = un patrón == coincidirá con el a = secuencia.

Si algún símbolo nombre se coloca en el patrón, que coincide con cualquier secuencia que consistede al menos un símbolo y luego este nombre se sustituye con la secuencia coincidente EVerywhere dentro del siguiente bloque, de forma análoga a los parámetros de macroinstrucción.Por ejemplo:

Page 92: Lenguage asembler FASM_esp

Match AB, 0­7Dw a, ba

generará el dw 0,7­0 instrucción. Cada nombre siempre se corresponde con tan sólosímbolos como sea posible, dejando el resto para los siguientes, por lo que en este caso:

Match AB, 1 + 2 + 3 db a

el nombre coincidirá con el símbolo 1, dejando la secuencia + 2 + 3 para ser emparejado con b.Pero en este caso:

Match AB, 1 db a

no habrá nada para b a la altura, por lo que el bloque no conseguirá procesado en absoluto.El bloque de la fuente definida por partido se procesa de la misma manera como cualquier macroin­

cons­, por lo que cualquier operadores específicos para macroinstrucciones se pueden utilizar también en este caso.¿Qué hace "partido" directiva más útil es el hecho, que sustituye a la simbólica

constantes con sus valores en la secuencia ajustada de símbolos (es decir todas partes despuésla coma hasta el comienzo del bloque de fuente) antes de realizar el partido. GraciasA esto se puede utilizar por ejemplo para procesar algunos bloques de la fuente bajo la condiciónque alguna constante simbólica tiene el valor, como se indica:

partido = TRUE, DEBUG include 'debug.inc'

que incluirá el archivo sólo cuando el DEBUG constante simbólica se define con valorTRUE.

Página 100

100 CAPÍTULO 2. del conjunto de instrucciones

2.3.7 Orden de procesamiento

Cuando se combinan varias características del preprocesador, es importante saber el ordenen el que se procesan. Como ya se señaló, la prioridad más alta tiene la soluciónDirectiva y los reemplazos definidos con él. Esto se hace completamente antes de hacercualquier otro procesamiento previo, por lo tanto, esta pieza de la fuente:

V fix macro vacíaV

V fixV

se convierte en una definición válida de un macroinstruction vacía. Se puede interpretar que elfijar directiva y priorizado constantes simbólicas son procesados en una etapa separada, ytodos los demás pre­procesamiento se realiza después de la fuente resultante.

El pre­procesamiento estándar que viene después, en cada línea comienza con el reconocimiento deel primer símbolo. Se inicia con la comprobación de las directivas del preprocesador, y cuando ningunode ellos se detecta, cheques preprocesador si el primer símbolo es macroinstruction.Si no se encuentra una macroinstrucción, se mueve a la segunda símbolo de línea, y comienza de nuevocon la comprobación de directivas, que en este caso es sólo la directiva equ, ya que es laúnica que se produce cuando el segundo símbolo en línea. Si no hay una directiva, el segundosímbolo está marcada para el caso de la estructura macroinstruction y cuando ninguno de loscheques da resultado positivo, las constantes simbólicas son reemplazados por sus valoresy dicha línea se pasa al ensamblador.

Para ver en el ejemplo, supongamos que está definida la macroinstruction llamadafoo y el macroinstruction estructura llamada bar. Esas líneas:

Page 93: Lenguage asembler FASM_esp

equ foofoo bar

sería entonces ambos interpretado como invocaciones de foo macroinstruction, ya que el significadoing del primer símbolo anula el significado de un segundo.

Cuando el macroinstruction genera las nuevas líneas de su bloque de definición, en cadaalinearla primera exploraciones de directivas macroinstruction, y ellos Intérpretes en consecuencia. Todosel otro contenido en el bloque de definición se utiliza para preparar las nuevas líneas, en sustitución de laparámetros con sus valores y luego procesar el símbolo escapar y # y 'operadores. El operador de conversión tiene la prioridad más alta que la concatenación y sicualquiera de ellos opera en el símbolo escapado, el escape se cancela antes de terminar eloperación. Después de esto se completa, la línea recién generado pasa a través de la normapreprocesamiento, como se describió anteriormente.

Aunque las constantes simbólicas en general sólo se sustituyen en las líneas, cuando no pre­se ha encontrado directivas de procesador ni macroinstrucciones, hay algunos casos especialesdonde los reemplazos se realizan en las partes de las líneas que contienen las directivas. Primero

Página 101

2.3. Directivas del preprocesador 101

uno es la definición de constante simbólica, donde las sustituciones se realizan en todas partesdespués de entonces se le asigna la palabra clave equ y el valor resultante de la nueva constante (ver2.3.2 ). El segundo de estos casos es la Directiva partido, donde las sustituciones se hacen enlos símbolos siguientes coma delante de ellos a juego con el patrón. Estas características puedenser usado por ejemplo para mantener las listas, como este conjunto de definiciones:

lista equ

elemento append macro

Coincidir cualquiera, lista \ list lista equ, elemento \partido, lista \ item equ lista \

La lista es constante aquí inicializa con valor vacío, y el macroinstruction appendse puede utilizar para agregar los nuevos elementos en esta lista, separados por comas. Laprimer partido en este macroinstruction sólo se produce cuando el valor de la lista no está vacía (ver2.3.6 ), en tal caso el nuevo valor de la lista es la anterior con la coma yel nuevo artículo añade al final. El segundo partido sólo ocurre cuando la lista es todavíavacío, y en tal caso se define la lista para contener sólo el nuevo elemento. Así a partir dela lista vacía, el append 1 definiría lista equ 1 y el 2 append siguiéndolodefiniría lista equ 1,2. Uno podría necesitar usar esta lista como los parámetros aalgunos macroinstruction. Pero no se puede hacer directamente ­ si foo es la macroinstrucción,a continuación, la lista de foo sería sólo tiene que pasar el símbolo lista como parámetro al macro, ya simbólicaconstantes no se desenrollan en esta etapa. Para este propósito una vez más coincide Directiva vienemuy útil:

params partidos, lista params foo

El valor de la lista, si no está vacío, coincide con la palabra clave params, que se sustituye a continuacióncon valor coincidente cuando se generan las nuevas líneas definidas por el bloque cerrado con

Page 94: Lenguage asembler FASM_esp

apoyos. Así que si la lista tenía un valor de 1,2, la línea anterior generaría la línea que contienefoo 1,2, que luego pasar por el pre­procesamiento estándar.

El otro caso especial es en los parámetros de la directiva rept. La cantidad de repeticiónciones y la base de valor para el contador se puede especificar mediante expresiones numéricas, y sihay una constante simbólica con el nombre no numérico utilizado en tal expresión, pre­procesador intenta evaluar su valor como una expresión numérica y si tiene éxito, reemplazala constante simbólica con el resultado de que el cálculo y continúa para evaluar laexpresión primaria. Si la expresión dentro de que las constantes simbólicas también contiene algunosconstantes simbólicas, preprocesador tratarán de calcular todos los valores necesarios de forma recursiva.

Esto permite realizar algunos cálculos en el momento de preprocesamiento, siempre y cuando todoslos valores utilizados son los números conocidos en la etapa de preprocesamiento. Una sola repeticióncon rept puede ser utilizado para el único propósito de calcular un cierto valor, como en este ejemplo:

Página 102

102 CAPÍTULO 2. del conjunto de instrucciones

definir un b + 4definir b 3rept 1 resultado: a * b + 2 definir resultado c

Para calcular el valor base para el contador resultado, preprocesador sustituye a la b con su valory calcula de forma recursiva el valor de una, obteniendo 7 como resultado, entonces se calculala principal expresión con el resultado de 23. El c continuación, se define con la primeravalor de contador (debido a que el bloque se procesa sólo una vez), que es el resultado de lael cálculo, por lo que el valor de c es simple 23 símbolo. Tenga en cuenta que si b es posteriormente redefinido conalgún otro valor numérico, la próxima vez y de expresión que contiene una se calcula, lavalor de un reflejará el nuevo valor de b, porque la constante simbólica contiene sóloel texto de la expresión.

Hay otro caso especial ­ cuando preprocesador va a comprobar el segundosímbolo en la línea y pasa a ser el carácter de dos puntos (lo que se interpreta entonces porensamblador como definición de una etiqueta), se detiene en este lugar y termina el procesamiento previo deel primer símbolo (así que si es la constante simbólica que se desenrolla) y si todavía aparecepara ser la etiqueta, se realiza el procesamiento previo estándar a partir de el lugar después dela etiqueta. Esto permite colocar las directivas de preprocesador y macroinstrucciones después de laetiquetas, de forma análoga a las instrucciones y directrices elaborados por el ensamblador, como:

empezar: include 'start.inc'

Sin embargo, si la etiqueta se rompen durante el procesamiento previo (por ejemplo, cuando es elconstante simbólica con valor vacío), sólo la sustitución de las constantes simbólicas es con­continuó por el resto de la línea.

Cabe recordar, que los trabajos realizados por el preprocesador son prelimi­operaciones rias sobre los símbolos de los textos, que se realizan en un solo paso sencillo antes de laprincipal proceso de montaje. El texto que es el resultado de pre­procesamiento se pasa a AS­sembler, y luego hace sus múltiples pases en él. Así, las directivas de control, queson reconocidos y procesados sólo por el ensamblador ­ ya que dependen de lavalores numéricos que pueden incluso variar entre pasadas ­ no se reconocen en modo alguno porel preprocesador y no tienen ningún efecto sobre el procesamiento previo. Considere este ejemplo la fuente:

si 0a = 1b equ 2

Page 95: Lenguage asembler FASM_esp

end ifdd b

Cuando se preprocesa, sólo directiva que es reconocido por el preprocesador es laequ, que define simbólica constante b, por lo que más tarde en la fuente del símbolo b se sustituyecon el valor 2. A excepción de esta sustitución, las otras líneas son pases sin cambios ael ensamblador. Así que después de procesamiento previo de la fuente anterior se convierte en:

Página 103

2.4. DIRECTIVAS formateador 103

si 0a = 1end ifdd 2

Ahora, cuando el ensamblador procesa, la condición para el caso de que es falso, y la constanteno se deje definido. Sin embargo simbólica constante b se procesó con normalidad, a pesar de quesu definición se puso justo al lado de la de a. Así que debido a la posible confusiónusted debe tener mucho cuidado cada vez que al mezclar las características de preprocesador yensamblador ­ en estos casos, es importante darse cuenta de lo que la fuente se convertirá después de laprocesamiento previo, y por lo tanto lo que el ensamblador ver y hacer sus múltiples pases en.

2.4 directivas Formatter

Estas directivas son en realidad también una especie de directivas de control, con el fin de con­curricán el formato del código generado.

Directiva formato seguido por el identificador de formato permite seleccionar el formato de salida.Esta directiva debe ser puesto al principio de la fuente. Formato de salida por defectoes un archivo binario plana, que también se puede seleccionar mediante el uso de formato binario Directiva. EsteDirectiva puede ir seguido de la palabra clave y como la citada cadena que especifica el valor por defectoextensión de archivo para el archivo de salida. A menos que se especifique el nombre del archivo de salida de lalínea de comandos, ensamblador utilizar esta extensión al generar el archivo de salida.

directivas USE16 y USE32 fuerzan el ensamblador para generar 16 bits o 32 bits de código,omitiendo el ajuste predeterminado para el formato de salida seleccionado. use64 permite la generación de laCódigo para el largo modo de procesadores x86­64.

A continuación se describen los diferentes formatos de salida con las directivas específicas para estosformatos.

2.4.1 MZ ejecutable

Para seleccionar el formato de salida MZ, utilice formato Directiva MZ. El ajuste de código por defectoeste formato es 16 bits.

Directiva segmento define un nuevo segmento, que debe ser seguido por la etiqueta, cuyo valorserá el número de segmento definido, opcionalmente USE16 o USE32 palabra puede seguir paraespecificará si el código de este segmento debe ser de 16 bits o 32 bits. El origen del segmentoestá alineado con el párrafo (16 bytes). Todas las etiquetas definidas a continuación, tendrán valores relativosal principio de este segmento.

Directiva entrada establece el punto de entrada para MZ ejecutable, debe ser seguido porla dirección de la fecha (nombre del segmento, el colon y el desplazamiento dentro del segmento) de entrada deseadapunto.

Page 96: Lenguage asembler FASM_esp

Directiva pila configura la pila para MZ ejecutable. Puede ser seguido por numéricaexpresión que especifica el tamaño de la pila que se creará de forma automática o por la dirección de la medida

Página 104

104 CAPÍTULO 2. del conjunto de instrucciones

del marco inicial de la pila cuando se quiere configurar la pila de forma manual. Cuando no es piladefinido, la pila de tamaño predeterminado se creará 4.096 bytes.

Directiva montón debe ser seguido por un valor de 16 bits que define el tamaño máximo de Ademásmontón cional en los párrafos (esto es del montón, además de apilar y datos no definidos). Usoamontonarán 0 a asignar siempre único programa de la memoria realmente necesita. Fuente predeterminada del montón es65535.

2.4.2 Portable Executable

Para seleccionar el formato de salida Portable Executable, utilice formato directiva PE, puede serseguido por ajustes de formato adicionales: primero el ajuste subsistema objetivo, que pueden serconsola o GUI para aplicaciones Windows, nativo de controladores de Windows, EFI, EFIbooto EFIruntime para el UEFI, puede ser seguido por la versión mínima del sistemaque el ejecutable está dirigido a (especificar en forma de valor de punto flotante). OpcionalDLL y WDM palabras clave marcan el archivo de salida como una librería de enlace dinámico y controlador WDMrespectivamente, y la palabra clave grande marca el ejecutable como capaz de manejar direccionesmás de 2 GB.

Después de estos ajustes pueden seguir el operador y en la expresión numérica espec­ifying la base de la imagen de PE y luego opcionalmente en el operador seguido por el citadocadena que contiene el nombre del archivo selecciona MZ costumbre derivada para programa de educación física (archivo cuando se especifiqueno es un ejecutable MZ, se trata como un archivo binario ejecutable plana y se convirtió enFormato MZ). El ajuste de este formato de código por defecto es de 32 bits. El ejemplo de totalmentedeclaración ofrecida formato PE:

formato PE GUI 4.0 DLL en 7000000h en 'stub.exe'

Para crear el archivo PE para la arquitectura x86­64, utilice PE64 palabra clave en lugar de la educación física en laDeclaración de formato, en tal caso el código de modo largo se genera de forma predeterminada.

Directiva sección define una nueva sección, que debe ser seguido por cadena entre comillasdefinir el nombre de la sección, a continuación, una o más banderas de sección pueden seguir. Disponiblebanderas son: código, datos de lectura, escritura, ejecutable, compartible, descartables,notpageable. El origen de la sección está alineado a la página (4096 bytes). Ejemplo de declaraciónde la sección PE:

sección '.text' ejecutable legible código

Entre con banderas también de identificadores de datos PE especiales se puede especificar para marcar eltoda la sección como un especial de datos, posibles identificadores son de exportación, importación, recursos ycomposturas. Si la sección está marcada para contener fixups, que se generan de forma automática yno hay más datos necesita ser definido en esta sección. También los datos de recursos se pueden generarautomáticamente desde el archivo de recursos, se puede lograr escribiendo el operador dey el nombre del archivo citado después de que el identificador de recursos. A continuación se presentan los ejemplos de las seccionesque contiene ciertos datos PE:

Page 97: Lenguage asembler FASM_esp

Página 105

2.4. DIRECTIVAS formateador 105

fixups descartables datos sección '.reloc' legiblessección de datos '' .rsrc recurso legible desde 'my.res'

Directiva entrada establece el punto de entrada para Portable Executable, el valor del punto de entradadespués de ellas.

Directiva pila establece el tamaño de la pila para obtener Portable Executable, el valor de la pilatamaño de la reserva deben seguir, opcionalmente valor de pila commit separados con comas puedesiga. Cuando la pila no está definido, se establece de forma predeterminada al tamaño de 4.096 bytes.

Directiva montón elige el tamaño de almacenamiento dinámico para Portable Executable, el valor de la reserva montóntamaño debe seguir, opcionalmente valor del montón cometer separados por comas puede seguir.Cuando se define ningún montón, que está configurado por defecto para el tamaño de 65536 bytes, cuando el tamaño del montóncometer es no especificado, es de forma predeterminada se establece en cero.

Directiva de datos comienza la definición de datos especial PE, debe ir seguido de unode los identificadores de datos (exportación, importación, de recursos o composturas) o por el número de datosentrada en la cabecera PE. Los datos deben ser definidos en próximas líneas, terminaron con los datos finalesDirectiva. Cuando se elige de definición de datos composturas, se generan automáticamente yno hay más datos necesita ser definido allí. Lo mismo se aplica a los datos de recursos cuandoel identificador de recursos es seguido por del operador y citó el nombre de archivo ­ en tal casolos datos se toma del archivo de recursos dado.

El operador rva se puede utilizar dentro de las expresiones numéricas para obtener el RVAdel elemento abordado por el valor que se aplica a, que es el desfase relativo a la basede imagen PE.

2.4.3 Common Object File Format

Para seleccionar Common Object File Format, utilice formato COFF o formato Directiva MS COFF,dependiendo de si desea crear clásico (DJGPP) o variante de COFF de Microsoftpresentar. El ajuste de este formato de código por defecto es de 32 bits. Para crear el archivo de Microsoft deFormato COFF para la arquitectura x86­64, formato utilización ajuste MS64 COFF, en tal caso,código de modo mucho se genera de forma predeterminada.

Directiva sección define una nueva sección, que debe ser seguido por cadena entrecomillada definibleing el nombre de la sección, a continuación, una o más banderas de sección pueden seguir. Sección banderas disponiblescapaz para ambas variantes COFF son de código y datos, mientras que las banderas de lectura, escritura,ejecutable, compartible, descartable, notpageable, linkremove y linkinfo sondisponible sólo con la variante COFF de Microsoft.

Por defecto sección se alinea con la palabra doble (cuatro bytes), en el caso de Microsoft COFFvariante otra alineación puede ser especificado por el operador proporcionar align seguido devalor de alineación (cualquier potencia de dos hasta 8192), entre las banderas de sección.

Directiva extrn define el símbolo externo, debe ser seguido por el nombre desímbolo y, opcionalmente, el operador de tamaño que especifica el tamaño de los datos etiquetados por este símbolo.El nombre del símbolo se puede también precedida de cadena entre comillas que contiene el nombre de lasímbolo externo y el operador as. Algunos ejemplos de declaraciones de símbolos externos:

Page 98: Lenguage asembler FASM_esp

Página 106

106 CAPÍTULO 2. del conjunto de instrucciones

salida extrnextrn '__imp__MessageBoxA @ 16' como MessageBox: dword

Directiva pública declara el símbolo existente como público, que debe ser seguido por lanombre del símbolo, opcionalmente puede ser seguido por el operador as y la cadena entre comillasque contiene el nombre bajo el cual símbolo debe estar disponible como público. Algunos ejemplos desímbolos públicas declaraciones:

principal públicoinicio público como '_start'

Además, con formato COFF es posible especificar símbolo exportado como estática, eshecho precediendo el nombre del símbolo con la palabra clave static.

Al utilizar el formato COFF de la Microsoft, el operador rva se puede utilizar dentro de laexpresiones numéricas para obtener la RVA del tema tratado por el valor que se aplicaa.

2.4.4 Formato Ejecutable y Linkable

Para seleccionar el formato de salida ELF, utilice formato Directiva ELF. El ajuste de código por defectoeste formato es de 32 bits. Para crear el archivo ELF para la arquitectura x86­64, ELF64 formato de usoDirectiva, en tal caso, el código de modo de tiempo se genera por omisión.

Directiva sección define una nueva sección, que debe ser seguido por cadena entrecomillada definibleing el nombre de la sección, a continuación, puede seguir uno o ambos del ejecutable y escribiblebanderas, opcionalmente también se alinean operador seguido por el número que especifica la alineaciónde sección (que tiene que ser la potencia de dos), si no se especifica la alineación, el valor por defectose utiliza, que es 4 u 8, dependiendo de qué formato variante ha sido elegido.

extrn y directivas públicas tienen el mismo significado y la sintaxis como cuando el COFFformato de salida se selecciona (descrito en el apartado anterior).

El operador rva puede no cuando se utiliza también en el caso de este formato (sin embargoarquitectura objetivo es x86­64), convierte la dirección en el desplazamiento con respecto a laGOT mesa, por lo que puede ser útil para crear código independiente de la posición. También hay unaoperador plt especial, que permite llamar a las funciones externas a través del ProcedimientoTabla Vinculación. Incluso puede crear un alias para la función externa que harásiempre ser llamado a través de PLT, con el código como:

extrn 'printf' como _printfprintf = PLT _printf

Para crear el archivo ejecutable, siga la directiva elección formato con el ejecutablepalabra clave y, opcionalmente, el número que especifica la marca del sistema operativo de destino(Por ejemplo el valor 3 marcaría el ejecutable para sistemas Linux). Con este formatoEscogimos este hotel se permite utilizar Directiva entrada seguido por el valor para establecer como punto de entradade programa. Por otra parte, se hace extrn y directivas públicas no disponibles, y

Página 107

Page 99: Lenguage asembler FASM_esp

2.4. DIRECTIVAS formateador 107

en lugar de la sección no debe haber la directiva segmento utilizado, seguido por uno o máspermiso segmento de banderas y opcionalmente un marcador de segmento ejecutable ELF especial,que puede ser intérprete, dinámico o nota. El origen de segmento está alineado a la página(4096 bytes), y las banderas de permisos disponibles son: lectura, escritura y ejecución.

Página 108

108 CAPÍTULO 2. del conjunto de instrucciones

Page 100: Lenguage asembler FASM_esp

Página 109

Capítulo 3

Page 101: Lenguage asembler FASM_esp

Programación de Windows

Con la versión de Windows de ensamblador plana, que incluye el paquete de estándar incluyediseñado para ayudar a escribir los programas para el entorno Windows.

El paquete incluye contiene las cabeceras de 32­bit y 64­bit de Windows programaciónming en la carpeta raíz y la especializada incluyen en las subcarpetas. En general, lacabeceras incluyen los archivos especializados necesarios para que, aunque a veces es posible que prefierapara incluir algunos de los macroinstruction paquetes por sí mismo (ya que algunos de ellos no sonincluido por algunos o incluso la totalidad de las cabeceras).

Hay seis cabeceras para Windows de 32 bits que se pueden elegir, con nombrescomenzando con win32 seguido de una letra de una para utilizar la codificación ASCII, o unaletra w para la codificación WideChar. El win32a.inc y win32w.inc son los básicoscabeceras, la win32ax.inc y win32wx.inc son los encabezados extendidos, proporcionanmacroinstrucciones más avanzados, esas extensiones se discutirán por separado. Finalmentela win32axp.inc y win32wxp.inc son los mismos encabezados extendidos con característica habilitadatura de verificar el recuento de los parámetros en las llamadas a procedimiento.

Hay análogas seis paquetes para el Windows de 64 bits, con nombres que comienzan conwin64. Ofrecen en general la misma funcionalidad que los de Windows de 32 bits,con sólo unas pocas diferencias explican más adelante.

Puede incluir los encabezados de la forma que prefieras, proporcionando la ruta completa o usarla variable de entorno personalizado, pero el método más simple es definir la INCLUYENvariable de entorno correctamente apuntando al directorio que contiene las cabeceras y despuésincluirlos al igual que:

incluir 'win32a.inc'

Es importante señalar que todas las macroinstrucciones, comparados con las directivas internas deensamblador plana, son mayúsculas y minúsculas y la caja inferior se utiliza para la mayoría de ellos. Si deseaprefieren utilizar el otro caso de defecto, usted debe hacer los ajustes apropiadoscon la directiva fija.

109

Página 110

110 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

3.1 encabezados básicos

Los encabezados básicos win32a.inc, win32w.inc, win64a.inc y win64w.inc incluyen ladeclaraciones de Windows convierte y estructuras y proporcionan el conjunto estándar de macroin­trucciones.

3.1.1 Estructuras

Todas las cabeceras permiten la macroinstrucción struct, que permite definir estructuras en lasuna forma más similar a otros ensambladores que la directiva estruc. La definición deestructura debe iniciarse con struct macroinstruction seguido del nombre, yterminó con extremos macroinstruction. En líneas entre las directivas de definición de datos sólo son

Page 102: Lenguage asembler FASM_esp

permitido, con las etiquetas de ser los nombres puros para los campos de la estructura:

struct PUNTOx dd?y dd?

extremos

Con tal definición de esta línea:

point1 PUNTO

declarará la estructura point1 con los campos point1.x y point1.y, dándoleslos valores por defecto ­ los mismos conforme a lo dispuesto en la definición de la estructura (en este casolos valores predeterminados son ambos valores sin inicializar). Pero la declaración de estructura también aceptalos parámetros, en el mismo número como el número de campos en la estructura, y aquellosparámetros, cuando se especifica, anulan los valores predeterminados para los campos. Por ejemplo:

punto2 PUNTO 10,20

inicializa el campo point2.x con el valor 10, y la point2.y con valor 20.La macro estructura no sólo permite declarar las estructuras de tipo dado, sino también

define las etiquetas de los desplazamientos de los campos dentro de la estructura y las constantes de tamaño de cada campoy toda la estructura. Por ejemplo, la definición anterior de la estructura POINT definelas etiquetas punto.x y Punto.y sean los desplazamientos de los campos dentro de la estructura, ysizeof.POINT.x, sizeof.POINT.y y sizeof.POINT como tamaños de la correspondientecampos y de toda la estructura. Las etiquetas de compensación se pueden usar para acceder a laestructuras dirigidas indirectamente, como:

mov eax, [ebx + punto.x]

cuando el registro ebx contiene el puntero a estructura POINT. Tenga en cuenta que el tamaño del campola comprobación se lleva a cabo con dicho acceso también.

Las estructuras en sí también se permiten dentro de las definiciones de la estructura, por lo que las estructuraspuede tener algunas otras estructuras como a los campos:

Página 111

3.1. ENCABEZADOS BÁSICOS 111

struct LÍNEAPunto de iniciofin PUNTO

extremos

Cuando no se especifican los valores predeterminados para los campos de la subestructura, como en este ejemplo, laincumplimientos de la definición del tipo de subestructura se aplican.

Como el valor de cada campo es un solo parámetro en la declaración de la estructura,para inicializar las subestructuras con valores personalizados de los parámetros para cada subestructuradeben agruparse en un único parámetro para la estructura:

line1 LÍNEA <0,0>, <100100>

Esta declaración inicializa cada uno de los campos line1.start.x y line1.start.y con0, y cada uno de los line1.end.x y line1.end.y con 100.

Cuando el tamaño de los datos definidos por algún valor pasa a la estructura declaración esmás pequeño que el tamaño de campo correspondiente, se rellena para que el tamaño no definido con

Page 103: Lenguage asembler FASM_esp

bytes (y cuando es más grande, ocurre el error). Por ejemplo:struct FOOdb datos de 256 dup (?)

extremos

algunos FOO <"ABC", 0>

llena los cuatro primeros bytes de some.data con valores definidos y se reserva el resto.Dentro de las estructuras también sindicatos y subestructuras no identificadas se pueden definir. La

definición de unión debe comenzar con el sindicato y terminar con extremos, como en este ejemplo:

struct BARdd field_1?unióndd field_2?db field_2b?

extremosextremos

Cada uno de los campos definidos en el interior de la unión tiene el mismo desplazamiento y comparten la mismala memoria. Sólo el primer campo de la unión se inicializa con el valor dado, los valores deel resto de los campos se ignoran (sin embargo, si uno de los otros campos requiere más memoriaque el primero, el sindicato se rellena con el tamaño requerido con bytes indefinido). Latodo sindicato es inicializado por el parámetro solo recogida en la declaración estructura, yeste parámetro da valor al primer campo de la unión.

La subestructura sin nombre se define de una manera similar a la unión, sólo se inicia conla línea struct lugar de unión, como:

Página 112

112 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

struct WBBdw palabra?struct

db byte1?db Byte2?

extremosextremos

Tal subestructura sólo toma un parámetro en la declaración de toda la estructura dedefinir sus valores, y este parámetro puede ser en sí mismo el grupo de parámetros que definen cadaCampo de la subestructura. Así que el tipo anterior de la estructura puede quedar declarado como:

mi WBB 1, <2,3>

Los campos dentro de los sindicatos y subestructuras no identificadas se accede como si el fueradirectamente los campos de la estructura de los padres. Por ejemplo con my.byte1 declaración anteriory my.byte2 son etiquetas correctas de los campos de la subestructura.

Las subestructuras y los sindicatos pueden anidarse sin límites para la profundidad de anidamiento:

struct LÍNEAunión

Punto de inicio

Page 104: Lenguage asembler FASM_esp

structdd x1?dd y1?

extremosextremosunión

fin PUNTOstructdd x2?dd y2?

extremosextremos

extremos

La definición de la estructura también se puede basar en parte de la estructura ya definidatipos y hereda todos los campos de esa estructura, por ejemplo:

PUNTO struct PuntoCdd color?

extremos

define la misma estructura que:

Página 113

3.1. ENCABEZADOS BÁSICOS 113

struct PuntoCx dd?y dd?dd color?

extremos

Todas las cabeceras definen el tipo de datos CHAR, que se puede utilizar para definir las cadenas de caracteresen las estructuras de datos.

3.1.2 Importaciones

Las macroinstrucciones importación ayudan a construir los datos de importación de archivos PE (generalmente puesto enla sección separada). Hay dos macroinstrucciones para este propósito. El primerose llama biblioteca, debe ser colocado directamente en el inicio de los datos de importación y quedefine de qué bibliotecas las funciones serán importados. Debe ser seguido por cualquiercantidad de los pares de parámetros, cada par la etiqueta para el cuadro de importaciones dela biblioteca dada, y la cadena citado definir el nombre de la biblioteca. Por ejemplo:

kernel32 biblioteca, 'KERNEL32.DLL', \user32, 'USER32.DLL'

declara a importar de las dos bibliotecas. Para cada una de las bibliotecas, la tabla de importacionesdebe entonces declarado en alguna parte dentro de los datos de importación. Esto se hace con la importaciónmacroinstruction, que necesita primero parámetro para definir la etiqueta de la mesa (lamismos como declarado anteriormente a la biblioteca de macros), y luego los pares de parámetros de cada unoque contiene la etiqueta de puntero importado y la cadena entre comillas definir el nombre defuncionar exactamente como exportado por la biblioteca. Por ejemplo, la declaración de la biblioteca de arriba

Page 105: Lenguage asembler FASM_esp

Puede completarse con las declaraciones de importación siguientes:kernel32 importación, \

ExitProcess, 'ExitProcess'

user32 importación, \MessageBeep, 'MessageBeep', \MessageBox, 'MessageBoxA'

Las etiquetas definidas por primera parámetros en cada par pasan a la dirección de macro importaciónlos punteros de palabras dobles, que después de cargar el PE están llenos de las direcciones a lasprocedimientos exportados.

En lugar de cadena entre comillas para el nombre del procedimiento para importar, el número puede serdado a definir importación por ordinal, como:

aduana de la importación, \ByName, 'nombrefunción', \ByOrdinal, 17

Página 114

114 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

Las macros de importación optimizar los datos de importación, por lo que sólo las importaciones para las funciones quese utilizan en alguna parte en el programa se colocan en las tablas de importación, y si algunos de importacionesmesa estaría vacío de esta manera, toda la biblioteca no se hace referencia a todos. Para estorazón por la que es útil tener la tabla completa de importación para cada biblioteca ­ el paquetecontiene tales tablas para algunas de las bibliotecas estándar, se almacenan en el APIA ySubdirectorios y APIW importar las variantes ASCII y WideChar de las funciones de la API.Cada archivo contiene una tabla de importación, con la etiqueta minúscula el mismo que el nombre del archivo.Así que las tablas completas para importar de las bibliotecas Kernel32.dll y USER32.DLLse puede definir de esta manera (asumiendo que su figuran el medio ambiente variable apunta a ladirectorio que contiene el paquete incluye):

kernel32 biblioteca, 'KERNEL32.DLL', \user32, 'USER32.DLL'

incluir "apia \ kernel32.inc 'incluir 'apiw \ user32.inc'

3.1.3 Procedimientos (32­bit)

Encabezados para Windows de 32 bits proporcionan cuatro macroinstrucciones para llamar procedimientos conparámetros pasados en la pila. El stdcall llama directamente el procedimiento especificado por elprimer argumento mediante el convenio de llamada STDCALL. El resto de argumentos pasados amacro definen los parámetros a procedimientos y se almacenan en la pila en orden inverso.La macro de invocación hace lo mismo, sin embargo, llama al procedimiento indirectamente, a través de lapuntero marcado por el primer argumento. Así invocar se puede utilizar para llamar a los procedimientosa través de punteros definidos en las tablas de importación. Esta línea:

invocar MessageBox, 0, szText, szCaption, MB_OK

es equivalente a:

stdcall [MessageBox], 0, szText, szCaption, MB_OK

y ambos generan este código:

Page 106: Lenguage asembler FASM_esp

empujar MB_OKempujar szCaptionempujar szTextempujar 0llamar [MessageBox]

El ccall y cinvoke son análogas a la stdcall e invocar, pero deberíanutilizarse para llamar a los procedimientos que utilizan la convención de llamada C, donde el marco de pilatiene que ser restaurado por la persona que llama.

Para definir el procedimiento que utiliza la pila de parámetros y variables locales, sedebe utilizar el macroinstruction proc. En su forma más simple, tiene que ser seguido por lanombrar a los nombres de procedimiento y luego por los todos los parámetros que se necesitan, como:

Página 115

3.1. ENCABEZADOS BÁSICOS 115

proc WindowProc, hwnd, WMSG, wparam, lparam

El coma entre el nombre del procedimiento y el primer parámetro es opcional. Lainstrucciones del procedimiento deben seguir en las próximas líneas, que terminaron con la endp macroin­construcción. El marco de pila se configura automáticamente en la entrada al procedimiento, la EBPregistro se utiliza como base para acceder a los parámetros, por lo que debe evitar el uso de este registropara otros fines. Basan EBP­Los nombres de los parámetros configurados se utilizan para definiretiquetas, que se pueden utilizar para acceder a los parámetros como variables regulares. Por ejemploel mov eax, [hwnd] instrucción dentro del procedimiento definido como en el ejemplo anterior, esequivalente a mov eax, [ebp + 8]. El alcance de esas etiquetas se limita al procedimiento,por lo que puede utilizar los mismos nombres para otros fines fuera del procedimiento dado.

Desde cualquier parámetro se empujan en la pila como dobles palabras al llamar talesprocedimientos, las etiquetas de los parámetros se definen para marcar los datos de palabras dobles porpor defecto, sin embargo usted puede especificar los tamaños para los parámetros si lo desea, siguiendoel nombre de parámetro con dos puntos y el operador de tamaño. El ejemplo anterior puede serreescrito esta manera, que es de nuevo equivalente:

proc WindowProc, hwnd: DWORD, WMSG: DWORD, wparam: DWORD, lparam: DWORD

Si especifica un tamaño menor que el doble palabra, la etiqueta dada se aplica al menorparte de toda la palabra doble almacenado en la pila. Si se especifica un tamaño más grande, al igual quemás puntero de palabra quad, los dos parámetros de palabras dobles se definen para mantener este valor,pero se etiquetan como una variable.

El nombre del procedimiento puede ser seguido también por cualquiera de la stdcall o c palabra clave paradefinir la convención de llamada que utiliza. Cuando no se especifica este tipo, se utiliza el valor por defecto,lo que equivale a STDCALL. Luego también la palabra clave usos puede seguir, y despuésque la lista de registros (separados únicamente por espacios) que se almacenará automáticamente enentrada al procedimiento y restaurado en la salida. En este caso la coma después de la lista de registrosy antes de que se requiere que el primer parámetro. Así que la sentencia de procedimiento con todas las funcionespodría tener este aspecto:

stdcall WindowProc proc utiliza ebx esi edi, \hwnd: DWORD, WMSG: DWORD, wparam: DWORD, lparam: DWORD

Declarar la variable local puede utilizar el macroinstruction locales, seguido deuna o más declaraciones separadas por comas, cada uno que consiste en el nombre dela variable seguido de dos puntos y el tipo de variable ­ ya sea uno de los tipos estándar(Debe estar en mayúsculas) o el nombre de estructura de datos. Por ejemplo:

Page 107: Lenguage asembler FASM_esp

locales hDC: DWORD, rc: RECT

Para declarar un array local, puede seguir el nombre de la variable por el tamaño de la matriz adjuntaentre corchetes, como:

str locales [256]: BYTE

Página 116

116 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

La otra manera de definir las variables locales es declarar en el interior del bloque comenzócon "locales" macroinstruction y terminó con "endl", en este caso pueden ser definidosal igual que los datos regulares. Esta declaración es el equivalente de la muestra anterior:

gentedd DCh?rc RECT

endl

Las variables locales pueden ser declaradas en cualquier lugar dentro del procedimiento, con la única límitesbilitación de que tienen que ser declarada antes de ser utilizados. El ámbito de aplicación de etiquetas paralas variables definidas como locales se limitan a dentro del procedimiento, se puede utilizar el mismonombres para otros fines ajenos al procedimiento. Si usted le da algunos valores inicializados alas variables declaradas como local, el macroinstruction genera las instrucciones que leinicializar estas variables con los valores dados y pone estas instrucciones al mismoposición en el procedimiento, donde se coloca la declaración.

La ret colocarse en cualquier lugar dentro del procedimiento, genera el código completo necesariopara salir correctamente el procedimiento, la restauración de la estructura de pila y los registros utilizados porprocedimiento. Si usted necesita para generar la instrucción de retorno prima, utilice la tecla de acceso RETN,o seguir el ret con el parámetro de número, lo que también hace que se puede interpretar comoinstrucción individual.

Para recapitular, la definición completa del procedimiento puede tener este aspecto:

proc WindowProc utiliza ebx esi edi, hwnd, WMSG, wparam, lparamlocales hDC: DWORD, rc: RECT; las instruccionesenriar

endp

3.1.4 Procedimientos (64­bit)

En Windows de 64 bits sólo hay una convención de llamada, y por lo tanto sólo dos macroin­Se proporcionan construcciones para llamar procedimientos. El fastcall llama directamente la dimientodure especificado por el primer argumento mediante la convención estándar de Windows de 64 bitssistema. La macro de invocación hace lo mismo, sino indirectamente, a través del puntero marcadopor el primer argumento. Parámetros son proporcionados por los argumentos que siguen, y quepuede ser de cualquier tamaño de hasta 64 bits. Las macroinstrucciones utilizan registro RAX como temporalalmacenamiento cuando algún valor de parámetro no se puede copiar directamente en la pantalla utilizando elinstrucción mov. Si el parámetro está precedido con addr palabra, se trata como una direccióny se calcula con la instrucción de lea ­ por lo que si la dirección es absoluta, se consiguecalculado como RIP relativo, evitando así la generación de una reubicación en el caso de los archivos decomposturas.

Page 108: Lenguage asembler FASM_esp

Debido a que en Windows de 64 bits se pasan los parámetros de punto flotante de una manera diferentemanera, tienen que estar marcada por anterior a cada uno de ellos con la palabra flotador. Pueden

Página 117

3.1. ENCABEZADOS BÁSICOS 117

ser o doble palabra o palabra quad en tamaño. He aquí un ejemplo de llamar a algunos OpenGLprocedimientos con parámetros haga doble de precisión o de precisión simple:

invocar glVertex3d, flotar 0,6, ­0,6 flotar, flotar 0.0invocar glVertex2f, flotar dword 0.1, flotar dword 0.2

El espacio de pila para parámetros se asignan antes de cada llamada y liberó inmediatamentedespués de ella. Sin embargo, es posible asignar este espacio sólo una vez por todas las llamadas en el interioralgún bloque dado de código, para este propósito hay marco y macros endf previstas.Deben ser utilizados para encerrar un bloque, dentro de la cual el registro RSP no se alteraentre el procedimiento de llama y que impide que cada llamada de la asignación de espacio de pila paraparámetros, ya que está reservado sólo una vez por la macro marco y luego liberados en el extremo porla macro ENDF.

marco; asignar espacio de pila sólo una vezinvocar TranslateMessage, msginvocar DispatchMessage, msg

ENDF

La macro proc para Windows de 64 bits tiene la misma sintaxis y características como de 32 bits uno(Aunque opciones STDCALL y C son de ninguna utilidad en su caso). Cabe señalar, sin embargoque en la convención de llamada utilizado en Windows de 64 bits primeros cuatro parámetros se pasan enregistros (RCX, RDX, R8 y R9), y por lo tanto, a pesar de que está reservado un espaciopara ellos en la pila y se etiqueta con el nombre proporcionado en la definición del procedimiento,esos cuatro parámetros no inicialmente residir allí. Deben tener acceso a los directamentela lectura de los registros. Pero si se necesitan los registros para ser utilizado para algún otro propósito,se recomienda almacenar el valor de dicho parámetro en la celda de memoria reservadapara ello. El inicio de tal procedimiento puede ser:

proc WindowProc hwnd, WMSG, wparam, lparammov [hwnd], rcxmov [WMSG], edxmov [wparam], r8mov [lparam], r9; ahora registros se pueden utilizar para otros fines; y los parámetros todavía se puede acceder más tarde

3.1.5 Personalización de los procedimientos

Es posible crear un código personalizado para el marco de procedimiento cuando se utiliza proc macroin­construcción. Hay tres variables simbólicas, prólogo @ proc, epílogo @ proc ycerca @ proc, que definen los nombres de macroinstrucciones que proc pide a la entrada enel procedimiento, el retorno de procedimiento (creado con ret macro) y al final del procedi­dure (hecho con endp macro). Estas variables pueden ser redefinidos para que apunte a otromacroinstrucciones, para que todo el código generado con proc macro se pueden personalizar.

Page 109: Lenguage asembler FASM_esp

Página 118

118 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

Cada uno de esos tres macroinstrucciones toma cinco parámetros. El primero ofreceuna etiqueta de punto de entrada del procedimiento, que es el nombre del procedimiento también. El segundoes un campo de bits que contiene algunas banderas, en particular el bit 4 se establece cuando se supone que la persona que llamapara restaurar la pila, y se aclaró lo contrario. El tercero es un valor que especificael número de bytes que los parámetros para el procedimiento de toma en la pila. El cuartouno es un valor que especifica el número de bytes que debe reservarse para los localesvariables. Por último, el quinto un último parámetro es la lista de registros separados por comas,qué procedimiento declarado para ser utilizado y que por lo tanto debe ser salvado por prólogoy restaurada por epílogo.

La macro prólogo aparte de generar código que establecería el marco de pilay el puntero a las variables locales tiene que definir dos variables simbólicas, parmbase @ procy localbase @ proc. El primero debe proporcionar la dirección de base para que elparámetros residen, y el segundo, deben proporcionar la dirección por donde lo locallas variables residen ­ por lo general en relación con EBP / registro RBP, pero es posible utilizar otrobasa si puede garantizarse que los punteros serán válidas en cualquier punto dentro de laprocedimiento en el que se accede a los parámetros o variables locales. También es hasta el prólogomacro para hacer cualquier alineaciones necesarias para la implementación procedimiento válido; el tamañode las variables locales previstos como cuarto parámetro en sí misma puede no estar alineado en absoluto.

El comportamiento predeterminado de proc se define por prologuedef y epiloguedef macros(En caso de defecto no es necesario para el cierre de la macro, por lo que el cierre @ proc tiene un vacíovalor). Si es necesario volver a los valores predeterminados después se utilizaron algunas personalizaciones, quese debe hacer con las tres líneas siguientes:

prólogo @ proc equ prologuedefepílogo @ proc equ epiloguedefcerca @ proc equ

Como un ejemplo de prólogo modificado, a continuación es la macroinstrucción que implementaapilar­sondeo prólogo para Windows de 32 bits. Tal método de asignación se debe utilizarcada vez que el área de variables locales puede conseguir más grande que 4096 bytes.

macro sp_prologue procname, bandera, parmbytes, localbytes, reglistLoc localesloc = (localbytes + 3) y (3) noparmbase @ proc equ ebp + 8localbase @ proc equ ebp­locsi parmbytes | localbytesempuje ebpebp mov, espsi localbyteslocalbytes repetición shr 12byte mov [esp ­% * 4096], 0final de repetición

Page 110: Lenguage asembler FASM_esp

Página 119

3.1. ENCABEZADOS BÁSICOS 119

sub esp, locend ifend ifreg IRP, reglist \ empuje reg \

prólogo @ proc equ sp_prologue

Puede ser fácilmente modificado para utilizar cualquier otro método de sondeo pila del programador depreferencia.

Las cabeceras de 64 bits proporcionan un conjunto adicional de macros prólogo / epílogo, quepermitirá definir procedimiento que utiliza RSP acceder a los parámetros y variables locales (por loRegistro RBP es libre de utilizar para cualquier otro por procedimiento) y también asigna la comúnespacio para todas las llamadas a procedimientos realizados en el interior, por lo que fastcall o invocar macros llamadosno es necesario asignar cualquier espacio de pila sí mismos. Es un efecto similar al que seobtenido poniendo el código dentro del procedimiento en bloque de bastidor, pero en este caso elasignación de espacio de pila de llamadas a procedimiento se fusionó con la asignación de espacio paravariables locales. El código dentro de dicho procedimiento no debe alterar registro RSP en modo alguno.Para cambiar a este comportamiento de 64 bits proc, utilice las siguientes instrucciones:

prólogo @ proc equ static_rsp_prologueepílogo @ proc equ static_rsp_epiloguecerca @ proc equ static_rsp_close

3.1.6 Exportaciones

La exportación macroinstruction construye los datos de exportación para el archivo PE (que debería serya sea colocado en la sección marcada como de exportación, o dentro del bloque de la exportación de datos. La primeraargumento debe ser citado cadena que define el nombre del archivo de biblioteca, y el resto debeser cualquier número de pares de argumentos, primero de cada par es el nombre de procedimiento dedefinida en algún lugar dentro de la fuente, y el segundo es la cadena entre comillas contieneel nombre con el que este procedimiento debe ser exportado por la biblioteca. Esta muestra:

exportación 'MYLIB.DLL', \MyStart, 'Inicio', \MyStop, 'Pare'

define la tabla de exportación de dos funciones, que se definen con los nombres MyStarty MyStop en las fuentes, sino que será exportado por la biblioteca con los nombres más cortos. Lamacroinstrucción cuidar de la clasificación alfabética de la mesa, que es requerido porFormato PE.

3.1.7 Modelo de objetos componentes

La macro interfaz permite declarar la interfaz del tipo de objeto COM, la primeraparámetro es el nombre de la interfaz, y luego los nombres consecutivos de los métodos

Página 120

Page 111: Lenguage asembler FASM_esp

120 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

debe seguir, como en este ejemplo:

interfaz ITaskBarList, \QueryInterface, \AddRef, \Suelte, \HrInit, \AddTab, \DeleteTab, \ActivateTab, \SetActiveAlt

La macro comcall puede entonces utilizarse para llamar al método del objeto dado. Laprimer parámetro de esta macro debe ser la palanca para oponerse, el segundo debe sernombre de la interfaz COM implementada por este objeto, y después el nombre de método yparámetros a este método. Por ejemplo:

ebx comcall, ITaskBarList, ActivateTab, [hwnd]

utiliza el contenido del registro EBX como asa para objeto COM con el ITaskBarListinterfaz, y llama al método ActivateTab de este objeto con el parámetro [hwnd].

También puede utilizar el nombre de la interfaz COM de la misma manera como el nombre de los datosestructura, para definir la variable que contendrá el mango de objetar de tipo dado:

ShellTaskBar ITaskBarList

La línea anterior define la variable, en la que el mango a objeto COM se puede almacenar.Después de almacenar allí el identificador de un objeto, sus métodos pueden ser llamados con el cominvk.Esta macro sólo necesita el nombre de la variable con interfaz asignada y el nombrede método como primera dos parámetros, y luego parámetros para el método. Así que laActivateTab método de objeto cuyo mango se almacena en la variable ShellTaskBarcomo se define anteriormente puede ser llamado de esta manera:

cominvk ShellTaskBar, ActivateTab, [hwnd]

que hace lo mismo que:

comcall [ShellTaskBar], ITaskBarList, ActivateTab, [hwnd]

3.1.8 Recursos

Hay dos formas de crear recursos, se trata de incluir el archivo de recursos externo creadocon algún otro programa, y el otro es crear sección de recursos manualmente.Este último método, aunque no necesita ningún programa adicional para estar involucrado, esmás laborioso, pero las cabeceras estándar proporcionan la asistencia ­ el conjunto de primariamacroinstrucciones que sirven como ladrillos para componer la sección de recursos.

Página 121

3.1. ENCABEZADOS BÁSICOS 121

El macroinstruction directorio debe ser colocado directamente en el inicio de cantealiado construido datos de recursos y define qué tipos de recursos que contiene. Debe ser

Page 112: Lenguage asembler FASM_esp

seguido por los pares de valores, el primero de cada par es el identificador del tipo dede recursos, y la segunda la etiqueta de subdirectorio de los recursos del tipo dado.Puede verse así:

directorio RT_MENU, menús, \RT_ICON, iconos, \RT_GROUP_ICON, group_icons

Los subdirectorios se pueden colocar en cualquier parte del área de recursos después de la dirección principaltoria, y que tienen que ser determinadas con los macroinstruction recursos, lo que requiereprimer parámetro a ser la etiqueta del subdirectorio (que corresponde a la entrada en principaldirectorio) seguido por los tríos de los parámetros ­ en cada uno de dicha entrada el primer parámetrodefine el identificador de recurso (este valor es elegido libremente por el programador yse utiliza entonces para acceder al recurso determinado del programa), el segundo especifica elel lenguaje y la tercera es la etiqueta de recursos. Equipara estándar deben ser utilizados paracrear identificadores de idioma. Por ejemplo se puede definir el subdirectorio de menús estamanera:

menús de recursos, \1, LANG_SPANISH + SUBLANG_DEFAULT, main_menu, \2, LANG_SPANISH + SUBLANG_DEFAULT, other_menu

Si el recurso es de tipo para el que el idioma no importa, el lenguaje de identificaciónfier LANG_NEUTRAL debe utilizarse. Para definir los recursos de diversos tipos haymacroinstrucciones especializados, que deben ser colocados dentro del área de recursos.

Los mapas de bits son los recursos con identificador de tipo RT_BITMAP. Para definir el mapa de bitsrecurso de utilizar el macroinstruction mapa de bits con el primer parámetro es la etiqueta dede recursos (correspondiente a la entrada en el subdirectorio de mapas de bits) y el segundosiendo la citada cadena que contiene la ruta de acceso al archivo de mapa de bits, como:

program_logo mapa de bits, 'logo.bmp'

Existen dos tipos de recursos relacionados con los iconos, el RT_GROUP_ICON es el tipo deel recurso, que tiene que estar relacionado con uno o más recursos de tipo RT_ICON, cada unouno que contiene una sola imagen. Esto permite declarar imágenes de diferentes tamaños y coloresprofundidades bajo el identificador de recurso común. Este identificador, se da al recurso deTipo RT_GROUP_ICON puede entonces pasa a la función LoadIcon, y elegirála imagen de dimensiones adecuadas del grupo. Para definir el icono, utilice el iconomacroinstruction, con el primer parámetro es la etiqueta de recursos RT_GROUP_ICON, guienteguido por los pares de parámetros que declaran las imágenes. El primer parámetro en cada pardebe ser la etiqueta de recurso RT_ICON, y el segundo la cadena citado contencióning la ruta de acceso al archivo de icono. En la variante más simple, cuando el grupo de icono contiene sólouna imagen, que se verá así:

Página 122

122 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

icono main_icon, icon_data, 'main.ico'

donde el main_icon es la etiqueta para la entrada en el subdirectorio de recursos para RT_GROUP_ICONtipo, y la icon_data es la etiqueta para la entrada de tipo RT_ICON.

Los cursores se definen de una manera similar a los iconos, con el RT_GROUP_CURSOR yRT_CURSOR tipos y la macro cursor, que tiene parámetros análogos a lostomada por el icono macro. Así que la definición de cursor puede tener este aspecto:

Page 113: Lenguage asembler FASM_esp

cursor my_cursor, cursor_data, 'my.cur'

Los menús tienen el tipo RT_MENU de recursos y se definen con el menú macroin­construcción seguido por algunos otros que definen los elementos dentro del menú. El menú en sí durasólo un parámetro ­ la etiqueta de recursos. El elemento de menú se define el elemento en el menú,se tarda hasta cinco parámetros, pero sólo dos son necesarios ­ el primero es el citadocadena que contiene el texto para el artículo, y el segundo es el valor del identificador (quees el valor que será devuelto cuando el usuario selecciona el elemento dado en el menú). Lamenuseparator define un separador en el menú y no requiere ningún parámetro.

El tercer parámetro opcional de menuitem especifica las banderas de recursos menú. Ya Estáson dos de estas banderas disponibles ­ MFR_END es la bandera para el último elemento de la lista dada,y la MFR_POPUP marca que el tema dado es el submenú, y los siguientes artículosserá partidas que componen dicho submenú hasta que se encuentra el elemento con bandera MFR_END. LaBandera MFR_END puede también dar como parámetro a la menuseparator y es el únicoparámetro esta macroinstruction puede tomar. Para la definición de menú esté completa, cadasubmenú debe estar cerrada por el elemento con bandera MFR_END, y todo el menú debe tambiénser cerrado de esta manera. He aquí un ejemplo de la definición completa del menú:

menú main_menumenuitem '& File', 100, MFR_POPUP

menuitem '& Nueva', 101menuseparatormenuitem "& Salir ', 109, MFR_END

menuitem '& Ayuda', 900, MFR_POPUP + MFR_ENDmenuitem '& Acerca de ...', 901, MFR_END

El cuarto parámetro opcional de menuitem especifica las banderas del estado para el dadoartículo, estas banderas son los mismos que los utilizados por funciones de API, como MFS_CHECKED oMFS_DISABLED. Del mismo modo, el quinto parámetro puede especificar las banderas de tipo. Por ejemploesto definirá elemento activado con una marca de radio­botón:

menuitem 'Selección', 102,, MFS_CHECKED, MFT_RADIOCHECK

Los cuadros de diálogo tienen el tipo RT_DIALOG de recursos y se definen con lamacroinstrucción de diálogo seguido de cualquier número de elementos definidos con dialogitemterminó con la EndDialog.

Página 123

3.1. ENCABEZADOS BÁSICOS 123

El diálogo puede tomar hasta parámetros once, primero de siete que se requiera. Primeroparámetro, como de costumbre, especifica la etiqueta del recurso, segundo está conteniendo la cadena entre comillasel título del cuadro de diálogo, los siguientes cuatro parámetros especifican la horizontal y verticalcoordenadas, la anchura y la altura de la ventana de cuadro de diálogo, respectivamente. Laséptimo parámetro especifica los indicadores de estilo de la ventana de cuadro de diálogo, el octavo opcionaluno especifica los indicadores de estilo prolongados. El parámetro noveno puede especificar el menú paraventana ­ debe ser el identificador de recurso de menú, el mismo que el especificado en elsubdirectorio de los recursos con el tipo RT_MENU. Finalmente el parámetro décima y undécimase puede utilizar para definir el tipo de letra para el cuadro de diálogo ­ primero de ellos debe ser el citadocadena que contiene el nombre de la fuente, y el segundo uno el número que define el tamaño defuente. Cuando estos parámetros opcionales no se especifican, el valor por defecto de MS Sans Serif detamaño 8 se utiliza.

Page 114: Lenguage asembler FASM_esp

Este ejemplo muestra la macroinstrucción de diálogo con todos los parámetros excepto parael menú (que se quedó con valor en blanco), los opcionales están en la segunda línea:

diálogo sobre, "Acerca de", 50,50,200,100, WS_CAPTION + WS_SYSMENU, \WS_EX_TOPMOST, 'Times New Roman', 10

El dialogitem tiene ocho parámetros necesarios y uno opcional. En primer parámetrodebe ser la cadena entre comillas que contiene el nombre de la clase del elemento. El segundo parámetropuede ser la cadena que contiene texto de la cita para el elemento, o identificador de recursos encaso cuando el contenido del artículo tiene que ser definido por algún recurso adicional (como elelemento de clase estática con el estilo SS_BITMAP). El tercer parámetro es el identificador deel artículo, utilizado para identificar el artículo por las funciones de la API. Próximos cuatro parámetros especificanlas coordenadas verticales, horizontales, la anchura y la altura del punto respectivamente. Laoctavo parámetro especifica el estilo para el elemento, y el noveno opcional especifica elindicadores de estilo prolongados. Un ejemplo de definición de elemento de diálogo:

'BOTÓN' dialogitem, 'OK', IDOK, 8,8,45,15, WS_VISIBLE + WS_TABSTOP

Y un ejemplo de elemento estático que contiene de mapa de bits, suponiendo que existe un mapa de bitsrecurso de identificador 7:

dialogitem "estático", 7,0,10,50,50,20, WS_VISIBLE + SS_BITMAP

La definición de los recursos de diálogo puede contener cualquier cantidad de artículos o ninguno en absoluto, yhay que siempre terminaba con macroinstruction EndDialog.

Los recursos de tipo RT_ACCELERATOR se crean con macroinstruc­ aceleradorción. Después del primer parámetro siendo tradicionalmente la etiqueta de recurso, debe seguirlos tríos de parámetros ­ las banderas de aceleración seguido por el código de tecla virtual o ASCIIcarácter y el valor del identificador (que es como el identificador del elemento de menú). Ladefinición acelerador simple puede tener este aspecto:

main_keys acelerador, \FVIRTKEY + FNOINVERT, VK_F1,901, \FVIRTKEY + FNOINVERT, VK_F10,109

Página 124

124 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

La información de versión es el recurso de tipo RT_VERSION y se crea con elversionInfo macroinstruction. Después de la etiqueta del recurso, el segundo parámetroEspecifica el sistema operativo del archivo de PE (por lo general debería ser VOS__WINDOWS32), terceraparámetro el tipo de archivo (los más comunes son VFT_APP para el programa y para VFT_DLLbiblioteca), cuarto subtipo (generalmente VFT2_UNKNOWN), el identificador de idioma quinto, sextola página de códigos y luego los parámetros de cadena citados, siendo los pares de nombre de la propiedady el valor correspondiente. La información de la versión más simple se puede definir como:

versionInfo vinfo, VOS__WINDOWS32, VFT_APP, VFT2_UNKNOWN, \LANG_SPANISH + SUBLANG_DEFAULT, 0, \

'DescripcionArchivo "," Descripción del programa', \'LegalCopyright "," Derecho de autor, etcétera', \'FileVersion', '1.0', \'ProductVersion', '1.0'

Otros tipos de recursos se pueden definir con macroinstruction resDatos, que tomasólo un parámetro ­ la etiqueta de los recursos, y puede ser seguido por cualquier instrucción

Page 115: Lenguage asembler FASM_esp

la definición de los datos, terminó con Endres macroinstruction, como:manifiesta resDatosarchivo 'manifest.xml'

Endres

Codificación 3.1.9 Texto

Las macroinstrucciones recursos utilizan la directiva du definir cualquier cadena Unicode en el interiorrecursos ­ ya que esta directiva simplemente cero se extiende a los personajes a los valores de 16 bits, paralas cadenas que contiene algunos caracteres no ASCII, el du pueden necesitar ser redefinida. Paraalgunas de las codificaciones de las macroinstrucciones redefinir el du a generar el Unicodetextos correctamente se proporcionan en el subdirectorio de codificación. Por ejemplo, si la fuentetexto está codificado con Windows 1250 página de códigos, tal línea se debe poner en algún lugarel principio de la fuente:

incluir "codificación \ win1250.inc '

3.2 encabezados extendidos

El archivos win32ax.inc, win32wx.inc, win64ax.inc y win64wx.inc proporcionan toda lafuncionalidad de las cabeceras de base e incluye algunas características más que participaron más complejomacroinstrucciones. Además, si hay un formato PE se declara antes de incluir la extensióncabeceras, los encabezados declaran automáticamente. El archivos win32axp.inc, win32wxp.inc,win64axp.inc y win64wxp.inc son las variantes de encabezados extendidos que adicionalmentealiado realizar comprobando el número de parámetros a llamadas de procedimiento.

Página 125

3.2. ENCABEZADOS EXTENDIDA 125

3.2.1 Parámetros del procedimiento

Con los encabezados extendidos los macroinstrucciones para llamar procedimientos permiten mástipos de parámetros que sólo los valores dobles de palabras como con encabezados básicos. Ante todo,cuando la citada cadena se pasa como un parámetro para el procedimiento, que se utiliza para definir stringdatos indicaban que entre el código y pasa al procedimiento el puntero palabra doble a estacadena. Esto permite definir fácilmente las cadenas que no tienen que ser re­utilizado, sólo en ellínea de llamar al procedimiento que requiere punteros a esas cadenas, como:

invocar MessageBox, HWND_DESKTOP, "Mensaje", "Leyenda", MB_OK

Si el parámetro es el grupo que contiene algunos valores separados por comas, se tratade la misma manera tan simple citado parámetro de cadena.

Si el parámetro está precedido por la palabra addr, significa que este valor es una direccióny esta dirección se debe pasar a procedimiento, incluso si no se puede hacer directamente ­ comoen el caso de las variables locales, que tienen direcciones relativas al registro EBP / RBP. EnCaso 32 bits del registro EDX se utiliza temporalmente para calcular el valor de la dirección ypasarlo al procedimiento. Por ejemplo:

invocar RegisterClass, addr wc

en caso de que el wc es la variable local con la dirección ebp­100h, generará estesecuencia de instrucciones:

edx lea, [ebp­100h]

Page 116: Lenguage asembler FASM_esp

empuje edxllamar [RegisterClass]

Sin embargo, cuando la dirección indicada no es relativo a cualquier registro, se almacena directamente.En el caso de 64 bits se permite el prefijo addr incluso cuando sólo se utilizan cabeceras estándar,

ya que puede ser útil incluso en caso de las direcciones regulares, porque impone RIP­relativacálculo de la dirección.

Con cabeceras de 32 bits, si el parámetro está precedido por la palabra doble, es tratadocomo valor de 64 bits y pasado al procedimiento como dos parámetros de 32 bits. Por ejemplo:

invocar glColor3d, doble 1.0, 0.1 doble, doble 0,1

pasará los tres parámetros de 64 bits como seis palabras dobles a procedimiento. Si el parámetrosiguiendo doble está el operando de la memoria, no debe tener operador de tamaño, el dobleya que funciona como la anulación de tamaño.

Por último, las llamadas a procedimientos pueden ser anidados, que es llamado a un solo procedimiento puede serse utiliza como el parámetro a otro. En tal caso, el valor devuelto en EAX / RAX por elprocedimiento anidado se pasa como parámetro al procedimiento que está anidado en. Amuestra de tales anidación:

invocar MessageBox, <invocar GetTopWindow, [hwnd]>, \"Mensaje", "Leyenda", MB_OK

No hay límites para la profundidad de anidación de las llamadas a procedimientos.

Página 126

126 CAPÍTULO 3. VENTANAS DE PROGRAMACIÓN

3.2.2 Estructuración de la fuente

Los encabezados extendidos permiten algunas macroinstrucciones que ayudan con fácil estructurar elprograma. El .data y .code son sólo los accesos directos a las declaraciones de secciones parade datos y para el código. El macroinstruction .end se debe poner al final del programa,con un parámetro que especifica el punto de entrada del programa, y también de forma automáticagenera la sección de importación utilizando todas las tablas globales de importación. En Windows de 64 bitsla .end alinea automáticamente la pila en 16 bytes límite.

El macroinstruction .if genera un trozo de código que comprueba algunos simplescondición en el tiempo de ejecución, y dependiendo del resultado de la ejecución continúasiguiente bloque o se salta. El bloque debe terminar con .endif, pero anteriormente también.elseif macroinstruction podría ser utilizado para iniciar el código que se ejecutará bajoalguna condición adicional, cuando el anterior no se cumplieron, y el .else como el últimoantes .endif para empezar el bloque que se va a ejecutar cuando todas las condiciones eranfalsa.

La condición se puede especificar mediante el uso de operador de comparación ­ uno de los =, <,>, <=,> = Y <> ­ entre los dos valores, primero de los cuales debe ser o bien registrarse o memoriaoperando. Los valores se comparan como los sin firmar, a menos que la expresión de comparaciónestá precedida por la palabra firmado. Si usted proporciona valor único sencillo como condición, lo haráprobarse a ser cero, y la condición será verdadera sólo si no lo es. Por ejemplo:

.si eaxenriar

.endif

genera las instrucciones, que se saltan la ret cuando el EAX es cero.También hay algunos símbolos especiales reconocidos como condiciones: ZERO? es cierto

cuando la bandera ZF se establece, en la misma forma en que el CARRY ?, REGÍSTRATE ?, DESBORDAMIENTO? y la paridad?

Page 117: Lenguage asembler FASM_esp

corresponden al estado de la FQ, SF, DE y banderas PF.Las condiciones simples como anteriormente pueden estar compuestos en complejo ex condicional

pressions utilizando el Y, | operadores para la conjunción y la alternativa, el operador denegación, y paréntesis. Por ejemplo:

.si eax <= 100 y (ecx | edx)inc ebx

.endif

generará las instrucciones de comparación y salto que hará que el bloque dado para llegarejecutado sólo cuando EAX es inferior o igual 100 y al mismo tiempo al menos una de lasECX y EDX no es cero.

El macroinstruction .while genera las instrucciones que se repetirá la ejecuciónel bloque dado (terminó con macroinstruction .endw), siempre y cuando la condición es verdadera.La condición debe seguir el .while y puede ser especificado en la misma forma que parala .si. El par de .repeat y .hasta macroinstrucciones definir el bloque que lo hará

Página 127

3.2. ENCABEZADOS EXTENDIDA 127

ser ejecutado varias veces hasta que se cumpla la condición dada ­ esta vez la condicióndebe seguir el macroinstruction .hasta, colocado al final del bloque, como:

.repeatañadir ecx, 2

.hasta ecx> 100