Está en la página 1de 11

Nombre de la

materia
Lenguaje
ensamblador
Nombre de la
Licenciatura
Ingeniera en
Sistemas
c

Computacionales
Nombre del

alumno
Mara Fernanda
Brcenas Enciso
Matrcula
000015772
Nombre de la
Tarea
Tarea 6
Unidad #
Macros y
procedimientos
Nombre del
Tutor

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6

Miriam Armenta
Gonzlez
Fecha
21/10/15

MACROS Y PROCEDIMIENTOS
Introduccin:
En lenguaje ensamblador se denomina macro al conjunto de instrucciones que se agrupan bajo
un nombre descriptivo, despus de que la macro ha sido declarada, slo es necesario indicar su
nombre en el cuerpo del programa y el ensamblador se encargara de reemplazarla por las
instrucciones de dicha. Las instrucciones de macros se pueden guardar en el mismo programa
o en un archivo separado que el programa pueda identificar y se ejecutan pulsando una
combinacin especial de teclas o un botn creado para esa accin.
Una de las ventajas que brinda el uso de las macros es la creacin de bibliotecas, las cuales
son grupos de macros que pueden ser incluidas en un programa desde un archivo diferente.
Para la creacin de estas bibliotecas, solo tenemos que escribir un archivo con todas las
macros que se necesitarn y guardarlo como archivo de texto y posteriormente se pueden
integrar para su ejecucin.
Un procedimiento es un conjunto de instrucciones en el cual podemos dirigir el flujo de nuestro
programa, al finalizar la ejecucin de dichas instrucciones se restablece el control a la siguiente
linea a procesar del cdigo que mando llamar al procedimiento. Los procedimientos nos ayudan
a crear programas legibles y fciles de modificar. Al momento de invocar a un procedimiento se
guarda en la pila la direccin de la siguiente instruccin del programa para que, una vez
transferido el flujo del programa y terminado el procedimiento, se pueda regresar a la linea
siguiente del programa original.

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6

Desarrollo:
Ejercicios de programacin:
Escriba los siguientes programas en ensamblador de 16 bits con comentarios y estructura
estndar. Para ello puede utilizar todos los programas que se han realizado con anterioridad.
Puede reutilizar cdigo de las clases y libros, pero no copiarlos en su totalidad. Todos los
procedimientos y macros deben localizarse en una librera aparte con extensin *.lib
1) Escriba SOLO UNA de las siguientes macros (El resultado se deja en DX):
Macro para elevar a la potencia n-sima un nmero entero.

Macro para calcular el factorial del valor n.


TITLE Clculo de un factorial (Fact.asm)
INCLUDE Irvine32.inc
.code
main PROC
push 12 ; calcula el factorial de 12
call Factorial ; calcula factorial (EAX)
RetornoMain:
call WriteDec ; lo muestra
call Crlf
exit
main ENDP
;-------------------------------------------------------Factorial PROC
; Calcula un factorial.
; Recibe: [ebp+8] = n, el nmero a calcular

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6
; Devuelve: eax = el factorial de n
;--------------------------------------------------------push ebp
mov ebp,esp
mov eax,[ebp+8] ; obtiene n
cmp eax,0 ; n > 0?
ja L1 ; s: contina
mov eax,1 ; no: regresa a 1
jmp L2
L1: dec eax
push eax ; Factorial(n-1)
call Factorial
; Las instrucciones de aqu en adelante se ejecutan cuando
; regresa cada una de las llamadas recursivas.
RetornoFact:
mov ebx,[ebp+8] ; obtiene n
mul ebx ; EDX: EAX = EAX * EBX
L2: pop ebp ; devuelve EAX
ret 4 ; limpia la pila
Factorial ENDP
END main

Macro para calcular la suma de los enteros que hay entre n1 y n2 (incluyndolos).
2) Escriba una macro que reciba los coeficientes (enteros) de una ecuacin cuadrtica y
determine el valor de las races, si stas son enteras.
3 ; a*x^2 + b*x + c = 0
4 ; Prototipo de C:
5 ; int quadratic( double a, double b, double c,
6 ; double * root1, double *root2 )
7 ; Parametros:
8 ; a, b, c - Coeficientes de la ecuacion cuadratica (ver arriba)
9 ; root1 - Apuntador al double que almacena la primera raz

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6
10 ; root2 - Apuntador al double que almacena la segunda raz
11 ; Valor de retorno:
12 ; devuelve 1 si las races son reales si no 0
13
14 %define a qword [ebp+8]
15 %define b qword [ebp+16]
16 %define c qword [ebp+24]
17 %define root1 dword [ebp+32]
18 %define root2 dword [ebp+36]
19 %define disc qword [ebp-8]
20 %define one_over_2a qword [ebp-16]
21
22 segment .data
23 MinusFour dw -4
24
25 segment .text
26 global _quadratic
27 _quadratic:
28 push ebp
29 mov ebp, esp
30 sub esp, 16 ; asigna 2 doubles (disc & one_over_2a)
31 push ebx ; debe guardar el valor original de ebx
32
33 fild word [MinusFour]; pila -4
34 fld a ; pila: a, -4
35 fld c ; pila: c, a, -4
36 fmulp st1 ; pila: a*c, -4
37 fmulp st1 ; pila: -4*a*c
38 fld b
39 fld b ; pila: b, b, -4*a*c
40 fmulp st1 ; pila: b*b, -4*a*c
41 faddp st1 ; pila: b*b - 4*a*c
42 ftst ; prueba con 0
43 fstsw ax

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6
44 sahf
45 jb no_real_solutions ; if disc < 0, no hay soluciones reales
46 fsqrt ; pila: sqrt(b*b - 4*a*c)
47 fstp disc ; almacena y saca de la pila
48 fld1 ; pila: 1.0
49 fld a ; pila: a, 1.0
50 fscale ; pila: a * 2^(1.0) = 2*a, 1
51 fdivp st1 ; pila: 1/(2*a)
52 fst one_over_2a ; pila: 1/(2*a)
53 fld b ; pila: b, 1/(2*a)
54 fld disc ; pila: disc, b, 1/(2*a)
55 fsubrp st1 ; pila: disc - b, 1/(2*a)
56 fmulp st1 ; pila: (-b + disc)/(2*a)
57 mov ebx, root1
58 fstp qword [ebx] ; almacena en *root1
59 fld b ; pila: b
60 fld disc ; pila: disc, b
61 fchs ; pila: -disc, b
62 fsubrp st1 ; pila: -disc - b
63 fmul one_over_2a ; pila: (-b - disc)/(2*a)
64 mov ebx, root2
65 fstp qword [ebx] ; almacena en *root2
66 mov eax, 1 ; valor de retorno es 1
67 jmp short quit
68
69 no_real_solutions:
70 mov eax, 0 ; valor de retorno es 0
71
72 quit:
73 pop ebx
74 mov esp, ebp
75 pop ebp
76 ret quad.asm

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6
Assembler;
Asm
Mov AX,0600h
Mov BH,18h
Mov CX,0000h
Mov DX,184Fh
Int 10h
End
3) Escriba los siguientes procedimientos:
I) clear: procedimiento que borra la pantalla
.model tiny
.data
.code
clear macro
mov ah,00h ;limpia la pantalla
mov al,03h
int 10h
endm
.startup
clear ;macro clear
mov ah,01h ;pedimos un caracter
int 21h ;para esperar el resultado
.exit
end

II) blue: procedimiento que deja en azul la pantalla


http://tipsparaisc.blogspot.mx/2012/04/ensamblador-8086-modo-13h-paleta-de.html
copiar el ejemplo de esa pg, posteriormente eliminar estas lineas

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6

III) recibe: procedimiento que recibe un entero de varias cifras por teclado y lo coloca en
la pila

4) Escriba UNO SOLO de los siguientes procedimientos (el resultado se deja en DX):
Determine el mayor, menor de n valores enteros guardados en la pila.
Calcule el promedio con dos decimales de n valores enteros en la pila.:

.Model Small
.Stack 64
.Data
msj Db 0ah,0dh, ' Digita las 3 calificaciones: ','$'
msj2 Db ' Aprobado','$'
msj3 Db ' Reprobado','$'
msj4 Db 0ah,0dh, ' Desea capturar otro alumno? 1.-Si, 2.-No','$'
num db 0
sum db 0
prom db 0
.Code
inicio:
mov cx,03h ;numero de calificaciones a pedir
mov bl,0000h
mov al,0000h
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset msj
int 21h
Pedir: ;Pide 3 calificaciones, contador asignado en CX
mov ah,01h
int 21h

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6
sub al,30h
add bl,al ;Hacemos la suma de las calificaciones y las asignamos en bl
aaa
loop pedir ;repite ciclo
jmp promedio
promedio: ;siemplemente divide el resultado de la suma entre 3
mov ax,bx ;pasamos el total de la suma a AX
mov bl,03h
div bl ;dividimos AX entre bl
aad ;ajuste
mov bl,al ;movemos el resultado a bl para imprimirlo
mov ah,02h
mov dl,bh
add dl,30h
int 21h
mov dl,bl
add dl,30h
int 21h
cmp bl,07h ;comparamos si el resultado (bl) es 7
ja apro ;si es mayo salta a la etiqueta apro
je apro ;si es igual salta a la etiqueta apro
jb repro ; si es menor salta a la etiqueta repro
apro: ;Solo imprime el mensaje de aprobado
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset msj2
int 21h
jmp otro
repro: ;Solo imprime el mensaje de reprobado
mov ax,@data
mov ds,ax

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6
mov ah,09
mov dx,offset msj3
int 21h
jmp otro
otro: ;Imprime el mensaje si quiere otro promedio y compara con 1 para repetir todo el programa
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset msj4
int 21h
mov ah,01h
int 21h
cmp al,31h
je inicio
ja salir
jb salir
salir:
mov ah,04ch
int 21h
end inicio
Cuente las veces que un nmero x aparece dentro de los primeros n valores de la pila.
Entregue slo los archivos *.asm

y una librera *.lib una vez que haya probado el

correcto funcionamiento de cada programa, procedimiento o macro.

Unidad 6. Macros y procedimientos


Lenguaje Ensamblador, Tarea 6

Conclusin:

Los macros son una herramienta muy importante, ya que nos facilitan la manera de simplificar
el cdigo de los programas, al llamar la macro en determinada seccin del cdigo para realizar
una tarea especfica, de igual manera los procedimientos nos ayudan a crear programas
legibles, precisos y fciles de modificar.

Bibliografa:
Scribd (2010) Ensamblador. En Scribd. Consultado el 20 de octubre del 2015. Disponible en:
https://es.scribd.com/doc/23105148/Unidad-III-Ensamblador

Monografas (2013) Programacin en ensamblador. En monografas. Consultado el 21 de


octubre del 2015. Disponible en: http://www.monografias.com/trabajos-pdf/programacionensamblador-procesadores/programacion-ensamblador-procesadores.pdf

Lenguaje ensamblador (2012) Lenguaje ensamblador. En Wikipedia. Consultado el 21 de


octubre del 2015. Disponible en: https://es.wikipedia.org/wiki/Lenguaje_ensamblador