Está en la página 1de 10

Lab 11: Análisis de Programas en Ensamblador

Instrucciones Básicas:
mov eax, 3 ; almacena 3 en el registro EAX (3 es el operando inmediato)
mov bx, ax ; almacena el valor de AX en el registro BX
add eax, 4 ; eax = eax + 4
add al, ah ; al = al + ah
sub bx, 10 ; bx = bx - 10
sub ebx, edi ; ebx = ebx – edi
inc ecx ; ecx++
dec dl ; dl—
L1 db 0 ; byte etiquetado como L1 con valor inicial 0
L2 dw 1000 ; palabra etiquetada como L2 con valor inicial de 1000
L3 db 110101b ; byte con valor inicial binario de 110101 (53 en decimal)
L4 db 12h ; byte con valor inicial hex de 12 (18 en decimal)
L5 db 17o ; byte con valor inicial octal de 17 (15 en decimal)
L6 dd 1A92h ; plabra doble con valor inicial hex de 1A92
L7 resb 1 ; un byte sin valor inicial
L8 db "A" ; byte con valor inicial del c´odigo ASCII para A (65)
L9 db 0, 1, 2, 3 ; define 4 bytes
L10 db "w", "o", "r", ’d’, 0 ; define una cadena tipo C = "word"
L11 db ’word’, 0 ; igual que L10
L12 times 100 db 0 ; equivalente a 100 veces db 0
L13 resw 100 ; reserva lugar para 100 palabras
1mov al, [L1] ; copia el byte que está en L1 en AL
2 mov eax, L1 ; EAX = dirección del byte en L1

3 mov [L1], ah ; copia AH en el byte en L1

4 mov eax, [L6] ; copia la palabra doble en L6 en EAX

5 add eax, [L6] ; EAX = EAX + la palabra doble en L6

6 add [L6], eax ; la palabra doble en L6 += EAX

7 mov al, [L6] ; copia el primer byte de la palabra doble en L6 en AL

mov [L6], 1 ; almacena 1 en L6


mov dword [L6], 1 ; almacena 1 en L6
print int; imprime en la pantalla el valor del entero almacenado en EAX
print char ; imprime en la pantalla el caracter cuyo código ASCII esté almacendo en AL
print string ; imprime en la pantalla el contenido de la cadena en la dirección almacenada en
EAX. La cadena debe ser tipo C, terminada en NULL).
print nl ; imprime en pantalla el caracter de nueva línea.
read int ; lee un entero del teclado y lo almacena en el registro.
read char; lee un solo caracter del teclado y almacena el código ASCII en el registro EAX.

Prog.1:
Descripció n: Este programa ilustra es uso de las operaciones para transferencia de datos.
*MODEL TINY
.DATA
Array1 db 10 dup (0) ;Arreglo de 10 elementos inicializados en cero.
.CODE
inicio: ;Punto de entrada al programa
mov AX,10 ;Copiar el nú mero 10 dentro de AX
mov BX,5 ;Copiar le nú mero 5 dentro de BX
lea DX,Array1 ;DX contiene la direcció n efectiva de Array1[0]
xchg AX,BX ;Intercambiar los valores contenidos en AX y BX
mov ax,4C00h ;Terminar programa y salir al DOS
int 21h
END inicio
END

Prog.2:
Descripció n: Este programa ilustra el uso de las instrucciones ADD, SUB, INC y DEC.
*MODEL TINY
.DATA
Var1 DW 10 ;Declaració n de una variable de tipo entero; inicializada con 10.
.CODE
Inicio: ;Punto de entrada al programa
Mov AX,5 ;AX=5
Mov BX,10 ;BX=10
Add AX,BX ;AX=AX+BX
Mov CX,8 ;CX=8
Add CX,Var1 ;CX=CX+Var1
Inc AX ;AX=AX+1
Dec BX ;BX=BX-1
Inc Var1 ;Var1=Var1+1
Dec Var1 ;Var1=Var1-1
Mov AX,4C00h ;Terminar programa y salir al DOS
Int 21h ;
END Inicio
END

Prog.3:

Descripció n: Este programa ilustra el uso de las instrucciones MUL e IMUL.


.MODEL TINY
.DATA
NUM1 dw 3
NUM2 db -5
.CODE
INICIO:
;MULTIPLICACIÓ N DE 8 BITS CON REGISTROS
MOV BH,4 ;BH=4
MUL BH ;AX=AL*BH
;MULTIPLICACIÓ N DE 16 BITS
MOV AX,-3 ;AX=-3
MUL NUM1 ;DX:AX=AX*NUM2
;MULTIPLICACIÓ N DE 8 BITS CON VARIABLES
MOV AL,3 ;AL=3
IMUL NUM2 ;AX=AL*NUM2
MOV AX,4c00h
INT 21h
END INICIO
END

Prog.4:

Descripció n: Este programa ilustra el uso de las instrucciones DIV e IDIV.


*.
MODEL TINY
.DATA
NUM1 db 3
NUM2 db -5
.CODE
INICIO: ;INICIO DEL PROGRAMA
MOV AX,100 ;AX=100
MOV BH,10 ;BH=10
DIV BH ;DIVISION DE 8 BITS SIN SIGNO
MOV AX,100 ;AX=100
DIV NUM1 ;DIVISION DE 8 BITS SIN SIGNO CON VARIABLES
MOV AL,-10 ;AX=-10
CBW ;EXTENSIÓ N DE SIGNO A 16 BITS
IDIV num2 ;DIVISION DE 8 BITS CON SIGNO
MOV AX,4c00h ;FIN DEL PROGRAMA
INT 21h ;
END INICIO
END

Prog.5:

Descripció n: Este programa ilustra el uso de las instrucciones de salto condicional e


incondicional
*.
MODEL TINY
.DATA
cad1 db 'Las cantidades son iguales...',13,10,'$'
cad2 db 'Las cantidades no son iguales...',13,10,'$'
.CODE
INICIO: ;Punto de entrada al programa
Mov ax,10 ;AX=10
Mov bx,10 ;BX=10
Cmp ax,bx ;Es AX=BX?
Je igual ;S¡, entonces saltar a la etiqueta igual
Lea dx,cad2 ;No, entonces imprimir Cad2
Mov ah,09h ;
Int 21h ;
Jmp salir ;saltar a la etiqueta salir
igual:
Lea dx,cad1 ;imprimir el mensaje en cad1
Mov ah,09h ;
Int 21h ;
salir:
Mov ax,4c00h ;Salir
Int 21h ;
END INICIO
END

Prog.6:

Descripció n: Este programa calcula la sucesió n de Fibonacci para los 10 primeros


términos de la serie, utilizando para ello un ciclo controlado por la instrucció n Loop.
La sucesió n está formada por nú meros, de modo tal que cada nú mero es la suma de los
dos anteriores-
Ejemplo:
1,1,2,3,5,8,13,21,34,55....
*.
MODEL tiny
.CODE
Inicio: ;Punto de entrada al programa
Mov AX,0 ;AX=0
Mov BX,1 ;BX=1 Estos son los dos primeros elementos 0+1=1
Mov CX,10 ;Repetir 10 veces
Repite:
Mov DX,AX ;DX=AX
Add DX,BX ;DX=AX+BX
Mov AX,BX ;Avanzar AX
Mov BX,DX ;Avanzar BX
Loop Repite ;siguiente nú mero
Mov AX,4C00h ;Terminar programa y salir al DOS
Int 21h ;
END Inicio
END

Prog.7:
Descripció n: Este programa ilustra el uso de las instrucciones
AND, OR, XOR y NOT.
*.MODEL TINY
.DATA
Mascara1 db 11111110b
Mascara2 db 00000001b
Dato1 db 11111111b
Dato2 db 00000000b
.CADE
INICIO:
Mov cx,0000h ;CX=0;
Mov al,dato1 ;al=dato1
And al,mascara1 ;al=al and mascara1
Mov ah,dato2 ;ah=dato2
Or ah,mascara2 ;ah=ah or mascara2
Xor bx,bx ;bx=0
Not cx ;cx=not cx
Mov ax,4c00h
Int 21h
END INICIO
END
Prog.8:
Algunos ejemplos:
SHL AX,1 ; Desplaza el contenido de AX una posició n a la izquierda
MOV CX,3 ; Nú mero de veces
SHR AX,CL ; Desplaza AX 3 veces hacia la derecha
SHL BX,4 ; Desplaza BX 4 veces hacia la izquierda

Descripció n: Este programa ilustra el uso de las instrucciones de rotació n y


desplazamiento.
.MODEL TINY
.DATA
dato1 dw 10 ; variable de tipo entero
.CODE
INICIO: ; Punto de entrada al programa
mov ax,1 ; AX=1
mov bx,10 ; BX=10
shl ax,1 ; ax=ax*2
mov cx,3 ; contador igual a 3
shl ax,cl ; ax=ax*8
shr bx,1 ; bx=bx/2
mov cx,2 ;
shr bx,cl ; bx=bx/4
shl dato1,1 ; dato1=dato1*2
mov ax,1 ; ax=1
rol ax,1 ; rotar ax 1 vez
mov bx,-10 ; bx=-10
sal bx,1 ; bx=bx*2
mov ax,4c00h ; Terminar
int 21h ; Salir al dos
END INICIO
END

Prog.9:
Descripció n: Este programa demuestra el uso de las instrucciones para el manejo de la
pila, implementando la instrucció n XCHG con Push y Pop
*.
MODEL tiny
.CODE
Inicio: ;Punto de entrada al programa
Mov AX,5 ;AX=5
Mov BX,10 ;BX=10
Push AX ;Pila=5
Mov AX,BX ;AX=10
Pop BX ;BX=5
Mov AX,4C00h ;Terminar programa y salir al DOS
Int 21h ;
END Inicio
END

Prog.10: Manipulación de cadenas (String)


Las siguientes líneas en ensamblador declaran cadenas:
.DATA
Cadena_ASCII db ‘Cadena’,13,10,’$’ ; Cadena_ASCII reserva un total de 9 bytes de memoria
(1 byte = 1 Cará cter ASCII) incluyendo el cará cter ‘$’ que indica fin de cadena
Cadena_Enteros dw 5 Dup (0) ; Cadena_Enteros reserva espacio para almacenar 3
cantidades enteras o lo que es lo mismo 6 bytes de memoria (1 entero = 2 bytes), todas
inicializadas con cero.
Instrucciones para el manejo de cadenas:
MOVS: Mueve un byte o palabra desde una localidad de memoria a otra.
LODS : Carga desde la memoria un byte en AL o una palabra en AX.
STOS : Almacena el contenido del registro AL o AX en la memoria.
CMPS : Compara localidades de memoria de un byte o palabra.
SCAS : Compara el contenido de AL o AX con el contenido de alguna localidad de
memoria.
Los registros índice juegan un papel importante en el procesamiento de cadenas
de datos, el par de registros CS:SI indican la direcció n de la cadena original que será
procesada, y el par ES:DI contienen la direcció n donde las cadenas pueden ser
almacenadas.
Descripció n: Este programa ilustra la forma de utilizar la instrucció n MOVS para copiar el
contenido de una cadena dentro de otra.
.MODEL tiny
.DATA
cad1 db 'Esta es la cadena1','$'
cad2 db 'Esta es la cadena2','$'
.CODE
inicio: ;Punto de entrada al programa
cld ;Procesamiento de cadenas de izq->der.
mov cx,18 ;longitud de la cadena original
lea di,cad2 ;ES:DI contienen la direcció n de Cad2
lea si,cad1 ;DS:SI contienen la direcció n de Cad1
rep movsb ;DS:SI->ES:DI, SI=SI+1, DI=DI+1
lea dx,cad1 ;Imprimir Cad1 en pantalla
mov ah,09h ;
int 21h ;
lea dx,cad2 ;Imprimir Cad2 en pantalla
mov ah,09h ;
int 21h ;
mov ax,4c00h ;Terminal programa y regresar al DOS
int 21h ;
END inicio
END

Prog.11:

Descripció n: Este programa muestra el uso de la instrucció n LODSB.


El programa invierte el orden de los elementos de una cadena y los almacena en otra
cadena que originalmente está inicializada con espacios. Al final se imprimen las dos
cadenas.
.MODEL tiny
.DATA
cad1 db 'Cadena de prueba','$'
cad2 db 16 dup (' '),'$'
.CODE
inicio: ;Punto de entrada al programa
cld ;Procesamiento de izq->der.
mov cx,16 ;Longitud de la cadena
lea si,cad1 ;DS:SI->Cad1
lea di,cad2+15 ;ES:DI apuntan al final del á rea reservada para
otro: ;almacenar la cadena invertida
lodsb ;Obtener el primer cará cter de Cad1
mov [di],al ;almacenarlo en la posició n actual de DI
dec di ;Disminuir DI
loop otro ;Obtener siguiente carácter de Cad1
lea dx,cad1 ;
mov ah,09h ;Imprimir cadena original
int 21h ;
lea dx,cad2 ;
mov ah,09h ;Imprimir cadena invertida
int 21h ;
mov ax,4c00h ;Terminar programa y regresar al DOS
int 21h ;
END inicio
END
Prog.12:

Interrupciones del BIOS


Manejo de dispositivos periféricos
􀂷 INT 10H Manejo de la pantalla.
􀂷 INT 13H Manejo de unidades de disco.
􀂷 INT 14H Manejo de los puertos de comunicaciones(RS232).
􀂷 INT 15H Manejo de cinta magnética.
􀂷 INT 16H Manejo del teclado.
􀂷 INT 17H Manejo de la impresora.
Manejo del estado del equipo
􀂷 INT 11H Servicios de la lista de elementos de la computadora.
􀂷 INT 12H Servicios para el cálculo del tamañ o de la memoria.
Servicios de fecha y hora
􀂷 INT 1AH Manejo del reloj.
Impresión de pantalla
􀂷 INT 5H Impresió n de la informació n contenida en la pantalla.
Servicios especiales
􀂷 INT 18H Activació n del lenguaje Interprete Basic de la ROM.
􀂷 INT 19H Activació n de la rutina de arranque de la computadora.
Interrupciones del DOS
􀂷 INT 20H Termina la ejecució n de un programa.
􀂷 INT 22H Direcció n de terminació n. Guarda la direcció n donde se transfiere el
control cuando termina la ejecució n del programa.
􀂷 INT 23H Direcció n de la interrupció n que se ejecuta cuando se presiona
Ctrl-Break.
􀂷 INT 24H Manejo de errores críticos.
􀂷 INT 25H Lectura directa de sectores del disco.
􀂷 INT 26H Escritura directa de sectores del disco.
􀂷 INT 27H Terminar un programa y devolver el control al DOS sin borrar el
programa de la memoria.
􀂷 INT 21H Esta interrupció n proporciona una gran cantidad de funciones, las
que deben ser invocadas en conjunto con el registro AH.
1 Terminació n de un programa.
2 Entrada de carácter con eco.
3 Salida a pantalla.
4 Entrada por el puerto serie.
5 Salida por el puerto serie.
6 Salida a la impresora.
7 E/S directa por pantalla.
8 Entrada directa de cará cter sin eco.
9 Entrada de carácter sin eco.
10 Visualizar cadenas de caracteres.
11 Entrada desde el teclado.
12 Comprobació n del estado de entrada.
13 Borrar registro de entrada.
14 Inicializar unidad de disco.

Descripció n: Imprime una cadena de caracteres en la pantalla por medio de la funció n 09h
de la interrupció n 21h del DOS.
*.
MODEL tiny
.DATA
Mensaje db 'Interrupciones 21h del DOS',13,10,'$'
.CODE
Inicio:
Lea DX,Mensaje
Mov Ah,09h
Int 21h
Mov ax,4C00h
Int 21h
END Inicio
END

Prog.13:

Descripció n: Imprime dos cadenas de caracteres en la pantalla por medio de la funció n


09h de la interrupció n 21h del DOS y después espera a que una tecla sea presionada, esto
por medio de la interrupció n 16h del BIOS con la funció n 10h.
*.
MODEL tiny
.DATA
Mensaje db 'Mas interrupciones',13,10,'$'
Mensaje2 db 'Presione cualquier tecla...',13,10,'$'
.CODE
Inicio:
Lea DX,Mensaje
Mov Ah,09h
Int 21h
Lea DX,Mensaje2
Mov Ah,09h
Int 21h
Mov Ah,10h
Int 16h
Mov ax,4C00h
Int 21h
END Inicio
END

Prog.14:

Archivo: first.asm
Este programa pide dos enteros como entrada e imprime su suma
Para crear el ejecutable usando djgpp:
nasm -f coff first.asm
gcc -o first first.o driver.c asm_io.o
%include "asm_io.inc"
; Los datos iniciados se colocan en el segmento .data
segment .data
; Estas etiquetas se refieren a las cadenas usadas para la salida
prompt1 db "Digite un n´umero: ", 0 ; no olvide el fin de cadena
prompt2 db "Digite otro n´umero: ", 0
20 outmsg1 db "Ud. ha digitado ", 0

21 outmsg2 db " y ", 0

22 outmsg3 db ", la suma es ", 0

25 ; Los datos no iniciados se colocan en el segmento .bss


26 ;
27 segment .bss
28 ;

29 ; Estas etiquetas señalan a palabras dobles usadas para almacenar los datos

30 ; de entrada

31 ;

32 input1 resd 1

33 input2 resd 1
34
35 ;
36 ; El código se coloca en el segmento .text
37 ;

38 segment .text

39 global _asm_main

40 _asm_main:

41 enter 0,0 ; setup routine

42 pusha
43
44 mov eax, prompt1 ; print out prompt
45 call print_string
46
47 call read_int ; lee un entero
48 mov [input1], eax ; lo almacena en input1
49
50 mov eax, prompt2 ; print out prompt
51 call print_string
52
53 call read_int ; lee un entero
54 mov [input2], eax ; lo almacena en input2
55
56 mov eax, [input1] ; eax = dword en input1
57 add eax, [input2] ; eax += dword en input2
58 mov ebx, eax ; ebx = eax
59
60 dump_regs 1 ; imprime los valores de los registros
61 dump_mem 2, outmsg1, 1 ; imprimer la memoria
62 ;ahora, se imprimen los resultados en una serie de pasos

64 ;

65 mov eax, outmsg1

66 call print_string ; se imprime el primer mensaje

67 mov eax, [input1]

68 call print_int ; se imprime input1

69 mov eax, outmsg2

70 call print_string ; se imprime el segundo mensaje

71 mov eax, [input2]

72 call print_int ; se imprime input2

73 mov eax, outmsg3

74 call print_string ; se imprime el tercer mensaje

75 mov eax, ebx

76 call print_int ; se imprime la suma (ebx)

77 call print_nl ; se imprime una nueva linea


78
79 popa
80 mov eax, 0 ; retorna a C
81 leave

82 ret first.asm

También podría gustarte