Professional Documents
Culture Documents
Objetivos
Familiarizar al estudiante en el uso del lenguaje de bajo nivel, para entender los
conceptos de formato de instruccin, modos de direccionamiento de las instrucciones.
Programar en el assembler de los microprocesadores INTEL
Hacer programas para los perifricos de las computadoras.
LENGUAJE DE MAQUINA
El lenguaje de mquina es el cdigo binario nativo que entiende el microprocesador y se utiliza
en las instrucciones que controlan su funcionamiento. La longitud de las instrucciones en
lenguaje de mquinas para los microprocesadores x86 vara entre 1 y 13 bytes.
El formato de instruccin en los microprocesadores x86 no es de longitud fija para todas sus
instrucciones. Algunas instrucciones pueden tener el formato que se muestra en la siguiente
figura.
ENSAMBLANDORES Y COPILADORES
Se puede identificar dos clases de lenguaje de programacin de alto nivel y de bajo nivel. En los
lenguajes de alto nivel cada comando puede generar muchas instrucciones en lenguaje de
mquina. En los lenguajes de bajo nivel cada instruccin simblica genera una instruccin en
lenguaje de mquina.
A pesar del hecho de codificar en un lenguaje de alto nivel es ms productivo, algunas ventajas
de codificar en un lenguaje ensamblador son:
Proporciona mayor control sobre el manejo particular de los requerimientos de
hardware.
Genera mdulos ejecutables ms pequeos y compactos.
Tiene una ejecucin ms rpida.
Es una prctica combinar los beneficios de ambos niveles de programacin.
DIRECTIVAS
Las directivas (pseudooperaciones) indican la forma en que el ensamblador va procesar un
operando o seccin de un programa. Algunas directivas generan y almacenan informacin en
memoria, mientras que otras no.
1
Directiva Funcin
ASSUME Indica los nombres de cada segmento al ensamblador, no carga los registros de
segmento.
DB Define un byte (8 bits)
DD Define la palabra o dobles palabras (32 bits)
DW Define palabra o palabras (16 bits)
DUP Genera duplicados de caracteres o nmeros
END Indica el final del programa
ENDM Indica el final de una secuencia de macro
ENDP Indica el final de un procedimiento
ENDS Indica el final de un segmento
MACRO Define el nombre, parmetros e inicio de un macro
OFFSET Especifica una direccin de desplazamiento
ORG Inicializa el origen dentro de un segmento
PROC Define el inicio de un procedimiento
SEGMENT Define el comienzo de un segmento de memoria
STACK Indica que un segmento es segmento de pila
Formato 1
;-----------------------------------------------------------------------
STACK_SEG SEGMENT STACK
DW 100 DUP (?)
STACK_SEG ENDS
;-----------------------------------------------------------------------
DATA_SEG SEGMENT DATA
DATA_SEG ENDS
;-----------------------------------------------------------------------
CODE_SEG SEGMENT CODE
ASSUME SS:STACK_SEG, DS: DATA_SEG, CS:CODE SEG
INICIO:
MOV AX, DATA_SEG; obtiene direccin del segmento de datos
MOV DS, AX ; Almacena direccin en DS
MOV ES, AX ; Opcional
MOV AH, 4CH Solicitud de terminacin
INT 21H Salir de DOS
CODE_SEG ENDS
END EJEMPLO
2
Formato 2
;-----------------------------------------------------------------------
STACK_SEG SEGMENT STACK
DW 100 DUP (?)
STACK_SEG ENDS
;-----------------------------------------------------------------------
DATA_SEG SEGMENT DATA
DATA_SEG ENDS
;-----------------------------------------------------------------------
DATA_SEG SEGMENT CODE
EJEMPLO PROC
ASSUME SS:STACK_SEG: DATA_SEG, CS:CODE SEG
MOV AX, DATA_SEG; obtiene direccin del segmento de datos
MOV DS, AX ; Almacena direccin en DS
MOV ES, AX ; Opcional
MOV AH, 4CH Solicitud de terminacion
INT 21H Salir de DOS
EJEMPLO ENDP
CODE_SEG ENDS
END EJEMPLO
Formato 3
;-----------------------------------------------------------------------
STACK_SEG SEGMENT STACK
DW 100 DUP (?)
STACK_SEG ENDS
;-----------------------------------------------------------------------
DATA_SEG SEGMENT DATA
DATA_SEG ENDS
;-----------------------------------------------------------------------
CODE_SEG SEGMENT CODE
ASSUME SS:STACK_SEG,DS: DATA_SEG, CS:CODE SEG
EJEMPLO PROC
MOV AX, DATA_SEG; obtiene direccin del segmento de datos
MOV DS, AX ; Almacena direccin en DS
MOV ES, AX ; Opcional
MOV AH, 4CH Solicitud de terminacin
INT 21H Salir de DOS
EJEMPLO ENDP
CODE_SEG ENDS
END EJEMPLO
3
Formato 4
;*************************************************
MY_DATA SEGMENT
X DB ?
Y DW ?
MY_DATA ENDS
;*************************************************
MY_EXTRA SEGMENT
ALFA DB ?
BETA DW ?
MY_EXTRA ENDS
;*************************************************
MY_STACK SEGMENT
DW 100 DP (?)
TOP EQU THIS WORD
MY_STACK ENDS
;*************************************************
MY_CODE SEGMENT
ASSUME CS:MY_CODE,DS:MY_DATA
ASSUME ES:MY_EXTRA,SS:MY_STACK
START MOV AX, MY_DATA ;inicializa ES
MOV DS, AX
MOV AX,MY_EXTRA ;inicializa SS
MOV EX, AX
MOV SP, OFFSSET TOP
.
.
.
MY_CODE ENDS
END START
b) MODELOS
Los modelos son ms fciles de usar, existen muchos modelos que se pueden utilizar en el
ensamblador desde los muy pequeos hasta los muy grandes. Para designar un modelo se
utiliza el enunciado MODEL seguido por el tamao del sistema de memoria.
En el modelo muy pequeo los el programa y los datos deben estar contenidos en un
segmento de memoria de 64 Kbytes es til para programas pequeos.
En el modelo pequeo, se requiere que solo se utilice un segmento de datos y un segmento de
cdigo, para un total de 128 k bytes de memoria. Existen otros modelos disponibles.
4
;------------------------------------------------------------------------------------
.model small
.stack 100h ; define la pila
.data ; define los datos
var1 dw 250
var2 DB 100 DUP (?)
;----------------------------------------------------------------------------------
.code
Principal proc
mov ax, @data ; se asigna la direccin de DATASEG
mov ds, ax ; en el segmento de datos
mov ah, 4ch
int 21h ; salida al DOS
EJEMPLOS
codigo segment
asume cs: cdigo ; directiva
mov ax, 1234 ; directiva
mov bx, 5678h ; instruccion
mov cx, 9abch ; instruccion
mov dx, 0def0h ; instruccion
5
Ejemplo 2 Este ejemplo ilustra los diversos modos de direccionamiento
Programa segment
Asume cs: programa
mov ax, 6000h ; inmediato
mov ds, az ; entre registros
mov ax, 3230h ; inmediato
mov ds: [0000], ah ;directo
mov ds: [0002], al ;directo
mov bx, 3033h
mov ds: [0004], bh
mov ds: [0006], bl
6
Ejemplo 3 Programa que escribe caracteres en la memoria de video de texto.
codigo segment
Asume cs: codigo
Inicio:
mov ax, 0b800h
mov ds, ax
mov ax, 4752h
mov ds: [0000], ah ;G
mov ds: [0002], al ;R
mov ax, 4547h
mov ds: [0004],ah
mov ds [0006],al;
Ejemplo 4 Escribir un programa que lee un carcter del teclado y lo muestra en el monitor. Un
carcter @ finaliza el programa
;------------------------- programa------------------------------------
code segment
asume cs: code
inicio:
mov ah,6 ; hay tecla oprimida
mov dl, of
int 21h
je inicio
7
pilas segmen stack
DB 100H DUP (?)
pilas ends
;****************************************************
codigos segment
asume ss: pilas, cs: cdigos
inicio:
mov cx, 20
mov dl, A
lazo: mov ah,2
int 21h
loop lazo
Ejemplo 6 Escribir un programa que imprima por pantalla una secuencia determinada de
caracteres AAAAABBBBBCCCCCYYYYYZZZZZ.
;**************************
stack_seg segment stack
DB 100 DUP (?)
stack_seg ends.
;**************************
code segment
Assume ss: stack_seg, cs: code
Start:
mov cx, 26
mov dl, A
mov ah, 2
Lazo2: push cx
mov cx, 5
Lazo 1: int 21h
moop lazo1
mnc dl
mop cx
moop lazo2
;**********************************************************
datos segment
Mensaje db Arquitectura de computadoras S
datos ends
8
;**********************************************************
codigo segment
assume cs: cdigo, ds: datos
start:
mov ax, datos
mov ds, ax
mov dx, offset mensaje
mov ah, 19h
int 21h
INSTRUCCIONES DE TRANSFERRENCIA
MOV DESTINO, FUENTE; DESTINO FUENTE
IN ; Lee un dato del puerto
MOV DX , NUMERO_DE_PUERTO
IN AX , DX
INSTRUCCIONES ARITMETICAS
ADD: DEST DEST + FUENTE
Para adicin binaria de nmeros de 8 y 16 bits
Ejemplos:
ADD AL, BL ;AL AL +BL
ADD CX, DI ;CX CX +DI
9
Adiciona 1 a un registro o a una localidad de memoria (No para registros de
segmento)
SUB (Substract) with Borroww): DEST DEST FUENTE CF
Se usan para substracciones que son mas amplias de 16 bits.
Ejemplos
CMP DL, CH; registro registro
Ejemplos
DIV CL ; AL AX/CL y AH Resto
DIV CX ; AX (DX..AX) /CX y DX Resto
Ejemplo
MOV AL, NUMB; AL NUMB (Localidad de memoria)
MOV AH, 0 ; AH 0 (Extender con cero)
DIV NUMB ;AL AX/NUMB
;AH Resto
10
MOV ANSR, AL ; [ANSQ] al guardar el cociente en la localidad ANSQ
MOV ANSR, AH ; [ANSR] AH guardar el resto
Ejemplos
IDIV BL ;AL AX/BL y AH Resto
IDIV SI ; AX (DX.AX)/SI y DX Resto
Ejemplo
MOV AX,-100 ; AX -100
MOV CX,9 ;CX 9
CWD ; (DX.AX) -100
IDIV ; AX (DX . AX) /CX y DX 1
INSTRUCCIONES LGICAS
Consisten en instrucciones booleanas, instrucciones de desplazamiento (shift) e instrucciones
de rotacin.
************************************************
Inst. booleanas
AND
OR
NOT,NEG
XOR
TEST
Inst. de desplazamiento
SAL
SAR
SHL
SHR
Inst. Rotacin
RCL
RCR
ROL
ROR
************************************************
AND
Ejecuta la multiplicacin lgica bit a bit
AND oper 1, oper 2 ; oper 1 (oper1) AND (oper 2)
Para multiplicacin Binaria de nmeros de 8 y 16 bits.
Ejemplos
11
AND AL, BL ;AL (AL) AND ((BL)
AND CX, DX ;CX (CX) AND (DX)
AND CL, 33H ;CL (CL) AND (33H)
AND DI, 4FFFH ;DI (DI) AND (4FFFH)
AND AX, [DI] ; AX (AX) AND [DI]
OR
Ejecuta la suma lgica
OR operando1, operando2 ; operand1 (operand1) OR (operand2)
Ejemplos
OR AH, BL ;AH (AH) OR (BL)
OR SI, DI; SI (SI) OR (DI)
OR DX, [BX] ;contenido de la localidad de memoria direccionado por BX del
; segmento de datos.
Ejem. Multiplicacin de dos nmeros en BCD y ajustando con AAM a BCD, usando OR lo
cambia a ASCII
MOV AL, 5H
MOV BL, 7H
MUL BL ;AX AL*BL, AX 0 23 H
AAM AX 0305H
OR AX, 3030H ;AX 3335H convertido a ASCII
XOR
Ejecuta la operacin OR exclusivo bit por bit.
XOR operando1, operando2 ;operand1 (operand1) XOR (operand2)
Ejemplos
XOR CH, DL ;CH (CH) XOR (DL)
XOR SI, BX ;SI (SI) XOR (BX)
XOR CH, 0EEH ;CH (CH) XOR 0EEH
XOR DX, [SI] ;DX DX XOR [SI] en el segmento de datos.
NOT
Invierte todos los bits, es la conversin lgica a complemento a 1
NOT opernado ; operando NEG LOGICA operando
Ejemplos
NOT CH ; CH NOT CH
NOT TEMP ; negacin al contenido de a localidad de memoria.
NEG
Halla el complemento de dos de un numero (inversin de signo aritmtico)
NEG operando ; operando NEG LOGICA operando + 1
12
Ejemplos
NOT CH; CHA NOT CH
NOT TEMP
Instrucciones de desplazamiento
Mueven bits a la izquierda o derecha dentro de un registro o localidad de memoria.
Tambin ejecutan operaciones aritmticas simples tales como:
Multiplicacin de potencias de 2 (desplazamiento a la izquierda
Divisin por potencias de 2 (desplazamiento a la derecha)
SHL (shift Logic Left) desplazamiento lgico a la izquierda, funcionan con nmeros sin
signo, multiplica por 2
Shl opr, cnt; CF opr 0
Antes de la instruccin
Despus de la Instruccin
CF
b7 b6 b5 b4 b3 b2 b1 b0 0 0
Ejemplo
Shl dx, 1 ; dx es desplazando 1 lugar a la izquierda
alternativamente
mov cl, 14
shl dx, cl
SAL (Shift Aritmetic Left) desplazamiento aritmtico a la izquierda funciona con nmeros
son signo.
Sal opr, cnt; CF opr 0
Antes de la instruccin
CF
b7 b6 b5 b4 b3 b2 b1 b0 0
Despus de la instruccin
CF
b7 b6 b5 b4 b3 b2 b1 b0 0 0
Ejemplo
mov al, 5h
13
Sal al, 1 ; al es desplazado aritmticamente 1 lugar a la izquierda.
sal cx, 10 ; cx se desplaza aritmticamente 10 lugares a la izquierda.
Despus
CF
0 0 b7 b6 b5 b4 b3 b2 b1 b0
Ejem.
mov al, 5h
shr al, 1 ; se desplaza el contenido de al una posicin a la derecha.
CF
b7 b6 b5 b4 b3 b2 b1
Bit de
Signo
Ejem
mov si, 6
sar si, 2
Instruccin de Rotacin
Posicionan los datos binarios rotando la informacin en un registro o localidad de
memoria desde un extremo a otro a travs de la bandera de acarreo.
Rol (Rtate Left) Rotacin a la izquierda
Antes
CF
b7 b6 b5 b4 b3 b2 b1 b0
Despues
CF
b7 b6 b5 b4 b3 b2 b1 b0 b7
Ejemplo
rol si, 6 ; el contenido de SI rota a la Izquierda 4 lugares
14
RCL ( rtate Left Through Carry) rotacin a al izquierda a travs del carry
CF
b7 b6 b5 b4 b3 b2 b1 b0 b7
Ejemplo
rcl bl, 6 ; el contenido de BL rota ala izquierda a travs de Cf 6 lugares
CF
b7 b6 b5 b4 b3 b2 b1 b0
RCR (Rotate Right through Carry) Rotacin a la derecha a travs del carry
CF
b7 b6 b5 b4 b3 b2 b1 b0
Salto Incondicional.
JMP Esta instruccin permite saltar hacia cualquier parte de la memoria para la siguiente
instruccin. Tambin se debe mencionar que con esta instruccin se puede realizar.
Salta corto: se puede desplazar en el rango de +127 a -128
Salto lejano: adquiere un nuevo segmento y direccin de desplazamiento para realizar el salto.
Ejemplo:
XOR BX,BX
START: MOV AX,1
ADD AX, BX
15
JMP SHORT NEXT
DECLARE X BYTE
X=0;
DO WHILE X<=100;
X=X+3;
END;
16