Ejemplo de código ensamblador
Las pseudoinstrucciones son comandos especiales que brindan cierto control sobre el ensamblaje. Su formato es similar a los comandos de operación ordinarios y se pueden agregar a cualquier ubicación en el ensamblador, pero no generan instrucciones de máquina. Muchas directivas requieren parámetros, que están representados por el campo "expresión" en la definición de la directiva. Se puede utilizar cualquier valor o expresión como parámetro. Diferentes ensambladores permiten el uso de diferentes directivas Las siguientes directivas solo son aplicables a los sistemas MASM51, pero algunas directivas básicas se pueden usar en la mayoría de los ensambladores, por lo que cuando use otras versiones de ensambladores, solo preste atención a ellas. . Las pseudoinstrucciones que se pueden utilizar en MASM51 son: ORG Establecer la dirección de inicio del programa END Marcar el final del código fuente EQU Definir la constante SET Definir el número entero DATA Asignar un valor al símbolo de tipo byte BYTE Asignar un valor a el símbolo de tipo de byte WROD Asigne un valor al símbolo de tipo de palabra BIT Asigne un nombre a la dirección de bit ALTNAME Reemplace la palabra reservada DB con un nombre personalizado Cargue datos de tipo byte en un bloque de almacenamiento continuo DW Cargue datos de tipo de palabra en un bloque de almacenamiento continuo DS Reserva un bloque de almacenamiento continuo o carga bytes específicos. INCLUDE Inserte el archivo fuente en el programa TITLE Agregue una línea de encabezado al archivo de lista NOLIST No genere el archivo de lista durante el ensamblaje NOCODE Cuando se realiza un ensamblaje condicional, si la condición es falsa, no se generará la lista I ORG Directiva ORG. para establecer el siguiente valor de dirección del programa, su formato de parámetro es: Expresión ORG La expresión puede ser un valor específico o contener un nombre de variable. Si contiene un nombre de variable, debe asegurarse de que la variable que contiene ya esté definida (ya tenga un valor específico) cuando se encuentre la directiva por primera vez; de lo contrario, el valor no definido se reemplazará por 0, lo que provocará un error. En el archivo de lista se imprimirá la dirección de las instrucciones definidas por ORG. Una vez que las instrucciones se traducen a código de máquina, se almacenan en la ROM del sistema. En términos generales, los códigos de máquina siempre se colocan en la memoria uno tras otro, pero algunos códigos tienen requisitos especiales para sus ubicaciones. Normalmente hay cinco elementos de interrupción, que deben colocarse en 0003H, 000BH, 0013H, 001BH y 0023H; de lo contrario, se producirá un error. Si no realizamos un procesamiento especial durante la programación y generamos códigos de máquina uno tras otro, no podemos garantizar que estos códigos estén exactamente en estas posiciones designadas y se producirán errores durante la ejecución. En este momento, debe utilizar la directiva ORG. .
Consulte el siguiente ejemplo: INT_0 Equ 1000htime_0 Equ 1010hint_1 Equ 1020htime_1 controlador LJMP INT_0; controlador de interrupción programada 0 LJMP INT_0; controlador de interrupción programada 0 LJMP INT_0; controlador de interrupción externa 1 LJMP TIME_1; controlador de interrupción programada 1 puerto serie de interrupción: NOPEND El programa anterior tiene se ha ensamblado en el siguiente archivo de lista: La familia Cybernetic Micro Systems 8051 El ensamblador de la familia Cybernetic Micro Systems 8051, versión 3.03 Página 108-26-96 1000 = INT_0 EQU 1000H1010 = TIME_0 EQU 1010H1020 = INT_1 EQU 1020H1030 = TIME_1 EQU 040 = ECUADOR SERIE 1040H0000 0111 AJMP START; Saltar al punto de inicio del programa principal 0002 021000 LJMP INT_0; Controlador de interrupción externa 0 0005 021010 Controlador de interrupción temporizada 0 0008 021020 Controlador de interrupción externa 1 000B ; 21030 LJMP TIME_1; Controlador de interrupción temporizada 1 000E 021040 LJMP SERIAL; Inicio del programa de interrupción: 0011 00 NOP0000 FINAL Ensamblador de la familia Cybernetic Micro Systems, versión 3.03. 00INT_1 .I 1040 . . .I 1030; Errores Z00 (0000) Del archivo de lista, la imagen del código en la ROM se puede dibujar de la siguiente manera: Código
01H
11H <. /p>
02H
10H
00H
02H
10H
10H
10H
02H
10H 14H
15H
Código
02H
10H
30H
Dirección
16H
17H
18H
1
9H
1AH
1BH
1CH
1DH
1EH
1FH
20H
Código
02H
10H
40H
00H
Dirección
21H
22H
23H
24H
25H
26H
27H
28H
29H
2AH
2BH
Como se muestra en la figura, el código de cada programa de interrupción se encuentra en su dirección designada. Una vez que ocurre una interrupción, el programa correspondiente se puede ejecutar inmediatamente. En cuanto a la parte sin rellenar de la imagen (como 02H), varía según el programador, normalmente FFH o 00H. END La declaración END marca el final del código fuente. El ensamblador deja de ejecutarse cuando encuentra la declaración END. Si no hay una declaración END, el ensamblador informará un error. La declaración END tiene un parámetro, que puede ser un parámetro con un valor de 0 o una expresión. El formato es: marca: el valor de la expresión END es la dirección del programa y se escribe en el archivo HEX como un registro especial. . Si se omite la expresión, el archivo HEX tiene un valor de 0. EQU EQU y otros símbolos definen directivas para asignar valores a los símbolos que aparecen en un programa. Los requisitos para estos y otros símbolos del mismo nombre son que las letras mayúsculas y minúsculas de cualquier longitud sean intercambiables y deben comenzar con una letra. Los símbolos definidos por la directiva del signo igual forman parte de la tabla de símbolos del conjunto. La directiva del signo igual se presenta en dos formas. Uno usa EQU y el otro usa el carácter "=", es decir, nombre del símbolo EQU expresión nombre del símbolo = expresión Estas dos formas tienen el mismo efecto. El nombre del símbolo está a la izquierda y su valor correspondiente está a la derecha. El valor puede ser una variable, otro nombre simbólico o una expresión. Simplemente encuentre el valor de la expresión en dos escaneos; de lo contrario, se informará un error al hacer referencia al nombre del símbolo. Si el valor de la expresión es una cadena, sólo se toman los dos últimos caracteres. Si la longitud de la cadena es 1, el byte alto se establece en 0 y el valor del nombre del símbolo se imprime en el listado del programa. Los nombres de símbolos definidos por la directiva del signo igual no permiten cambiar el nombre. Si se redefine el nombre de un símbolo definido, el ensamblador informará un error y el nombre del símbolo se tratará como un nombre de símbolo recién definido, por lo que es mejor no cambiarle el nombre en el programa. Por ejemplo: 0469= ABC EQU 469H0464= El primer nombre simbólico ABC está en 469H, y el segundo XY está asignado a ABC-5, por lo que el valor de XY es 469H-5 = 464H, el valor de JK es 752 (es decir, 2F0H) y el valor de XYJK es XY. JK = 464H 2F0H = 754H. La directiva SET es algo similar a la directiva equivalente. Define un nombre de símbolo de tipo entero. El formato del nombre del símbolo es la expresión SET. La única diferencia entre la directiva SET y la directiva equivalente es el nombre del símbolo definido por SET. directiva. El programa se puede definir varias veces sin informar un error. Ejemplo: 002D= K57 CONJUNTO 101101B8707= K57 CONJUNTO 34567 V. DATA y BYTE DATA y BYTE se utilizan para definir la unidad de almacenamiento de tipo byte y darle un nombre simbólico a la unidad de almacenamiento de tipo byte para que se pueda acceder a la unidad de almacenamiento a través del nombre simbólico en el programa para ayudar a comprender el programa.
5. BYTE y FECHA La diferencia entre BYTE y FECHA es similar a EQU y SET. La directiva BYTE no puede definir el cambio de nombre. 6. PALABRA La directiva WORD es similar a la directiva DATE, excepto que la directiva WORD define el nombre del símbolo del tipo de palabra. El formato es: nombre del símbolo WORD expresión 0027 = VAL31 WORD 390021 = PAR7 WORD 21H. bytes. Por supuesto, dado que el conjunto de lenguaje ensamblador 8051 no tiene operaciones de palabras, solo se pueden procesar bytes durante la ejecución del programa. La directiva WROD simplemente permite al usuario definir una ubicación de almacenamiento y tratarla como una palabra. 7. BIT La directiva BIT define el nombre simbólico del tipo de bit. El formato es: nombre del símbolo expresión BIT El valor de la expresión aquí es la dirección del bit. Por ejemplo: 002F= LOG3 BIT 470014= Y731 BIT 14H 8. ALTNAMEALTNAME La directiva ALTNAME proporciona a los usuarios una forma de definir nombres de símbolos para reemplazar palabras reservadas. Después de eso, el nombre de la respuesta y las palabras reservadas reemplazadas se pueden usar igualmente en el programa. . Se puede reemplazar cualquier nombre de respuesta de tipo de palabra reservada. El formato de la directiva de nombre de reemplazo es: ALTNAME palabra reservada, ejemplo de nuevo nombre: 0002= ALTNAME R2 COUNT013A EA MOV A, R2013B E502 MOV A, COUNT IX, DB La directiva DB se utiliza para definir un área de almacenamiento continuo, que es el Unidad de almacenamiento del área de almacenamiento. El parámetro de la pseudoinstrucción es el valor de la unidad de almacenamiento. No hay límite en el número de variables en la expresión, siempre que esta pseudoinstrucción pueda acomodarse en una línea del programa fuente. Etiqueta: expresión DB Siempre que la expresión no sea una cadena, a cada expresión se le asigna un valor de byte. La evaluación de los valores de expresión se maneja como 16 bits, pero solo los 8 bits inferiores se tienen en cuenta en el resultado. Si aparecen varias expresiones en la directiva DB, deben estar separadas por comas. Si hay cadenas en la expresión, están separadas por comillas simples "'" y cada carácter ocupa un byte. La cadena se almacenará sin cambios en cada byte, sin convertir letras minúsculas en mayúsculas. Por ejemplo, DB 00H 01H 03H 46HDB '¡Esto es una demostración!' 10. DW DW asigna un valor a un área de almacenamiento en bytes (hexadecimal). El formato es: Etiqueta: DW Ejemplo de expresión: 0000 3035 D46B DW 12341, 54379. 10110100101110B0004 2D2E0006 4344 4243 DW 'ABCD', 'BC', 'A'000A 0041000C 2868 02E8 DW 456*375h, 83 295h, 'YZ', 72h-456001 0 595A FEAA 1 1.DS DS es una directiva de contenido de almacenamiento de definición, que define un área de almacenamiento y llena el área de almacenamiento con la directiva DS especificada. La directiva DS contiene dos variantes. La primera variante define el número de bytes de la longitud del área de almacenamiento en ensamblaje. bytes, por lo que la primera variante no se puede activar cuando se utiliza la directiva DS. La segunda variante representa el valor del número real que ingresa a estas unidades. Cuando estos no se procesan. Bytes, se puede activar la segunda variante. Cuando se pueda alimentar la segunda variable, estos bytes no se procesarán. En el siguiente ejemplo, DS 9 en 0173 se deja vacío con 9 bytes y la siguiente instrucción se compila en 017C; la ubicación 1BH en 017C se deja vacía y estos bytes se llenan con 27H. El formato de la instrucción DS es el siguiente: Etiqueta: Expresión 1 Define la longitud del área de almacenamiento en bytes. Esta variable no se puede omitir. La expresión 2 es opcional y su valor se utiliza para llenar el área de almacenamiento definida, los 8 bits inferiores. Si se omite, esta parte de la unidad de almacenamiento no se procesa.
Ejemplo: 0000 04 INC A0001 DS 9000A 04 INC A000B DS 1BH, 27H0026 04 INC A XII, INCLUDE La directiva INCLUDE se utiliza para vincular archivos fuente, es decir, insertar un archivo fuente en otro archivo fuente. Tiene un parámetro que apunta al nombre del archivo que se insertará, el nombre del archivo puede incluir el nombre de la unidad y el nombre de la ruta. Si el archivo no tiene extensión, el valor predeterminado es ASM, pero el archivo a insertar debe estar abierto. Si la operación de apertura del archivo falla, se generará un error fatal y el ensamblador dejará de ejecutarse. En cambio, el ensamblador lee el contenido del archivo y lo procesa basándose en el código fuente. Cuando se encuentra un carácter de conexión de archivo, el ensamblador devuelve la directiva INCLUDE y continúa procesando el programa fuente a continuación. Los archivos insertados comienzan con "I" en la lista de programas. Esta versión de ensamblaje de macro admite el anidamiento de niveles y se puede insertar cualquier cantidad de archivos con la directiva INCLUDE en el programa. Sin embargo, en general, la cantidad de archivos que DOS permite abrir es limitada si el usuario necesita abrir uno más grande. cantidad de archivos, debe agregar FILES = 40 o más en el archivo CONFIG.SYS. Si hay más de 8 niveles de anidamiento o demasiados archivos abiertos, se generará un error fatal y se cancelará el ensamblaje. La directiva INCLUDE proporciona un dispositivo de programación modular que inserta módulos mientras el ensamblador procesa el programa principal. Si bien esto no equivale a vincular y ensamblar un módulo de objeto reiniciable, tiene una funcionalidad similar. El archivo fuente insertado no debe contener la directiva END; de lo contrario, el ensamblador dejará de ejecutarse prematuramente. Además, antes de compilar el programa principal, se deben compilar todos los archivos fuente adicionales para generar los archivos HEX y LST correspondientes. Dado que no hay una directiva END en el archivo adjunto, el compilador mostrará el error "Sin declaración final" al compilar el archivo adjunto, pero esto no afecta el vínculo con el programa principal. El siguiente es un ejemplo del uso de la directiva INCLUDE. El archivo fuente MAIN.ASM del programa principal es: MAIN.ASMORG 27HSTART: CLR AMOV R3, AICLUDE MOD1INC R5INCLUDE MOD2.ASMDEC R3END START El programa principal es un archivo fuente completo con. Directiva FINAL. El programa principal START es un archivo fuente completo con la directiva END. Hay dos directivas INCLUDE en el programa, que vinculan dos archivos adicionales MOD1.ASM y MOD2.ASM al programa principal. A continuación se muestran los dos archivos. MOD1.ASMMOV R2, #31HMOV R5, #18H; MOD2.ASMMOV R6, #47HANL A, #07HMOV R1, A. Tenga en cuenta que MOD1.ASM y MOD2.ASM no tienen instrucciones END. Primero debe compilar MOD1.ASM y MOD2.ASM, y luego compilar MAIN.ASM. Debido a que los dos últimos archivos no tienen la directiva END, se producirán errores durante la compilación. No se preocupe, continúe con el siguiente trabajo y obtendrá. los resultados correctos.
Así es como surgió la lista de archivos: Ensamblador de la serie 8051 de Cybernetic Micro Systems, versión 3.03 Página 1; MOD2.ASMMOV R6, #47HANL A, #07HMOV R1, A08-27-96; A0028 FB MOV R3, AI INCTROL MOD1I; MOD1.ASMI0029 7A31 MOV R2, #31HI002B 7D18 MOV R5, #18HI002D 0D INC R5I INCTROL MOD2.ASMI; Nombre Tipo Valor INICIO. .L 0000 . $ TITLE línea de título aquí Las líneas escalares son escalares que aparecen en los encabezados de página, a diferencia de las cadenas normalmente definidas. Las líneas escalares no están entrecomilladas. Al compilar, la cadena desde el primer carácter imprimible después de $TITLE hasta el carácter de retorno se trata como un escalar. La longitud máxima del escalar es de 60 caracteres. Se omiten las líneas basadas en el escalar y la línea de encabezado es una línea en blanco. Si la directiva TITLE está en una página, la fila escalar está contenida en esa página; de lo contrario, el título aparece en el encabezado de la página siguiente. 14. PÁGINA La directiva PÁGINA se utiliza para formar un nuevo borde en la definición. Su formato es: expresión $PAGE. Si la expresión es predeterminada, se iniciará una nueva página. Si la expresión existe, se redefinirá el número de filas por página. El montaje comienza con una página de 66 líneas. Las 55 líneas restantes de cada página se utilizan para imprimir el programa fuente, excepto la página de salida, que es adecuada para papel de impresora estándar. Si el valor de la variable es inferior a 66, el número de líneas de origen imprimibles en la página se reducirá en consecuencia. La longitud mínima de página es 12; si es inferior a 12, solo se imprime una línea de código fuente por página, excepto en la parte superior de la página. La variable de longitud de la página es un byte de 16 bits, por lo que la página más larga se puede definir como 65535 líneas. En este momento, la impresión de la página se convierte en impresión continua, que a menudo se usa cuando se muestra una lista de programas en la pantalla o se imprime una lista de programas. un rollo de papel Impresión continua, si se usa la opción /N al comienzo del ensamblaje, la longitud de la página es 65535: $ LIST $ NOLIST La directiva LIST genera la lista original del programa principal compilado, pero incluso sin esta directiva, el El ensamblador generará automáticamente la lista. Sin embargo, si necesita continuar generando listas después de usar la directiva NOLIST, debe usar la directiva LIST. La directiva NOLIST no genera una lista para ensamblar, y todas las declaraciones que contengan esta directiva y las siguientes no se ingresarán en el archivo de lista. Si no necesita un archivo de lista y no necesita mostrar una lista de programas, puede comenzar el ensamblaje sin el anexo L y agregar la directiva NOLIST a la primera línea de su código fuente.
La diferencia entre usar la directiva NOLIST y agregar /L es que la directiva NOLIST se puede agregar a un programa fuente y usarse junto con la directiva LIST para que ciertas partes del programa fuente no produzcan listas. Por el contrario, si no se agrega /L, no se generará la lista del programa. Sin embargo, independientemente de si existe una directiva $NOLIST, se detectarán errores cuando se compile el programa y se mostrará la línea de código fuente incorrecta y el mensaje de error XVI en la pantalla de compilación. El formato de NOCODE es la directiva $NOCODENOCODE. que en la estructura de ensamblaje condicional No se generará una lista de valores condicionales verdaderos y falsos durante la compilación. La estructura del ensamblaje condicional se describe a continuación. Sin esta directiva, el ensamblador generaría una lista para todos los condicionales, independientemente de si sus valores verdadero o falso son verdaderos. Sin embargo, los condicionales falsos no generan código objeto. Por otro lado, la directiva NOCODE hace que la lista de ensamblaje contenga solo las piezas utilizadas por el ensamblador, por lo que cuando se usa la directiva NOCODE, la lista de programas no se corresponde línea por línea con el programa fuente. Este artículo proviene del blog de CSDN. Indique la fuente al reimprimir: /sunnf/archive/2008/10/23/3129370.aspx
.