ctp1(repertorio instrucciones).pdf
TRANSCRIPT
![Page 1: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/1.jpg)
Universidad de las Ciencias Informáticas Maquinas Computadoras I Curso 2006/2007 Manual del profesor
___________________________________________________________________________________________ Departamento de Sistemas Digitales
1
TEMA II. Microprocesadores. ACTIVIDAD #12. Clase Teórico Práctica 1. Repertorio de Instrucciones y Estructura de un programa.
Sumario:
1. Repertorio de instrucciones.
2. Estructura de un programa.
3. Definición de variables.
4. Utilización del repertorio de instrucciones.
Bibliografía:
1. Los microprocesadores Intel. Arquitectura, programación e interfaces. Tomo I y II
Objetivos:
1. Describir algunas de las principales instrucciones utilizadas en el lenguaje ensamblador.
2. Definir la estructura de un programa en lenguaje ensamblador.
3. Declarar variables en ensamblador.
4. Utilizar el repertorio de instrucciones del 386 en ejemplos sencillos.
1. Introducción al lenguaje ensamblador. En la clase anterior se dieron las primeras nociones del lenguaje ensamblador y la importancia que tiene
este en el mundo de la programación, además vimos aspectos muy importantes en la estructura interna de
las microcomputadoras. En la CTP de hoy comenzaremos a dar los primeros pasos en la programación en
ensamblador; para lo cual utilizaremos el ensamblador MASM (Microsoft Macro Assembler), del cual
veremos la estructura de un programa así como sus principales instrucciones.
![Page 2: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/2.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
2
1- Repertorio de instrucciones. 1.1- Instrucciones de movimientos de datos MOV destino, fuente
Reglas a tener en cuenta:
1. El registro fuente puede ser cualquiera.
2. El registro CS, nunca podrá ser usado como destino
3. Ambos operandos deben ser del mismo tamaño, 8, 16 ó 32 bits.
4. No se pueden hacer accesos de memoria a memoria.
5. No se puede colocar un valor inmediato en un registro de segmento.
6. Los dos operandos no pueden ser registros de segmento.
Ejemplos:
MOV AL,DH
MOV DI,BX
MOV ESI,ECX
MOV BL,11001001b
MOV AX,'JR';código ASCII de JR
MOV ECX,75371234H
MOV AL, VALOR
MOVZX, transfiere y extiende el cero. Se usa para convertir números de 8 ó 16 bits, en números de 16 ó 32 bits sin signo, se rellenan con ceros la
parte alta del registro destino.
Ej. MOVZX SI,AL; convierte el valor de 8 bits de AL a 16 bits en SI
PUSH: Empuja datos a la pila.
PUSH decrementa el puntero de pila (SP) en 2 o en 4, y luego almacena el valor dado en [SS:SP]
Ejemplo:
PUSH AX
PUSH EAX
PUSH DX
: Empujar todos los registros de propósito general.
PUSHAD PUSHA
PUSHA empuja, sucesivamente, AX, CX, DX, BX, SP, BP, SI y DI a la pila, decrementando el puntero de
pila en un total de 16.
![Page 3: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/3.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
3
PUSHAD empuja, sucesivamente, EAX, ECX, EDX, EBX, ESP, EBP, ESI y EDI a la pila, decrementando el
puntero de pila en un total de 32.
PUSHF: Empuja el registro de flags.
POP oper ; Saca datos desde la pila.
POP carga un valor desde la pila desde [SS:SP] y luego incrementa el puntero de pila.
Ejemplo:
POP DS
POP ES
POP SS
POP FS
POP GS
Sacar todos los registros de propósito general.
POPA
POPAD
POPA saca una palabra desde la pila en cada uno de los, sucesivamente, DI, SI, BP, SP, BX, DX, CX y AX.
Invierte la operación PUSHA.
POPAD saca el doble de datos, y coloca los resultado en EDI, ESI, EBP, ESP, EBX, EDX, ECX y EAX.
Invierte la operación de PUSHAD.
POPF: Saca el registro de flags.
XCHG, intercambia el contenido de un registro con el contenido de otro registro o una localización de
memoria; no se puede ejecutar en registros de segmento ni si los dos operandos son localizaciones de
memoria.
Ejemplo:
XCHG AX,BX
XCHG AL,SUMA ; SUMA ES UNA VARIABLE
XCHG SUMA,AL ; SUMA ES UNA VARIABLE
IN: Entrada de datos desde un puerto de E/S // Se estudiarán después
OUT: Salida de datos hacia un puerto de E/S 1.2- Instrucciones Aritméticas ADD oper1, oper2 ; realiza la suma entera: suma sus dos operandos, y deja el resultado en el
operando (el primero) destino. Los flags se activan de acuerdo al resultado de la operación: en particular, se
afecta al flag de acarreo y puede usarse en subsiguientes instrucciones ADC (suma con acarreo que
veremos a continuación)
![Page 4: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/4.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
4
ADC oper1, oper2 ; realiza la suma entera: suma los dos operandos, más el valor del flag de acarreo, y
deja el resultado en su operando (el primero) destino. Los flag se activan de acuerdo al resultado de la
operación: en particular, se afecta al flag de acarreo y una instrucción ADC subsiguiente puede hacer uso
de él.
INC oper ; incrementa en uno el único operando que utiliza
DECoper ; resta uno al operando.
Ejemplo:
INC AL
DEC BX
INC contador ; contador es una variable
SUB oper1, oper2
SUB realiza la resta entre enteros: resta su segundo operando del primero, y deja el resultado en su
operando (el primero) destino. Los flags se activan de acuerdo con el resultado de la operación: en
particular, se afecta al flag de acarreo o y se puede usar en subsiguientes instrucciones SBB.
SBB oper1, oper2
SBB realiza la resta entre enteros: resta su segundo operando, más el valor del flag de acarreo, de su
primero, y deja el resultado en el operando (el primero) destino. Los flags se activan de forma acorde con el
resultado de la operación: en particular, se afecta al flag de acarreo y se puede usar en subsiguientes
instrucciones SBB.
Haciendo una similitud con C++
oper1= oper1-(oper2-Carry);
CMP oper1, oper2
Compara dos operandos, la comparación se efectúa restando el primero menos el segundo, no se alteran
los operandos, sólo las banderas.
Si la ZF=1, el resultado fue 0 y los dos números son iguales
Si ZF=0, el resultado es distinto de 0 y los números son desiguales
Si CF=0, no hubo préstamo en la resta por lo que el primer número es mayor que el segundo
Si CF=1, hubo préstamo en la resta por lo que el primero es menor que el segundo
MUL oper
Multiplicación sin signo, se efectúa la multiplicación de dos números sin signo
En la multiplicación de 2 bytes, uno de ellos debe estar en el registro AL, el otro puede ser cualquier otro
registro de 8 bits o una dirección de memoria, el producto se coloca en AX.
Nota: r (registro)
m (memoria)
- Un número después de r o de m indica el tamaño en bits del dato.
(*) Para MUL r/m8, AL se multiplica por el operando dado; el producto se almacena en AX.
![Page 5: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/5.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
5
r/m8 es un registro o el contenido una dirección de memoria de 8 bits
(*) Para 'MUL r/m16, AX se multiplica por el operando dado; el producto se almacena en DX:AX.
r/m16 es un registro o el contenido una dirección de memoria de 16 bits.
(*) Para MUL r/m32, EAX se multiplica por el operando dado; el producto se almacena en EDX:EAX.
r/m32 es un registro o el contenido una dirección de memoria de 32 bits
IMUL Multiplicación con signo (Estudio independiente)
DIV realiza la división entera sin signo.
DIV r/m8
DIV r/m16
DIV r/m32
r/m registro o memoria
El operando explícito proporcionado es el divisor; los operandos dividendo y destino están implícitos, del
siguiente modo:
(*) Para DIV r/m8, AX se divide por el operando dado; el cociente se almacena en AL y el resto en AH.
(*) Para DIV r/m16, DX:AX se divide por el operando dado; el cociente se almacena en AX y el resto en DX.
(*) Para DIV r/m32, EDX:EAX se divide por el operando dado; el cociente se almacena en EAX y el resto en
EDX.
1.3- Instrucciones Lógicas
AND oper1, oper2
AND realiza la operación AND entre BITs entre sus dos operandos (esto es, cada BIT del resultado es 1 si y
solo si los BITs correspondientes de las dos entradas son ambos 1), y almacena el resultado en el operando
destino.
OR oper1, oper2
OR realiza una operación OR a nivel de BIT entre sus dos operandos (esto es, cada BIT del resultado es 1
si y solo si al menos uno de los BITs correspondientes de las dos entradas es 1), y almacena el resultado en
el operando destino.
XOR oper1, oper2
XOR realiza un OR exclusivo a nivel de BIT entre sus dos operandos (esto es, cada BIT del resultado es un
1 si y solo si exactamente uno de los BITs correspondientes de las dos entradas es 1), y almacena el
resultado en su operando destino.
TEST oper1, oper2.
TEST realiza mentalmente un AND a nivel de BIT de sus dos operandos, y afecta a los flags como si la
operación hubiese tenido lugar, pero no almacena en ningún lugar el resultado de la operación.
![Page 6: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/6.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
6
NOT oper
Inversión lógica o complemento a uno, invierte todos los bits del operando.
NEG oper
NEG sustituye el contenido de su operando por la negación en complemento a dos (invierte todos los BITs
y luego suma uno)
BT destino,fuente: Prueba un bit en el operando destino especificado por el operando fuente.
BTC destino,fuente: Prueba y complementa un bit en el operando destino especificado por el operando
fuente.
BTR destino,fuente: Prueba y hace cero un bit en el operando destino especificado por el operando fuente.
BTS destino,fuente: Prueba y hace uno un bit en el operando destino especificado por el operando fuente.
Ej. BT AX,4; prueba el bit 4 en AX, el resultado se coloca en la bandera del acarreo CF; si el bit 4 tiene un 1,
CF es 1.
Las otras tres instrucciones colocan el bit sometido a prueba en CF y después hacen la operación descrita
anteriormente en la descripción
1.4- Instrucciones de desplazamiento y rotaciones.
SHL destino, fuente
Esta instrucción realiza un desplazamiento de los bits del operando destino hacia la izquierda tantas veces
tenga el contenido del operando fuente. Los BITs desocupados se rellenan con cero.
SHR destino, fuente
Igual que la anterior pero hacia la derecha.
ROL destino, fuente
Esta instrucción realiza un desplazamiento de los bits del operando destino hacia la izquierda tantas veces
tenga el contenido del operando fuente.
Ejemplo
MOV AL,10010100b
ROL AL,1 ; AL hora vale 00101001b
ROR destino, fuente
Igual que la anterior pero hacia la derecha.
Estructura de una línea de código <Etiqueta> : inst <op destino>,<op fuente>; comentario
![Page 7: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/7.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
7
Etiqueta: son caracteres alfanuméricos que comienzan por una letra.
Inst: identificación de la instrucción
op destino, op origen: los operandos de la instrucción. Hay instrucciones que son de simple operandos,
otras que tienen 2 y otras que no se especifican en la instrucción pero que por diseño tienen los operando
definidos
2- Estructura de un programa .DOSSEG .MODEL SMALL .STACK .DATA ; Definición de variables .CODE main PROC ;Instrucciones main ENDP END Directiva .DOSSEG: indica al ensamblador que queremos los segmentos de nuestro programa cargados en
un orden específico (el segmento de código 1ro y el STACK al último).
Directiva .MODEL SMALL: Se considera un programa como SMALL cuando contiene hasta 64K de código
y 64K de datos.
Directiva .STACK: Define un segmento de pila. Directiva .DATA: Declara un segmento de datos que se usa para variables de memoria.
Directiva .CODE: Declara un segmento de códigos que es donde se guarda el código escrito.
Directiva END: Fin del programa.
Como se puede observar después del .CODE vienen la instrucciones como tal, pero esas instrucciones
están dentro de un procedimiento (se estudiarán después) que es el procedimiento principal del programa,
esto aunque no es obligatorio para que nuestro programa funcione es una buena técnica a la hora de
programar y produce algunas ventajas que estudiaremos luego.
3- Definición de variables nombre tipoDato valor
nombre: nombre simbólico dado a la variable.
tipoDato: tamaño de la variable
DB byte (1 byte).
DW word (2 bytes).
DD doble palabra (4 bytes).
DF farword (6 bytes).
DQ quadword (8 bytes).
![Page 8: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/8.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
8
DT 10 bytes.
valor: puede ser una constante, una expresión que evalúa a una constante, o "?".
?: indica que el valor de la variable es indeterminado.
Se pueden definir múltiples valores separados por comas o usando el operando DUP
EJEMPLOS
dato db 20,21
dato1 dw '?'
cantidad db 10 dup(?)
Definición de constantes nombre equ valor
Ejemplo: cantidad equ 5
Variables de cadena Se inicializan con DB, están formadas por los códigos ASCII de los caracteres.
Ejemplos
version1 db 97,98,99; códigos ASCII
version2 db 'a','b','c'
version3 db 'abc' Códigos ASCII
Dec Hex Caracter 32 20 espacio
48-57 30-39 0-9
65-90 41-5A mayúsculas
97-122 61-7A minúsculas
10 0D retorno
4- Utilización del repertorio de instrucciones. Ejercicio #1
Dada una serie de declaraciones de variables en C++, escriba su correspondiente en ensamblador.
Forma de declarar constantes: const int numero = 2; numero equ 2 Forma de declarar datos inicializados: char cinco_ceros [5] = {0}; cinco_ceros db 5 Dup(0) int meses =12; meses dw 12 Forma de declarar datos no inicializados: char a[23]; a db 23 Dup(?) int buffer[64] ; buffer dw 64 Dup(?)
![Page 9: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/9.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
9
Otras declaraciones: short int buffer = 120; buffer db 120 string cadena = “hola mundo”; cadena db “Hola mundo” Ejercicio #2
Elabore un programa en ensamblador que sume dos números que se encuentren en memoria. El resultado
debe ser guardado en otra variable que se encuentra también en memoria
Orientaciones: Primero debe tener dos variables que contengan los números que deseamos sumar y una tercera para
guardar el resultado, esta declaración de las variables se hace en el espacio (. Data), luego en el (.Code) va
el cuerpo del programa, ahí primero se actualiza el segmento de datos y luego se implementa el programa
como tal (realizar el procedimiento de sumar los números y guardar el resultado en la variable resultado.)
.DOSSEG
.MODEL SMALL
.DATA Numero1 DB 50 ; Primer número
Numero2 DB 45 ; Segundo número
Resultado DB ? ; Para el resultado
.CODE
main PROC MOV AX, @DATA ; Actualizo el segmento de datos.
MOV DS, AX MOV AL, Numero1 ; Cargar primer número
ADD AL, Numero2 ; Sumar segundo
MOV Resultado, AL ; Guardar el resultado en memoria
main ENDP
END
Ejercicio # 3 Dada una lista de 5 números ordenados del 1 al 5 en una dirección de memoria llamada LISTA1
almacénelos en otra dirección de memoria llamada LISTA2.
En la solución del ejercicio solo hay una instrucción (loop) que no se ha dado en clases, pero por su fácil
uso se puede entender perfectamente (En la próxima clase se detallará su uso).
Para realizar este programa primero se debe de:
• Definir dos variables, una que tenga los 5 números en la dirección lista1 y otra con la dirección
lista2 para almacenar los números.
• Actualizar el DS con el segmento donde están las variables.
![Page 10: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/10.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
10
• Poner a apuntar al registro BX a la dirección de la lista1, esta acción es realizada mediante la
instrucción OFFSET, que permite cargar la dirección efectiva de la variable LISTA1 hacia el
registro BX.
• Inicializar el puntero SI con el valor 0.
• Pasarle al registro contador (CX) la cantidad de números contenidos en la lista.
• Se efectúan todas las iteraciones del ciclo y apoyándonos en los diferentes modos de
direccionamientos vistos en la conferencia, realizamos una copia de LISTA1 a LISTA2.
• Por último dar fin al procedimiento y fin al programa.
DOSSEG .MODEL SMALL .DATA
LISTA1 DB 1,2,3,4,5
LISTA2 DB 5 DUP (?)
.CODE NUMEROS PROC ; Inicio del procedimiento principal
MOV AX,@DATA ; Actualización del segmento de datos
MOV DS,AX MOV BX,OFFSET LISTA1 ; BX apunta al primer elemento de LISTA1.
MOV SI,0 ; SI va a hacer utilizado como índice de arreglo.
MOV CX,5 ; CX Contador, controla las iteraciones del ciclo.
ETIQ: ; Etiqueta para el ciclo.
MOV AL, [BX] ; Guarda en la parte baja del acumulador el contenido de la
; dirección a la que está apuntando el registro BX.
INC BX ; Incrementa el registro puntero BX.
MOV LISTA2[SI],AL ; Guarda en la dirección dada por LISTA2+SI el valor de AL
INC SI ; Se Incrementa el índice del arreglo para que se pueda acceder
; al siguiente elemento de la lista
LOOP ETIQ ; Salta a ETIQ y automáticamente decrementa a CX
; sale del lazo cuando el contador (CX) llega a 0 (Esta forma de
; implementar un ciclo es similar al for de C++)
NUMEROS ENDP ; Fin del procedimiento.
END ; Fin del programa.
Estudio independiente. 1- Instrucciones de transferencias del control del programa
2- Dada una cadena de 20 caracteres almacenados a partir de la dirección CADENA, averiguar cuantas
veces se repite el carácter que está almacenado en la variable CARACTER. El resultado se almacenará en
la variable CANTIDAD.
![Page 11: CTP1(Repertorio Instrucciones).pdf](https://reader035.vdocuments.co/reader035/viewer/2022072016/55cf9d1e550346d033ac52ae/html5/thumbnails/11.jpg)
Máquinas Computadoras I
___________________________________________________________________________________________ Departamento de Sistemas Digitales
11
Conclusiones Con el desarrollo de esta clase hemos comenzado a dar nuestros primeros pasos en la programación con el
lenguaje ensamblador, vimos algunas de las principales instrucciones y realizamos algunos programas muy
simples pero que irán ganando en complejidad a medida que avance el semestre.
Confeccionado por:
Dpto. De Sistemas Digitales Fecha de última modificación: martes, 17 de octubre de 2006, 13:44:58