LENGUAJE ENSAMBLADOR PRÁCTICA 12 PRÁCTICA 12

Documentos relacionados
LENGUAJE ENSAMBLADOR PRÁCTICA 11 PRÁCTICA 11 CUATRO OPERACIONES FUNDAMENTALES EN NÚMEROS DE 8 BYTES

LENGUAJE ENSAMBLADOR PRÁCTICA 16 PRÁCTICA 16

LENGUAJE ENSAMBLADOR PRÁCTICA 1 PRÁCTICA 1 PROGRAMA PARA EXHIBIR EN PANTALLA EL CÓDIGO DE BARRIDO DE LA TECLA OPRIMIDA

P1.- Para facilitar la tarea, suponemos definido en el segmento de datos lo siguiente:

Pregunta correcta= 0,3 Pregunta no contestada= 0 Pregunta incorrecta (tipo test)= -0,15

MÓDULO III PROGRAMACIÓN DEL MICROPROCESADOR

[etiqueta:] REP MOVSn

ENSAMBLADOR DE ARCHIVO TASM MASM NASM GAS. Características de un Ensamblador de Archivo

Arquitectura de Computadores II 8086 Parte II

Conceptos de Arquitectura de Computadoras Curso 2015

Sobre cómo dividir un programa ensamblador x86 (modo Real) en módulos compilables por separado.

SISTEMAS BASADOS EN MICROPROCESADOR 2º Grado Ingeniería Informática (EPS UAM) EXAMEN FINAL EXTRAORDINARIO JULIO 2013 ENUNCIADO DEL PROBLEMA

Instrucción De Salto Incondicional

Tema 5: La pila, las macros y los procedimientos

Práctica 2. Registros y posiciones de memoria

Práctica 4. Lenguaje máquina y lenguaje ensamblador

62/8&,21(6$/(;$0(1'( /$%25$725,2'((6758&785$6'(/26&20387$'25(6 &8562)(%5(52

Intel Arquitectura. Programación en Ensamblador Ing. Marcelo Tosini

Introducción al ensamblador 80x86

SISTEMAS BASADOS EN MICROPROCESADORES

Arquitectura (Procesador familia 80 x 86 )

Intel 8086 modelo básico (primera parte) Registros:

SISTEMAS BASADOS EN MICROPROCESADORES

LENGUAJE ENSAMBLADOR PRÁCTICA 13 PRÁCTICA 13

Iniciación del mouse El servicio utilizado es el 00, este servicio inicializa el controlador del mouse como sigue:

Parámetro de entrada. Un parámetro pasado del procedimiento que hace la llamada al procedimiento invocado.

Arquitectura de Computadores II Introducción al 8086

Arquitectura intel Preámbulo de OSO para alumnos formados en el procesador MIPS. Asignatura Sistemas Operativos Murcia abril de 2005

Alternativas de programación

Asignatura: ASSEMBLER INF-153 LABORATORIO 1

DIRECTIVAS DEL ASM86

Tema 4. Lenguaje máquina y lenguaje ensamblador

Todos los comandos de DEBUG se invocan usando una sola letra y son los siguientes:

ESTRUCTURA DE COMPUTADORES I (Capítulo 14: DIRECTIVAS) 1/32 14-DIRECTIVAS

Desarrollo de Programas Residentes en base a un TSR genérico

MANUAL DE PROGRAMACIÓN EN ENSAMBLADOR 8086

EL EMU8086 Y EL MICROPROCESADOR 8086.

SISTEMAS BASADOS EN MICROPROCESADORES

PRÁCTICA 2 CONVERSIÓN DE UN NÚMERO DECIMAL A BINARIO Y HEXADECIMAL Y VICEVERSA 1. INTRODUCCIÓN 2. OBJETIVOS 3. DESARROLLO

REPERTORIO DE INSTRUCCIONES DEL MICROPROCESADOR 8086

UNIVERSIDAD TECNOLÓGICA NACIONAL FACULTAD REGIONAL SAN NICOLÁS INGENIERIA EN ELECTRÓNICA

Instrucciones de Control de Flujo y Usos de la Pila

Trabajo Práctico Nro 3: Assembler

EJEMPLOS EN ENSAMBLADOR

Práctica 3: El teclado del PC

Tema 5. Presentación de datos por pantalla

Apellidos Nombre DNI

Introducción al NASM. Convenciones de colores

Apéndice complementario a la práctica 6 Periféricos Avanzados. EL - DISCO

CAPÍTULO 3 PROGRAMACIÓN EN AMBIENTE DE PC

Resumen de las instrucciones del 8086/8088

Tema 4. Lenguaje máquina y lenguaje ensamblador

2 de septiembre de 2010 Hoja: 1 / 10. Solamente existe una opción válida en las preguntas de respuesta múltiple.

Examen de Arquitectura de Computadores 2 22 de febrero del 2011

Tema 5.1: Presentación de datos en pantalla

LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR

INTRODUCCIÓN. Interrupciones.

Ensamblador para el 80x86

Digital II Documentación de las instrucciones INdg2, OUTdg2 y de los dispositivos mapeados en el espacio de E/S

La arquitectura del 8086/8088

INDICE Parte 1. Visual Basic Capitulo 1. Qué es Visual Basic? Capitulo 22. Mi Primera Aplicación Capitulo 3. Elementos del lenguaje

LENGUAJE ENSAMBLADOR PRÁCTICA 5 PRÁCTICA

PRONTUARIO I. INFORMACIÓN GENERAL

Tema 4: Lenguaje máquina - Lenguaje ensamblador

TAREA 1 ARITMETICA PARA BCD Y ASCII.

Tema 2. Presentación de datos por pantalla. La ROM-BIOS

Ciclos de máquina. Otro ejemplo: decremento de un registro par (donde rp = HL, DE, BC, SP) DCX rp

Mod. I, Unid. 1, Obj. 1 CRITERIO DE DOMINIO 1/1

PRACTICA #1. Aprender a programar una interrupción software empleando C y/o Ensamblador.

Programas Residentes En Lenguaje Ensamblador

INSTRUCCIONES ARITMÉTICAS.

6-REGISTROS DEL 8086 Y DEL 80286

Buses y Periféricos. ITIS. Ensamblador y Turbo debugger

El microprocesador de 16 bits 8086

Práctica Nº 4 Entorno de Programación

Ingeniería en Sistemas. Sistemas Operativos. Trabajo Práctico: Repaso de Interrupciones, direccionamiento de memoria y registros del procesador.

Relación de Problemas I

Tema 3: ASCII y operaciones de desplazamiento y lógicas

Manual de Programación X86 sobre plataforma FPGA.

Ejemplo del uso de las subrutinas

INEL 4206 Microprocesadores Texto: Barry B Brey, The Intel Microprocessors:

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Registros de la CPU. IP Registro de apuntador de siguiente instrucción

Práctica 4. Organización del Computador 1 12 de septiembre de Algunas consideraciones preliminares:

El Diseño de un Lenguaje Máquina

control de Luces por el Puerto Paralelo 378H (16 Luces 4 bloques de 4)

Conmutación de Tareas

Fig. 1: Tipos de datos que puede manejar el procesador

Informática Ingeniería en Electrónica y Automática Industrial

Comparaciones en lenguaje ensamblador

ESTRUCTURA DE COMPUTADORES I (Capítulo 16:El Teclado) 1/5 16-EL TECLADO

UNIVERSIDAD NACIONAL DE INGENIERIA. Programación en Lenguaje Ensamblador

Programación Avanzada en Lenguaje Ensamblador

APUNTES DE LENGUAJE ENSAMBLADOR. Lenguaje ensamblador

Macro posicionado de cursor PAMCUR

Este grupo es una continuación del anterior, incluye las siguientes instrucciones:

APÉNDICE D. Directivas, Operadores e Instrucciones del Lenguaje Ensamblador

DISPLAY LCD MICROPROCESADORES

Transcripción:

PRÁCTICA 12 EJECUCIÓN DE UN PROGRAMA HIJO DESDE UN PROGRAMA PADRE 1. INTRODUCCIÓN En esta práctica veremos como se puede ejecutar un programa cualquiera desde nuestro programa mediante la función EXEC del DOS. En efecto, se tendrá lo que se conoce como shell lo que implica que se puede ejecutar un programa, al que se le llama programa hijo, desde otro, el cual es llamado programa padre. En particular, se puede ejecutar una copia del ejecutor de comandos del DOS, command.com, del cual se regresa al programa padre con el comando exit. Además, veremos un programa sencillo que reporta fecha, tiempo y equipo de nuestro sistema 2. OBJETIVOS Al término de esta práctica el alumno podrá: 2.1 Ejecutar programas sin abandonar una aplicación. 2.2 Obtener fecha, tiempo y equipo básico del sistema. 2.3 Hacer que un programa que sea más amigable, es decir, que diga al usuario cómo debe usarse. 3. DESARROLLO 3.1 Calcular el siguiente módulo con el nombre SHELL.ASM, ensamblarlo y ligarlo para obtener SHELL.EXE. %TITLE PROGRAMA QUE USA LA FUNCIÓN EXEC PARA SIMULAR UN SHELL ; Ensamblar mediante: tasm /zi shell ; Ligar mediante: tlink /v shell ; Usar mediante: c:\sem386>shell EntStd EQU 0 ;handle para entrada estándar SalStd EQU 1 ;handle para salida estándar ErrStd EQU 2 ;handle estándar para errores rc EQU 0dh ;ASCII para orno de carro ni EQU 0ah ;ASCII para nueva línea blanco EQU 20h ;ASCII para espacio escape EQU 1bh ;ASCII del escape 12-1

IDEAL DOSSEG MODEL small STACK 256 INCLUDE DATASEG ClaveFin DB 0 ;código de salida ; Tabla de comandos internos, cada entry es una cadena ASCIIZ Comandos DB BORRA,0 DW OFFSET BORRA DB DOS,0 DW OFFSET DOS DB SALE,0 DW OFFSET SALE DB CONVI,0 DW OFFSET CONVI DB EQUIPO,0 DW OFFSET EQUIPO DB RELOJ,0 DW OFFSET RELOJ DB 0 VarAmb DB COMSPEC=,0 ;variable de ambiente SegAmb DW 0 ;segmento del bloque de ambiente SpecCmndo DB 80 dup (0) ;especificaciones para COMMAND.COM CadNula DB 0,rc ;cola nula para ejecutar COMMAND.COM Aviso1 DB rc,nl, Imposible liberar memoria,rc,nl Largo1 = (offset this byte) (offset Aviso1) Aviso2 DB rc,nl, EXEC para COMMAND.COM falló,rc,nl Largo2 = (offset this byte) (offset Aviso2) Aviso3 DB rc,nl, No hay variable COMSPEC en el ambiente,rc,nl Largo3 = (offset this byte) (offset Aviso3) CadBorra DB escape, [2] ;secuencia ANSI de escape para borrar LargoB = (offset this byte) (offset CadBorra) SegPila DW 0 ;valor original de SS ApuntaPila DW 0 ;valor original de SP Bloque DW 0 ;bloque de parámetros de EXEC ParamCmndo DD ColaCmndo ;línea de comandos DD fcb1 ;bloque de control de arch 1 DD fcb2 ;bloque de control de arch 2 fcb1 DB 0 ;bloque para arch 1 12-2

fcb2 DB 0 ;bloque para arch 2 ColaCmndo DB 0, /C BufEnt DB 80 dup (0) ;línea de comandos de entrada LargoE = (offset this byte) (offset BufEnt) largocmndo = (offset this byte) (offset Cola Cundo) Pide DB rc,nl, sh: ;aprontador de SHELL LargoP = (offset this byte) (offset Pide) ColaConvi DB convi,exe,0 ColaNumero DB 765,rc,0 BloqueC DW 0 ;bloque de parámetros de EXEC ParamConvi DD ColaNumero ;línea de comando DD fcb1o ;bloque de control de arch 1o DD fcb2o ;bloque de control de arch 2o fcb1o DB 0 ;bloque para arch 1o fcb2o DB 0 ;bloque para arch 2o ColaEquipo DB equipo.exe,0 ColaNumE DB 765,rc,0 BloqueCE DW 0 ;bloque de parámetros de EXEC ParamEquipo DD ColaNumE ;línea de comandos DD fcb1oe ;bloque de control de arch 1o DD fcb2oe ;bloque de control de arch 2o fcb1oe DB 0 ;bloque para arch 1o fcb2oe DB 0 ;bloque para arch 2o ColaReloj DB reloj.com,0 ColaNumR DB 765,rc,0 Bloquear DW 0 ;bloque de parámetros de EXEC ParamReloj DD ColaNumR ;línea de comandos DD fcb1or ;bloque de control de arch 1o DD fcb2or ;Bloque de control de arch 2o fcb1or DB 0 ;bloque para arch 1o fcb2or DB 0 ;bloque para arch 2o 12-3

CODESEG Inicia: mov ax,@data ;hace el segmento de datos mov ds,ax ;direccionable mov ax,[es:2ch] ;trae segmento de ambiente mov [SegAmb] ;desde el PSP y lo salva ; suelta la memoria que no necesita.. mov bx,100h ;BX = párrafos que requiere mov ah,4ah ;cambia tamaño del bloque int 21h ;con DOS jnc @@10 ;brinca, sí se pudo mov dx,offset Aviso1 ;cambia de tamaño falló, avisa mov cx,largo1 jmp @@40 call TraeSpec ;trae especificaciones de COMMAND.COM jnc @@20 ;brinca si la halló mov dx,offset Aviso3 ;avisa que COMSPEC no fue hallado mov cx,largo3 ;en el ambiente jmp @@40 @@20: D_FijaVector 23h,@@30 ;fija vector para Ctrl.-C (23h) @@30: call TraeCmndo ;trae el comando del usuario call Interno ;verifica si es función interna jnc @@30 ;sí, es procesada @@40: mov bx,errstd ;BX = handle estándar para errores mov ah,40h ;escribe archivo o dispositivo int 21h ;con DOS mov [Clave]Fin],1 D_TerminaClaveFin ;macro para regresar a DOS PROC Interno mov si,offset Comandos ;DS:DI apunta a tabla cmp [byte si],0 ; fin de la tabla? je @@70 ;sí, brinca mov di,offset BufEnt ;no, que DI apunte al buffer de entrada @@20: cmp [byte di],blanco ;tira espacios delanteros jne @@30 inc di ;fue blanco, bríncalo jmp @@20 12-4

@@30: mov al,[si] ;trae siguiente carácter de la tabla or al,al ;fin de cadena jz @@40 ;salta, si acabó cmp al,[di] ;compara carácter recibido jnz @@60 ;brinca, si no son iguales inc si ;avanza apuntadores de cadenas inc di jmp @@30 @@40: cmp [byte di],rc ;asegurarse que la cadena del usuario je @@50 ;sea del mismo tamaño cmp [byte di],blanco ;siguiente carácter dado debe ser blanco jne @@60 ;ENTER @@50: call [word si+1] ;corre la rutina interna clc ;CF = 0 (corrió uno interno) @@60: lodsb ;busca el final de este comando or al,al ; nulo? jne @@60 ;no, sigue buscando add si,2 ;brinca la dirección de la rutina jmp @@10 ;compara vs siguiente comando @@70: stc ;no igualó a ningún comando Interno ENDP PROC Externo ;procesa comando externo pasándolo a COMMAND.COM con cola /C mov al,cr ;halla largo del comando mov cx,largocmndo ;al buscar el orno de carro mov di,offset ColaCmndo+1 cld repne scasb mov ax,di ;calcula largo de cola sub ax,offset ColaCmndo+2 mov [ColaCmndo[,al ;salva el largo ; Fija la dirección de la cola. mov [word ParamCmndo],offset ColaCmndo call EXEC ;corre COMMAND.COM ENDP Externo PROC TraeCmndo ;pide al usuario el comando y lo trae mov dx,offset Pide ;DS:DX = dirección del aprontador mov cx,largop ;CX = largo del aprontador mov bx,salstd ;BX = handle de salida estándar mov ah,40h ;función de escritura del int 21h ;DOS 12-5

; Obtiene comando del usuario mov dx,offset BufEnt ;DS:DX buffer de entrada mov cx,largoe ;CX = máxima longitud a leer mov bx,entstd ;BX = handle de entrada estándar mov ah,3fh ;función de lectura int 21h ;del DOS mov si,offset BufEnt ;convierte las minúsculas mov cx,largoe ;recibidas a mayúsculas cmp [byte si], a ;verifica si entre a-z jb @@20 ;brinca si fuera de rango cmp [byte si] ;sigue verificando ja @@20 ;brinca si fuera de rango sub [byte si], a - A ;la hace mayúscula @@20: inc si ;a siguiente carácter recibido loop @@10 ENDP TraeCmndo PROC TraeSpec ;trae localidad de COMMAND.COM desde ambiente COMSPEC = CF = 1 si falla mov si,offset VarAmb ;DS:SI = cadena a igualar call TraeAmb ;busca en el bloque de ambiente jc @@20 ;brinca si no halló COMSPEC ; ES:DI después de = mov si,offset SpecCmndo ;DS:DI buffer local mov al,[es:di] ;copia variable COMSPEC mov [si],al ;al buffer local inc si inc di or al,al ; copió el nulo? (hace CF = 0) jnz @@10 @@20: ENDP TraeSpec PROC TraeAmb ;barre el ambiente, si halla CF = 0 mov es,[segamb] ;trae segmento del ambiente xor di,di ;inicializa el sesgo mov bx,si ;inicia apuntador al nombre cmp [byte es:di],0 ; fin de ambiente? jne @@20 ;brinca si no stc ;no halló, pone CF @@20: mov al,[bx] ;trae carácter de nombre or al,al ; fin del nombre? (hace CF = 0) 12-6

jz @@30 ;si, nombre concordó cmp al,[es:di] ;compara con ambiente jne @@40 ;brinca si diferente inc bx ;avanza apuntador de ambiente inc di ;y de nombre jmp @@20 @@30: ;si lo halló CF = 0 @@40: xor al,al ;sigue buscando en ambiente mov cx,-1 ;el byte igual a cero cld repne scasb jmp @@10 ENDP TraeAmb PROC EXEC ;llama a función EXEC de DOS mov [SegPila],ss ;salva apuntador de la pila mov [ApuntaPila] ;y su registro de segmento ; ahora corre COMMAND.COM mov dx,offset SpecCmndo ;DS:DX = nombre de archivo mov bx,offset Bloque ;ES:BX = bloque de parámetros mov ax,4b00h ;carga y ejecuta con función EXEC int 21h ;del DOS mov ax,@data ;hace el segmento de datos mov ds,ax ;otra vez direccionable mov es,ax cli ;por un piojo en los 8080 mov ss,[segpila] ;recobra dirección de la pila mov sp,[apuntapila] sti jnc @@10 ;brinca si todo bien mov dx,offset Aviso2 ;DS:DX a mensaje mov cx,largo2 ;CX = largo del mismo mov bx,errstd ;BX = handle de errores mov ah,40h ;función de escritura int 21h ;del DOS ENDP EXEC PROC BORRA ;comando interno de borrar pantalla mov dx,offset CadBorra ;envía cadena ANSI mov cx,largob ;para limpiar la pantalla mov bx,salatd mov ah,40h int 21h ENDP BORRA 12-7

PROC DOS ;ejecuta COMMAND.COM mov [word ParamCmndo],offset CadNula call EXEC ;y corre COMMAND.COM ENDP DOS PROC CONVI mov [word ParamConvi],di mov ax,[segamb] ;pone segmento de amb en bloque mov [BloqueC],ax ;de ambiente mov [SegPila],ss ;salva apuntador de la pila mov [ApuntaPila],sp ;y su registro de segmento ; ahora corre CONVI.EXE mov dx,offset ColaConvi ;DS:DX = nombre de archivo mov bx,offset BloqueC ;ES:BX = bloque de parámetros mov ax,4b00h ;carga y ejecuta con función EXEC int 21h ;del DOS mov ax,@data ;hace el segmento de datos mov ds,ax ;otra vez direccionable mov es,ax cli ;por un piojo en los 8080 mov ss,[segpila] ;recobra dirección de la pila mov sp,[apunpila] sti jnc @@10 ;brinca si todo bien mov dx,offset Aviso2 ;DS:DX a mensaje mov cx,largo2 ;CX = largo del mismo mov bx,errstd ;BX = andel de errores mov ah,40h ;función de escritura int 21h ENDP CONVI PROC EQUIPO mov [word ParamEquipo],di mov [word ParamEquipo+2],ds mov ax,[segamb] ;pone segmento de amb en bloque mov [BloqueCE],ax ;de ambiente mov [SegPila],ss ;salva apuntador de la pila mov [ApuntaPila],sp ;y su registro de segmento ; ahora corre EQUIPO.EXE.. mov dx,offset ColaEquipo ;DS:DX = nombre de archivo mov bx,offset BloqueCE ;ES:BX = bloque de parámetros mov ax,4b00h ;carga y ejecuta con función EXEC int 221h ;del DOS mov ax,@data ;hace el segmento de datos mov ds,ax ;otra vez direccionables 12-8

mov es,ax cli ;por un piojo en los 8080 mov ss,[segpila] ;recobra dirección de la pila mov sp,[apunpila] sti jnc @@10 ;brinca si todo bien mov dx,offset Aviso2 ;DS:DX a mensaje mov cx,largo2 ;CX = largo del mismo mov bx,errstd ;BX = handle de errores mov ah,40h ;función de escritura int 21h ;del DOS ENDP EQUIPO PROC RELOJ mov [word ParamReloj],di mov word ParamReloj+2],ds mov ax,[segamb] ;pone segmento de amb en bloque mov [BloqueCR],ax ;de ambiente mov [SegPila],ss ;salva apuntador de la pila mov [ApuntaPila],sp ;y su registro de segmento ; ahora corre RELOJ.COM.. mov dx,offset ColaReloj ;DS:DX = nombre de archivo mov bx,offset BloqueCR ;ES:BX = bloque de parámetros mov ax,4b00h ;carga y ejecuta con función EXEC int 21h ;del DOS mov ax,@data ;hace el segmento de datos mov ds,ax ;otra vez direccionable mov es,ax cli ;por un piojo en los 8080 mov ss,[segpila] ;recobra dirección de la pila mov sp,[apunpila] sti jnc @@10 ;brinca si todo bien mov dx,offset Aviso2 ;DS:DX a mensaje mov cx,largo2 ;CX = largo del mismo mov bx,errstd ;BX = handle de errores mov ah,40h ;función de escritura int 21h ENDP RELOJ PROC SALE ;comando interno (salir) mov ax,4c00h ;función de terminar int 21h ;del DOS ENDP SALE END ;fin de programa SHELL.ASM 12-9

3.2 Capturar el programa EQUIPO.ASM, ensamblarlo y crear el programa ejecutable EQUIPO.EXE %TITLE EXHIBE INFORMACIÓN DEL EQUIPO DE LA PC ; EQUs IDEAL DOSSEG MODEL small STACK 256 FDC EQU 0 ;fin de cadena rc EQU 13 ;ASCII de orno de carro nl EQU 10 ;ASCII de nueva línea ; teclear lo siguiente en UNA línea RECORD Equipo Impresoras:2,x:1,Juegos:1,Puertos:3,y:1,Drives:2,Modo:2,Ram:2,z:1,disco:1 ; Definir máscaras para aislar campos de bits ; ;AND MASK ; Campo mascimpresoras = MASK Impresoras mascjuego = MASK Juegos mascpuertos = MASK Puertos mascdrives = MASK Drives mascmodo = MASK Modo mascdisco = MASK Disco DATASEG ClaveFin db 0 Saludos db rc,nl, Determinación de equipo de la PC,rc,nl,nl,FDC cadimpresoras db Número de impresoras,fdc cadjuegos db Puerto de E/S para juegos...,fdc cadpuertos db Número de puertos RS-232.,FDC caddrives db Número de drives (menos 1),FDC cadmodo db Modo inicial de video.,fdc caddisco db Tiene disco duro (1 = si),fdc cadena db 40 dup (?) ;cadena de trabajo fecha db 28 dup (20h),0 hora db 10 dup (0) CODESEG 12-10

; De BINASC.OBJ y CADENAS.OBJ EXTRN BinAscDec:proc,SacaCadena:proc,NuevaLinea:proc ; De CRONOL.OBJ EXTRN TraeFecha:proc,Traedora:proc Inicia: mov ax,@data ;inicia segmento de datos mov ds,ax mov es,ax ;ES = DS mov di,offset fecha ;para exhibir fecha call TraeFecha call SacaCadena call NuevaLinea mov di,offset hora ;para exhibir hora call TraeHora call SacaCadena call NuevaLinea mov di,offset saludo ;apunta a bienvenida call SacaCadena ;y la exhibe int 11h ;función del BIOS para determinar mov bx,ax ;equipo. Salva en BX mov di,offset cadimpresoras ;apunta a cadena a exhibir mov dx,mascimpresoras ;trae máscara para el AND mov cl,impresoras ;trae conteo de corrimiento call SacaInfo mov di,offset cadjuegos ;apunta a cadena a exhibir mov dx,mascjuegos ;trae máscara para el AND mov cl,juegos ;trae conteo de corrimiento call SacaInfo ;despliega cadena e info mov di,offset cadpuertos ;apunta a cadena mov dx,mascpuertos ;trae máscara para el AND mov cl,puertos ;trae conteo de corrimiento call SacaInfo mov di,offset caddrives ;apunta a cadena a exhibir mov dx,mascdrives ;trae máscara para el AND mov cl,drives ;trae conteo de corrimiento call SacaInfo mov di,offset cadmodo ;apunta a cadena a exhibir mov dx,mascmodo ;trae máscara para el AND mov cl,modo ;trae conteo de corrimiento call SacaInfo mov di,offset caddisco ;apunta a cadena a exhibir mov dx,mascdisco ;trae máscara mov cl,disco ;trae conteo call SacaInfo mov ah,4ch ;función de DOS para acabar mov al,[clavefin] int 21h 12-11

;SacaInfo EXHIBE ETIQUETA Y VALOR DE EQUIPO ; ;Entrada: BX = datos de equipo de int 11h ; CL = conteo de corrimiento ; DX = máscara para AND ; DI = dirección de la cadena ;Salida: Cadena y número desplegados ;Registros: AX, CX PROC SacaInfo mov ax,bx ;asigna equipo a AX and ax,dx ;aísla bits de interés shr ax,cl ;los pone al comienzo call SacaCadena ;saca etiqueta mov di,offset cadena ;apunta a área de trabajo mov cx,1 ;pide por lo menos 1 bit call BinAscDec ;convierte a ASCII decimal call SacaCadena ;y lo exhibe call NuevaLinea ;otra línea ;regresa ENDP SacaInfo END Inicia ;fin del módulo EQUIPO.ASM 3.3 Ejecutar el programa C>SHELL (Se muestran dos corridas, la primer de las cuales empezó con BORRA) sh: EQUIPO Dom 2 de OCT de 1994 19:52:36 Determinación de equipo de la PC Número de impresoras 1 Puerto de E/S para juegos.. 0 Número de puertos RS-232 2 Número de Drives (menos 1) 1 Modo inicial de video 2 Tiene disco duro (1 = si). 1 sh: CONVI 4A3EH Binario.: 0100101000111110 Hexadecimal...: 4A3E Decimal sin signo.: 19006 Decimal con signo : 19006 Número a convertir? sh: DOS Microsoft MS-DOS Versión 6.20 Copyright Microsoft Corp 1981-1993 12-12

C:\SEM386>VER MS-DOS Versión 6.20 C:\SEM386>DATE Currente date is Sun 02/10/1994 Entern new date (dd-mm-yy) C:\SEM386>EXIT sh: DOS Microsoft MS-DOS Versión 6.20 Copyright Microsoft Corp 1981 1993 C:\SEM386>EXIT sh: SALE C:\SEM386> (Segunda corrida: se ejecutó: RELOJ y SALE) *RELOJ DIGITAL* Ensamblador 386 2 de octubre de 1994 2222 0000 0000 3333 8888 2 0 0 0 0 4 4 3 8 8 2 0 0 0 0 4 4 3 8 8 2 0 0 0 0 4 4 3 8 8 2 0 0 0 0 4 4 3 8 8 2222 4444 3333 8888 2 0 0 0 0 4 3 8 8 2 0 0 0 0 4 3 8 8 2 0 0 0 0 4 3 8 8 2 0 0 0 0 4 3 8 8 2222 0000 0000 3333 8888 sh: SALE C:\SEM386> 3.4 Este programa se puede se puede depurar con Turbo Debugger mediante el siguiente comando: C>TD SHELL.EXE 12-13

Ejecutar paso a paso las rutinas DOS, CONVI y EQUIPO de SHELL y estudiar cómo trabajan. 3.5 Poner los registros en 32 bits y visualizar las variables de ambiente. 3.6 Ejecutar SHELL.EXE desde SHELL mismo, es decir, tener dos copias del programa en ejecución. 4. TAREAS 4.1 Introducir al programa el procedimiento ayuda que se ejecute cuando el usuario pida un comando inexistente, que lo oriente en cuanto a los comandos que soporta y avisar que dé EXIT para regresar desde COMMAND.COM 4.2 Agregar el comando FANFA, que ejecute FANFA.EXE. 4.3 Agregar al programa la capacidad de recibir un comando con ayuda del ratón. 4.4 En el módulo EQUIPO.ASM añadir una rutina para reportar el tamaño de la memoria RAM. 12-14