Вы находитесь на странице: 1из 7

Prctica de Laboratorio N 4

Asignatura: Lenguaje de Maquina Unidad Tema Docente : I Introduccin al lenguaje ensamblador : Juego de instrucciones : Lic. Luis Ramirez Milla

I.-Objetivos.

1. Elaborar aplicaciones que utilicen el juego de instrucciones del 8086.

II. Requisitos previos.

1. Manejo eficiente del sistema operativo.

III.- Programas a utilizar.

1. MASM (ensamblador)

IV.- Introduccin terica.

Aunque el ttulo dice "del 8086", se entremezclan

algunas peculiaridades de los procesadores

superiores; en la mayora de los casos quedar claro si sirven o no en un 8086 (si usan EAX, por ejemplo, es evidente que no). Una diferencia fundamental del 8086 con sus descendientes es que algunas de estas mismas instrucciones pueden recibir, adems de los operandos habituales, otros adicionales propios de los nuevos procesadores. Me explico. Uno en un 386 puede hacer ADD AX,BX (AX=AX+BX) como un 8086 cualquiera, pero adems, por contar con registros de 32 bits, podr hacer cosas del estilo ADD EAX,EBX. En ambos casos se tratar de la misma instruccin (ADD, sumar), slo que si el procesador cuenta con ms registros, o registros extendidos, o simplemente capacidad de admitir nuevos operandos, podremos usarlos. Para esta instruccin en particular la sintaxis se describir como ADD destino, origen, pero por destino y origen no ser necesariamente vlido cualquier modo de direccionamiento. Depender de la instruccin, y en cierta medida del procesador que se use. En la mayora de los casos imperarn las reglas generales "no es vlido operar de memoria a memoria" y "no es vlido operar con registros de segmento". Hay adems una cierta lgica en estas restricciones (el operando destino generalmente es un registro de propsito general), e instrucciones similares entre s aceptarn casi con toda seguridad los mismos operandos. Se harn algunas observaciones sobre los

operandos vlidos para cada instruccin, pero de nuevo para cualquier duda lo mejor ser echar mano de una tabla "oficial" (que es lo que hacemos todos, no te creas que alguien se lo aprende de memoria).

V.- Resumen del desarrollo de la prctica.

Elaborar aplicaciones que pongan en prctica el juego de instrucciones del 8086.

VI.- Desarrollo de la prctica.

1. Aplicacin N 1 Funcionalidad: Leer una cadena de caracteres e imprimirlos. Programa: TITLE LEEIMPCA DATOS SEGMENT MENSAJE DB "ESCRIBA SU NOMBRE : $" NOMBRE DB 40H DUP(?) ; 40H OCTETOS PARA LECTURA DE LA CADENA DATOS ENDS ; CODIGO SEGMENT

ASSUME CS:CODIGO, DS:DATOS INICIO: MOV AX,DATOS MOV DS,AX ; MOV DX,OFFSET MENSAJE MOV AH, 09H INT 21H ; MOV DX,OFFSET NOMBRE MOV SI, DX MOV BYTE PTR[SI], 31H ; MAXIMO DE CARACTERES A LEER MOV AH , 0AH INT 21H ; MOV AH, 02H ; IMPRIME CAMBIO DE LINEA ; LEE CARACTERES EN DS:DX+2

MOV DL,0AH INT 21H ; MOV DL,0DH INT 21H ; ; IMPRIMIR CADENA LEIDA A PARTIR DE NOMBRE + 2 CON "$" AL FINAL ; DX RECIBE COMIENZO NOMBRE + 2 ; MOV DX, OFFSET NOMBRE ADD DX,2 MOV BL, BYTE PTR [SI+1] MOV BH,0H MOV BYTE PTR [SI+BX+2],"$" MOV AH, 09H INT 21H ; MOV AH,4Ch INT 21H ; CODIGO ENDS ; END INICIO ; FIN DEL PROCESO ; NUMERO DE CARACTERES LEIDOS EN BX

2. Aplicacin N 2 Funcionalidad: Leer una cadena de caracteres e imprimirlos en orden inverso. Programa: DATOS SEGMENT MENSAJE1 DB "INGRESE TEXTO: $" MENSAJE2 DB 0ah,0dh,"EL TEXTO INVERTIDO ES: $" TEXTOI DB 255 DB 0 DB 255 DUP(0) ; DATOS ENDS ; PILA SEGMENT PARA STACK "STACK" DB 64 DUP(?) PILA ENDS

; PROGRAMA SEGMENT ; ASSUME CS:PROGRAMA, DS:DATOS INICIO: MOV AX,DATOS MOV DS,AX ; MOV DX,OFFSET MENSAJE1 MOV AH, 09H INT 21H ; MOV DX,OFFSET TEXTOI MOV BX,DX MOV AH,0ah INT 21h ; MOV DX, OFFSET MENSAJE2 MOV AH,09H INT 21H ; MOV CL,BYTE PTR [BX+1] MOV CH,0 MOV DI,CX ; OTRO: MOV DL,BYTE PTR [BX + 1 + DI] MOV AH,02h INT 21h ; DEC DI CMP DI,0h JNZ OTRO ; MOV AH,4CH INT 21H ; PROGRAMA ENDS END INICIO 3. Aplicacin N 3 Funcionalidad: Imprimir un nmero en pantalla. Programa:
TITLE IMPDEC_L - IMPRIME UN NUMERO DECIMAL COMMENT * EL NUMERO ESTA ALMACENADO EN EL SEGMENTO DE DATOS * ; DATOS SEGMENT NUM DW 4321 ; NUMERO DECIMAL DE PRUEBA DATOS ENDS ; PILA SEGMENT STACK DB 10h DUP(?) PILA ENDS

; PROGRAMA SEGMENT ASSUME CS:PROGRAMA, DS:DATOS COMIENZO: MOV AX,DATOS MOV DS,AX ; MOV BX,10 ; BASE 10 EN BX MOV AX,1 ; CALCULA MENOR POTENCIA DE 10 QUE EXCEDA A NUM REPETIR: CMP AX,DS:0 ; COMPARA AX CON NUM JA LISTO MUL BX JMP REPETIR LISTO: DIV BX ; POTENCIA CORRECTA EN AX, CON IGUAL NUMERO DE DIGITOS QUE NUM XCHG AX,CX ; PONERLA EN CX MOV AX,DS:0 ; PREPARA DIVISION. MOV AX,NUM DIGITO: MOV DX,0 ; EXTENSION DE DIVIDENDO DIV CX ; AX O AL CONTIENE DIGITO BUSCADO PUSH DX ; SALVA RESTO DE DIVISION EN LA PILA ADD AL,"0" ; CONVERTIR A CARACTER DE DIGITO MOV DL,AL ; Y PASARLO A DL MOV AH,2 ; PARA IMPRIMIR INT 21h POP AX ; RECUPERA RESTO EN AX CMP AX,0 JE FIN ; SI ES CERO FINALIZAR SUBRUTINA XCHG AX,CX ; EN CASO CONTRARIO, INTERCAMBIO PARA HALLAR MOV DX,0 ; SIGUIENTE POTENCIA DE 10 DIVIDIENDO AX DIV BX ; ENTRE BX (10 DECIMAL) XCHG AX,CX ; DATOS PREPARADOS PARA TRATAR EL SIGUIENTE JMP DIGITO ; DIGITO FIN: MOV AH,4CH ; FIN DEL PROCESO INT 21H ; PROGRAMA ENDS ; END COMIENZO

4. Aplicacin N 4 Funcionalidad: Calcular el factorial de un nmero. Programa:


TITLE FACTOR_L - CALCULO DEL FACTORIAL DE UN NUMERO COMMENT * COMBINA LA FUNCIONALIDAD DE LOS PROCEDIMIENTOS Y SIENDO ESTE ADEMAS RECURSIVO * ; DATOS SEGMENT RES DW 1 DIEZ DW 10 MENSAJE DB "Ingrese nmero (1-8) : $" LINEA_FACTOR DB 13,10,"El factorial es : $" ERROR_INGRESO DB 13,10,"Ingrese un numero del 1 al 8 solamente $" CADENANUM DB 4 DUP(?)

CADENARES DB 10 DUP(?) DATOS ENDS ; PILA SEGMENT STACK DB 252 DUP(?) PILA ENDS ; CODIGO SEGMENT ASSUME CS:CODIGO, DS:DATOS, SS:PILA INICIO: MOV AX,DATOS MOV DS,AX MOV DX,OFFSET MENSAJE ;IMPRIMIR MENSAJE MOV AH,9 INT 21H ; MOV DX,OFFSET CADENANUM ;LEE CADENA NUMERICA MOV SI,DX MOV BYTE PTR[SI],2 ; UN SOLO DIGITO MOV AH,0AH INT 21H SUB CH,CH ; HACER CH = 0 MOV CL,[SI+2] ; CARACTER DE DIGITO A NUMERO SUB CL,"0" ; CX CONTIENE NUMERO CMP CL,9 JE ERRORNUMERO ; CALL FACTORIAL ; LLAMA AL PROCEDIMIENTO FACTORIAL ; EL VALOR DEL FACTORIAL ESTA EN LA VARIABLE RES ; ; ; INICIO DE CONVIERTE NUMERO A CADENA MOV CX,0 ; CONTADOR DE NUMERO DE DIGITOS SALVADOS EN LA PILA MOV AX,RES ; NUMERO A CONVERTIR EN CADENA OTRO: MOV DX,0 ; DIV DIEZ ; PARA DIVISION DE 16 BITS ; DL = RESTO DE DIVISION ES ULTIMO DIGITO ADD DL,"0" ; Y DEBE SER CONVERTIDO A CARACTER PUSH DX ; SALVARLO EN LA PILA INC CX ; AUMENTAR CONTADOR CMP AX,0 ; COMPROBAR SI YA SE REDUJO A CERO JNE OTRO LISTO1: MOV DX,OFFSET CADENARES ; PASAR LOS DIGITOS DE LA PILA A CADENARES MOV SI,DX OTRO1: CMP CX,0 ; COMPROBAR SI LA PILA CONTIENE DIGITOS JE LISTO2 POP AX ; OBTENER DIGITO DE LA PILA MOV [SI],AL ; Y PASARLO A DS:SI INC SI ; A LA SIGUIENTE POSICION EN CADENARES DEC CX ; DISMINUIR CONTADOR JMP OTRO1 LISTO2: MOV BYTE PTR [SI],"$" ; FIN DE CONVIERTE NUMERO A CADENA ; MOV DX, OFFSET LINEA_FACTOR MOV AH,9 INT 21H MOV DX, OFFSET CADENARES ; IMPRIMIR CADENA DE RESULTADO MOV AH,9 INT 21H

JMP FIN ERRORNUMERO: MOV DX, OFFSET ERROR_INGRESO MOV AH,9 INT 21H FIN: MOV AH,4CH SUB AL,AL INT 21H ; FACTORIAL PROC NEAR CMP CX,1 JE FINPROC PUSH CX ; SI CX ES MAYOR QUE 1, SALVAR SU VALOR ACTUAL DEC CX ; Y CALCULAR FACTORIAL DE CX-1 CALL FACTORIAL MOV AX,RES ; RES CONTIENE FACTORIAL DE CX-1 POP CX ; RESTAURAR VALOR ACTUAL DE CX MUL CX ; Y HALLAR EN AX NUEVO VALOR DE FACTORIAL=CX*RES MOV RES,AX ; ACTUALIZAR RES FINPROC: RET FACTORIAL ENDP ; CODIGO ENDS ; END INICIO

Вам также может понравиться