asswembler

download asswembler

of 5

Transcript of asswembler

  • 7/25/2019 asswembler

    1/5

    Programacin en lenguaje ensamblador/Primeros conceptosDe Wikilibros, la coleccin de libros de texto de contenido libre.La CPU x86 tiene 14 registros internos y bsicos. Algunos son realmente de 32 bits pero por ahora se utilizar elmodo real que es compatible con el procesador 8086 (igualmente accesibles a la parte alta de stos registros,inclusive en el modo real). Los registros son los siguientes (estos registros son de 16 bits nombrados de la siguientemanera, a excepcin del registro de banderas).

    Registros de uso general AX: Acumulador (AL:AH) BX: Registro base (BL:BH) CX: Registro contador (CL:CH) DX: Registro de datos (DL:DH)

    Registros de segmento (Solo se pueden usar para los usos mencionados a excepcin de ES) DS: Registro del segmento de datos ES: Registro del segmento extra SS: Registro del segmento de pila CS: Registro del segmento de cdigo

    Registros punteros (Tambin pueden tener uso general) BP: Registro de apuntadores base SI: Registro ndice fuente DI: Registro ndice destino

    Registros especiales (Solo se pueden usar para los usos mencionados) SP: Registro apuntador de la pila IP: Registro apuntador de la siguiente instruccin F: Registro de banderas (8 bits)

    La parte baja del registro AX se llama AL y la parte alta AH. La parte baja del registro BX se llama BL y la parte altaBH, y tambin ocurre lo mismo con el registro CX y DX.Bits del registro de banderasOverflow

    NV (Apagado): No hay desbordamiento OV (Encendido): Si lo hay

    Direction UP: Hacia adelante DN: Hacia atras

    Interrupts

    DI: Desactivadas EI: Activadas

    Sign PL: Positivo NG: Negativo

    Zero NZ: No es cero ZR: Si lo es

    Auxilary carry NA: No hay acarreo auxiliar AC: Hay acarreo auxiliar

    Parity PO: Impar PE: Paridad par

    Carry NC: No hay acarreo CY: Si lo hay

    La sintaxis es la siguienteNombre de la instruccin Operando 1, Operando 2, Operando 3, Operando 4, ...El nombre de la instruccin est formada por 2 o 3 letras, los operandos pueden ser registros, constantes o direccionesde memoria. La cantidad de operandos depender de la instruccin.Por ejemplo:MOV AL, [1000]Esta instruccin indica que se copie el valor de la porcin de la memoria que est en la ubicacin 1000 (En

    1

  • 7/25/2019 asswembler

    2/5

    hexadecimal) a la parte baja del registro AX (AL). Cuando un operando es un valor de una direccin de memoria,sta direccin se escribe entre corchetes, recordar que el operando 1 es el destino y el operando 2 es el origen. Ycuando es una constante depender del ensamblador, en el caso del debug (Un programa que sirve para crear y editaraplicaciones que viene con el DOS) se interpretarn como hexadecimales, en los siguientes ejemplos se interpretarque las constantes son nmeros hexadecimales.Tambin se puede tomar un valor de la memoria apuntado por un registro, por ejemplo:MOV AL, [DI]

    DI est apuntado al valor que est en la memoria que ser copiado al registro AL. El nombre MOV viene de lapalabra move, que es una palabra del ingles que significa mover. Justamente la instruccin mencionada significa,mover el valor apuntado por DI a AL.Tambin se puede copiar el valor de un registro a otroMOV AL, BLEn este caso se copia el valor de BL a ALIgualmente se puede copiar el valor de la parte baja de un registro a la parte alta de otro registroMOV CH, DLAs como tambin operar con las partes altasMOV AH, DHInclusive se puede copiar el valor de un registro a una direccin de memoriaMOV [1000], ALIgualmente apuntada la direccin de memoria a DIMOV [DI], ALY tambin con los registros completos (Solamente completos en el procesador 8086)

    MOV AX, DXTambin trabajar con los registros completos para todos los procesadores de 32 bitsMOV EBX, EDXEn ste caso mueve la totalidad del registro DX a la totalidad del registro BX, en ste caso se est trabajando con losregistros en forma extendida (32 bits), pero hay que tener precaucin ya que el procesador 8086 no interpretarcorrectamente sta instruccin (El procesador 8086 es obsoleto por sta desventaja y otras ms, por ejemplo slo

    puede direccionar 1 MB), adems el debug no puede interpretar sta instruccin.No se puede realizar lo siguiente porque no se pueden pasar valores en la memoria sin la intervencin de un registro,adems no se ha especificado el tamaoMOV [1000], [2000]Igualmente no se puede hacer lo siguienteMOV [DI], [1000]As como tambin lo siguienteMOV [DI], [SI]Sin embargo lo siguiente es correcto

    MOV [1000], AXPero no lo siguiente porque no se est especificando el tamaoMOV [SI], 1FLo correcto sera lo siguienteSi se quiere transferir un byteMOV byte [SI], 1FSi se quiere transferir una palabra (16 bits)MOV word [SI], 1FSi se quiere transferir una doble palabra (32 bits)MOV dword [SI], 1FDireccionamientosDado que es necesario transferir datos, existen los siguientes tipos de direccionamiento:

    Valor de un registro Ejemplo: MOV AX, DX Constante Ejemplo: MOV BX, 1AB

    Valor apuntado por una constante Ejemplo: MOV AX, [1000] Apuntado por un registro de segmento y uno de offset (Solo puede ser BX, BP, DI o SI) Ejemplo: MOV CX,ES:[DI]

    Apuntado por DS y la suma de BX con una constante o apuntado por SS y la suma de BP con una constanteEjemplo: MOV DX, DS:[BP+1000]

    Apuntado por DS y la suma de DI o SI con una constante Ejemplo: MOV BX, DS:[SI+6F9] Apuntado por DS y la suma de BX y SI o BX y DI con una constante o apuntado por SS y la suma de BP y

    SI o BP y DI con una constanteEjemplosMOV AX, DS:[BX][SI]+1FB9

    2

  • 7/25/2019 asswembler

    3/5

    MOV DX, SS:[BP][DI]+C9F8ste programa sumar 1000 + 2000 y volcar el resultado en AX

    En DOS, en el smbolo de sistema, escribir Cls y luego Debug. Aparecer un guin (De sta manera seinicia el debug, con el comando Debug).

    Escribir "A 0100" y presionar la tecla Enter. "A" es una orden del debug que permite ensamblarinstrucciones a partir de una direccin (Normalmente se empieza en la direccin 0100h), el Debuggeneralmente utiliza nmeros hexadecimales.

    Aparecer lo siguiente ("xxxx" es el segmento en donde est el programa, aparecer un nmero en stelugar, que ser el valor de CS).-A 0100xxxx:0100

    Escribir las siguientes instrucciones en assemblerMOV AX, 1000MOV BX, 2000ADD AX, BXINT 20

    Presionar la tecla Enter Escribir "p 0100" (Con sta orden se ejecuta el programa y se mostrarn los sucesivos cambios de los

    registros). Luego aparece "el programa ha terminado de forma normal" o "Program terminated normally".Luego (Al terminar el programa), antes del mensaje que indica el fin del programa, aparece lo siguiente (Bloque deestado):AX=3000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=XXXX ES=XXXX SS=XXXX CS=XXXX IP=0108 NV UP EI PL NZ NA PE NC0CB3:0108 CD20 INT 20El Debug muestra el estado de los registros antes de ejecutar la instruccin que muestra en el bloque de estado.El programa hace lo siguienteLa instruccin MOV AX, 1000 ordena que AX tome el valor de 1000.La instruccin MOV BX, 2000 ordena que BX tome el valor de 2000.La instruccin ADD AX, BX ordena que AX sea sumado con BXPor lo tanto es lgico que AX tenga el valor 3000 luego de la instruccin "ADD AX, BX", ya que se le sum a AX elvalor de BX.La instruccin INT 20 ordena provocar una interrupcin que es 20h, que le cede el control a DOS, y DOS termina el

    programa. Una interrupcin es una interrupcin de la ejecucin de un programa para realizar una determinada tarea,a veces el control no vuelve al programa original (Por ejemplo en el caso de INT 20h en el DOS).Las interrupciones pueden ejecutarse por las circunstancias ms variadas, por ejemplo el usuario presiona una tecla ysto provoca una interrupcin y se ejecuta las instrucciones del controlador de teclado y almacena la tecla presionada,

    luego le devuelve el control al programa original (Con una instruccin sin operandos llamada IRET).Cuando ocurre una interrupcin se empuja a la pila CS e IP, y stos 2 registros se modifican para apuntar a la rutinadeseada. Los valores de stos 2 registros estn almacenados en la tabla de vectores de interrupcin (sta est ubicadaen el comienzo de la memoria en 0000:0000). Para encontrar stos 2 valores (Llamado vector de interrupcin), semultiplica el nmero de interrupcin por 4 (El offset), y se lee 4 bytes en el offset mencionado y en el segmento 0000.Los primeros 2 bytes (El primer word) del vector de interrupcin es el offset (IP), y los 2 restantes (El segundo word)es el segmento (CS).En el caso de la interrupcin 20h fue provocada por el mismo programa, para evitar interrupciones que no sean

    provocadas por el programa se utiliza la instruccin CLI y para luego activarlas se utiliza STI, pero no se puedenenmascarar las interrupciones menores de 8 ya que no son enmascarables. Hay que tener en cuenta que en laarquitectura x86, el microprocesador almacena en la memoria, desde los bytes menos significativos hasta los mssignificativos (Si no se tiene en cuenta sto puede haber misteriosos fallos del programa que se est programando).Por lo tanto en un vector de interrupcin, el primer word (Palabra) contiene el valor que se le asignar a IP (Offset),el segundo word contiene el valor que se le asignar a CS (Segmento), cuando se provoque la interrupcin delcorrespondiente vector.

    ste programa mostrar "Hola mundo" en la pantalla, utilizando servicios de DOS.Se entra al Debug y se escribe lo siguiente (Sin utilizar la orden ensamblar)E 1000 'Hola mundo$'"E" significa escribir, se escribe en el segmento de datos (Indicado por DS). La sintaxis de sta orden del debug es lasiguiente:E Offset '[Cadena de carcteres]'El carcter "$" que est a la derecha de la frase "Hola mundo", sirve para que el servicio de DOS que se va a utilizar

    para mostrar Hola mundo en la pantalla no muestre informacin ms alla del carcter que est a la izquierda delcarcter '$', es decir ste carcter limitador es el fin de la cadena, es decir a partir de ste no mostrar ms caracteres.Importante:Si no finaliza la cadena con el carcter '$', al llamar al servicio de DOS para mostrar el carcter,

    3

  • 7/25/2019 asswembler

    4/5

    probablemente se bloquear la PC hasta encontrar un carcter '$', inclusive puede ser que nunca lo encuentre.A continuacin ensamblar las siguientes instrucciones (A partir de 0100h):MOV AH, 09MOV DX, 1000INT 21INT 20Luego ejecutar el ejemplo con la orden "g"

    El programa mostrar el mensaje "Hola mundo", luego el debug mostrar un mensaje diciendo que el programa haterminado normalmente.Al provocar la interrupcin 21h se llama a un servicio de DOS, el nmero de servicio est determinado por la partealta de AX (AH).El servicio 09h muestra la informacin en forma de carcteres a partir del comienzo apuntado por el registro DX (Eloffset, en ste caso 1000h), muestra la informacin hasta el carcter anterior al carcter '$' (Anteriormentemencionado).Luego se provoca la interrupcin 20h que finaliza el programa.La orden escribir del debug tambin acepta bytes individuales, por ejemplo:E 3000 0, BF, 5F, C4Tambin acepta en forma mixta (Bytes individuales y cadenas de carcteres)E 3000 'JRJGOR', 0, 21, 'Ejd', 2FEs decir la orden ensamblar est acompaada del offset de los datos a escribir y de los items.Un item puede ser un byte individual o una cadena de carcteres (Que sta ltima debe estar entre simples comillas).A veces un programa debe cambiar el flujo del programa en forma incondicional o bajo una condicin (Para tomar

    una decisin), por lo tanto debe haber instrucciones que permitan cambiar el flujo de un programa sin ningnrequisito, o en caso de que una condicin se cumpla. Existen instrucciones para ste propsito. Son las instruccionesde saltos incondicionales y condicionales, que saltan a un determinado punto si se cumpla la condicin.Saltos incondicionalesLa nica instruccin que existe para ste fin es JMP (Abreviatura de JUMP, que significa en ingls SALTAR). Lasintaxis es la siguiente.JMP XXXXXXXX: Es la ubicacin de la instruccin en donde se continuar el programa (A partir de sta se ejecutan lassiguientes).Ejemplo:XXXX:0100 MOV AX, 1000XXXX:0103 JMP 0107XXXX:0105 XOR AX, AXXXXX:0107 INT 20En ste caso al ejecutarse la instruccin de salto incondicional (JMP), se contina la ejecucin a partir de la

    instruccin (INT 20h), no ejecutandose la instruccin XOR (sta instruccin realiza la operacin XOR de eloperando 2 sobre el operando 1) que provocara el borrado de registro AX (Que provocara que AX tome el valor 0),si se ejecuta.Es decir, se ejecutan las siguientes instrucciones:MOV AX, 1000JMP 0107INT 20

    No se ejecuta "XOR AX, AX" por el salto incondicional.El operando puede ser una direccin constante (Por ejemplo 0107), un salto a nivel de offset, tambin puede ser unsalto largo (Que cambie los valores de los registros CS e IP), (Por ejemplo FFFF:0000, que salta al ROM BIOS).Tambin puede ser el valor de un registro, por ejemplo:JMP DIEn ste caso salta a la instruccin apuntada por DI.Tambin puede ser un valor apuntado por un registro puntero, por ejemplo:JMP [SI]

    En ste caso salta a la instruccin apuntada por el valor apuntado por SI.El operando puede ser cualquier direccionamiento vlido (Puede ser cualquiera de los direccionamientos utilizados enel operando origen de la instruccin MOV, explicados anteriormente).ComparacionesSaltos condicionalesSon similares a JMP en la sintaxis, pero la diferencia es el nombre.Las instrucciones son las siguientes:JE o JZ: Salta si est prendido el bit Zero del registro de banderas.Objetivo: Saltar si la ltima comparacin realizada da igual.

    4

  • 7/25/2019 asswembler

    5/5

    JA o JNBE: Salta si el bit carry (CF) o el bit zero (ZF) del registro de banderas est desactivado.Objetivo: Saltar si la ltima comparacin realizada con nmeros naturales da mayor.JB o JNAE: Salta si CF est activada.Objetivo: Saltar si la ltima comparacin realizada con nmeros naturales da menor.JG o JNLE: Salta si ZF es cero o si OF y SF son iguales.Objetivo: Saltar si la ltima comparacin realizada con nmeros enteros da mayor.JL o JNGE: Saltar si SF es diferente a OF

    Objetivo: Saltar si la ltima comparacin realizada con nmeros enteros da menor.JC: Saltar si CF est prendidaObjetivo: Saltar si hay acarreoJO: Saltar si OF est prendidoObjetivo: Saltar si hay desbordamientoJP: Saltar si PF est prendidoObjetivo: Saltar si hay paridadJS: Saltar si SF est prendidoObjetivo: Saltar si es negativoJNE o JNZ: Comportamiento inverso a JE o JZJNA o JBE: Comportamiento inverso a JA o JNBEJNB o JAE: Comportamiento inverso a JB o JNAEJNG o JLE: Comportamiento inverso a JG o JNLEJNL o JGE: Comportamiento inverso a JL o JNGEJNC: Comportamiento inverso a JC

    JNO: Comportamiento inverso a JOJNP o JPO: Comportamiento inverso a JPJNS: Comportamiento inverso a JSHay otras instrucciones que hacen saltos condicionales, pero que no necesitan la instruccin CMP, son las siguientes:JCXZ: Salta si el registro CX es cero.LOOP: Decrementa CX, restndole 1 y salta si CX es distinto de cero.Objetivo: Hacer un bucle, utilizando como contador CXLOOPE: Decrementa CX en 1 y salta si CX es distinto de cero y ZF est prendido.Objetivo: Hacer un bucle, utilizando como contador CX y terminar si el contador llega a cero, o se apaga el bit Zero.LOOPNE: Decrementa CX en 1 y salta si ZF est prendidoObjetivo: Hacer un bucle que siga funcionando hasta que se apague el bit Zero.La sintaxis de stas instrucciones son similares a la instruccin JMP, lo nico que cambia es el nombre.Instruccin genrica para comparar[editar]La instruccin es CMP, sta permite comparar 2 operandos, la sintaxis es la siguiente:CMP ,

    El operador 1, se compara con el 2.Los operandos pueden ser cualquier direccionamiento vlido, cumpliendo las reglas de la instruccin MOV conrespecto a los operandos.sta instruccin compara 2 operandos y luego cambia el registro de banderas en base al resultado de la comparacin.

    5