Sei sulla pagina 1di 7

Listado de instrucciones en Assembler (PASCAL)

En Turbo Pascal es posible programar en assembler utilizando las sentencias ASM y END. Todo bloque de programa encerrado entre estas dos sentencias es tomado por el compilador Pascal como cdigo assembler. Al final de este documento veremos algunos ejemplos.

Registros Los registros del procesador son: AX(acumulador), BX, CX, DX ( Todos registros de 16 bis). Es posible utilizar el primer o segundo byte de cada registro, en cuyo caso deberamos referirnos al mismo como AH (parte alta), AL(parte baja), BH,BL, CH,CL,DHy DL. Tambin se encuentran los registros IP (PC), SP, entre otros. Las instrucciones LDxx y STxx se corresponde con la instruccin MOV [destino] [origen] Ejemplo 1: En la siguiente instruccin se mueve el valor 10 al registro AX MOV AX, 10 {en pseudo assembler sera LDAC #10} Ejemplo 2: Se coloca el byte ms significativo del registro AX, es decir, AH en la direccin de memoria 1000. MOV [1000],AH {en pseudo assembler sera STAC 1000} Modos de direccionamiento

Direc. Inmediato MOV AX, 5 {en pseudo assembler sera LDAC #5} Direc. directo MOV BX, [1000] {en pseudo assembler sera LDBX 1000} Direc. Indexado MOV AX, [1000 + BX ] {en pseudo assembler sera LDAX BX 1000}

Direc. Indirecto MOV AX, WORD PTR [ BX ] {en pseudo assembler sera LDAX IND BX} El modo de direccionamiento indirecto no se puede aplicar a direcciones. Por lo que en pseudo assembler lo que sera LDAX IND 1000 no lo podemos escribir de esa manera.

Etiquetas Las etiquetas se utilizan para hacer referencia a una determinada lnea de programa en lugar del numer de lnea que colocamos en pseudoassembler. Se utilizan en los saltos y llamadas a sub - rutinas, se escriben precedidas por el smbolo @ y seguidas por : en el momento de su definicin. Ej @Regresar: ............ JMP @Regresar Intrucciones Aritmtico - lgicas Las siguientes operaciones lgico -aritmticas poseen dos operandos. El resultado queda almacenado en el primer operando, debe hacerse explcito el uso del acumulador . Ej. ADD AX , [1000] SUB AX , [1000] AND AX , [1000] OR BX , [1000] XOR BX , [1000] SHR AX,1 SLR AX, 1 STC RCR AX,1 RCL AX,1 CMP AX, BX {compara el AX con el BX, No modifica ni AX ni BX} La multiplicacin y divisin poseen un solo operando. MUL BX {multiplica el AX con el BX y el resultado se almacena en AX y DX si es necesario. El flag de Carry indica si es el resultado puede ser representado en 16 bits (carry = 0) o 32 bits (carry = 1)}. DIV BX {divide AX (nmero de 16 bits) por parmetro (BX). El cociente lo almacena en AX y el resto en DX.. Para que el cociente se resuelva correctamente, el registro DX debe estar en 0, antes de hacer la divisin}

NOT AX posee un operando, quedando el resultado almacenado en este mismo. SHR AX,1 Shiftea hacia la derecha con cero al Registro AX un lugar (en pseudoassembler SHL0 #1). SHL AX,1 Shiftea hacia la izquierda con cero al Registro AX un lugar (en pseudoassembler SHR0 #1). STC Pone el bit de Carry en 1 RCR AX,1 Shiftea hacia la derecha con el valor del Carry al Registro AX, un lugar (Si en carry esta en 1, en pseudoassembler SHL1 #1). RCL AX,1 Shiftea hacia la izquierda con el valor Carry al Registro AX, un lugar (Si en carry esta en 1, en pseudoassembler SHR1 #1). Ejemplos de Shift 1) SETC RCR AX,1
Es equivalente en pseudoassmbler a: SHL1 AX,1 2) SHL AX, 1 Es equivalente en pseudoassmbler a: SHR0 AX,1

Saltos Para la utilizacin de los saltos se necesitan etiquetas. Los saltos condicionales en assembler interpretado por Pascal son entre otros; JN (salto por negativo) JNN (salto por no negativo) JZ (salto por cero) JNZ (salto por no cero) JOF (salto por overflow) entre otros. CALL (es equivalente al JSUB) y RET (equivalente al RTN)

En lo que resta de este documento, se pueden observar un conjunto de ejemplos.

Ejemplo nro.1 El siguiente programa determina si el nro. almacenado en la pos. 1000 de memoria es o no un nmero par. Se hace el uso de una subrutina para determinar si bit menos significativo es un 0 o un 1. Program Ejemplo1; USES CRT; VAR { toda variable o arreglo definido en esta seccin es visto como una direccin de memoria por el compilador} PALABRA:WORD; begin ASM MOV CX,9 {9 es el valor que se desea testear} MOV [1000],CX {se enva el contenido de CX a la direc. 1000 , equivalente a STCX 1000 en seudo - assembler} MOV AX,[1000] {se envia el contenido de la direc. 1000 a AX equivalente a LDAX 1000 en seudo - assembler} CALL @SUBPAR {invoca a la subrutina que comienza en la etiqueta @SUBPAR } JZ @ES_PAR { salto por 0} JMP @IMPAR { salto incondicional } @ES_PAR: MOV AX,1H JMP @FINAL @IMPAR: MOV AX,0H @FINAL:MOV [1004],AX MOV PALABRA, AX { enva el contenido de AX a la direccin de memoria PALABRA} JMP @FIN @SUBPAR: AND AX,1H RET {equivalente a RTN en seudo - assembler} @FIN: END;

WRITELN('(0-impar, 1-par =>',PALABRA); {fuera del bloque assembler utilizamos el procedimiento Writeln para mostrar lo almacenado en la direccin de memoria determinada por PALABRA} End.

Ejemplo nro. 2 El siguiente ejemplo muestra cmo utilizar el metodo de direccionamiento indirecto para registros. Program Ejemplo2; VAR PALABRA:WORD; C:WORD; begin ASM {en la posicin 1000 de la memoria se almacena un 4} MOV BX, 4 MOV [1000],BX { el compilador Pascal exige que para enviar un valor constante a memoria, primero ste debe ser almacenado en un registro} {seguidamente se accede al contenido de la direccin de memoria almacenada en BX} MOV BX, 1000 MOV AX, WORD PTR [BX] MOV PALABRA, AX {en PALABRA se almacena un 4} END; WRITELN('EL RESULTADO ES ->',PALABRA); End.

Ejemplo nro. 3 El siguiente ejemplo almacena dos valores en memoria, posteriormente los recupera y los suma. Program Ejemplo3; VAR PALABRA:WORD; begin ASM

MOV AX, 10 MOV [1000],AX MOV BX, 5 MOV [1002],BX MOV AX,[1000] ADD AX,[1002] MOV [1004],AX MOV PALABRA, AX END; WRITELN('EL RESULTADO ES ->',PALABRA); End.

Ejemplo nro. 4 El siguiente ejemplo suma los valores almacenados en el arreglo A. El nombre del arreglo se puede usar como un puntero a la primera direccin de memoria que ocupa ese arreglo. El arreglo termina cuando el valor encontrado es 1. Program Ejemplo4; USES CRT; const A: array[1..5] of Integer = (1, 2,6,3 , -1); VAR PALABRA:WORD; C:WORD; begin CLRSCR; ASM

{ el registro CX almacenar las sumas parciales y BX es utilizado como ndice } MOV CX,0 {se inicializa CX} MOV BX,0 {se inicializa el ncide en 0} @SUMAR: {en AX se carga indirectamente lo que se encuentra almacenado en la posicin A ms BX, esta instruccin combina los modos de direccionamientos indirecto e indexado} MOV AX, WORD PTR [A+BX]

CMP AX,-1 {compara AX com 1} JZ @FIN MOV AX, WORD PTR [A+BX] {no seria necesario en este assembler} ADD AX,CX MOV CX,AX MOV AX,BX ADD AX,2 {avanzo el registro ndice} MOV BX,AX JMP @SUMAR @FIN: MOV PALABRA, CX END; WRITELN('SUMA TOTAL = ',PALABRA);

Potrebbero piacerti anche