Fusil SDG

Escriba un procedimiento KEY lejano y publico que provee datos asscii a una tabla CHARS DE 20 BYTES en el programa princ

Views 151 Downloads 4 File size 386KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Escriba un procedimiento KEY lejano y publico que provee datos asscii a una tabla CHARS DE 20 BYTES en el programa principal. En KEY se recibe un carácter por el puerto 00H cada vez que el bit 0 del puerto 01H es 1. Si no lo es, se espera que lo sea. Cuando lo es se recibe el carácter. Así hasta recibir los 20 caracteres para CHARS. Después de esto, se llama un procedimiento cercano TRACE (no escribirlo) que comprueba una clave de 20 caracteres en CHARS y que coloca un lógico 1 en el bit 1 de un byte B del programa principal cuando la clave es correcta (la tabla CLAVE en KEY tiene la clave a comprobar. Se puede dejar indefinida). Si la clave no es correcta, TRACE coloca un lógico 0 en el bit 1 de B. Al retorno de TRACE, si la clave es correcta se envía un lógico 1 al bit 1 del puerto 01H y se muestra en pantalla el mensaje ACCESO antes de retornar. Si la clave no es correcta se procede a retornar. EXTRN CHARS:BYTE EXTRN B:BYTE DSEG SEGMENT 'DATA' CLAVE db ? MSG dw "ACCESO $" DSEG ENDS PUBLIC KEY CSEG SEGMENT 'CODE' ASSUME CS:CSEG DS:DSEG KEY PROC FAR MOV AX, DSEG MOV DS, AX MOV CX, 20 MOV SI, 0 COMPROBAR: IN AL, 01H TEST AL, 1 JZ COMPROBAR IN AL, 00H MOV CHARS[SI], AL INC SI LOOP COMPROBAR CALL TRACE TEST B, 10b JZ RETORNAR MOV AL, 10b OUT 01h, AL MOV DX, OFFSET MSG MOV AH, 09h INT 21h RETORNAR: RET KEY ENDP CSEG ENDS END

Escriba un procedimiento lejano CCODE con una tabla CODE de 256 bytes la cual recibe en c/u de los 256 bytes un código binario

desde otro procedimiento lejano CCODIGOS (no escribirlo). CCODE tiene una localidad INDICE, de un byte, en la cual el programa principal antes de llamar a CCODE pone un valor entre 0 y 225 (este es un índice para los bytes en la tabla CODE). CCODE obtiene el código binario apuntado por el índice dejándolo en el byte CODIGO de CCODE. Seguidamente, envía los 256 codigos en la tabla CODE a un periférico de salida con dirección 2AB H. Considere que el periférico está siempre listo para recibir datos. DSEG SEGMENT ‘DATA’ PUBLIC CODE PUBLIC INDICE CODE DB 256 DU (¿) INDICE DB ¿ CODIGO DB ¿ DSEG ENDS CSEG SEGMENT ‘CODE’ ASSUME CS:CSEG, DS:DSEG EXTRN CCODIGOS:FAR PUBLIC CCODE CCODE PROC FAR MOV AX, DSEG MOV DS, AX CALL CCODIGOS XOR AX, AX MOV BX, OFFSET CODE MOV AL, INDICE XLAT B MOV CODIGO, AL MOV SI , OFFSET CODE CLD MOV CX, 256 MOV DX, 2AB H REP OUTS B RET CCODE ENDP CSEG ENDS END

Escriba un procedimiento cercano que muestra en pantalla el mensaje ‘Datos totalmente diferentes’ si las 50 palabras en una tabla DATOS1 son completamente diferentes a los 50 datos de palabras en una tabla DATOS2, y se retorna. Si los datos son completamente iguales, el mensaje que se muestra es ‘Datos completamente iguales’ y se retorna. Si los datos no son completamente iguales, el mensaje es ‘Datos diferentes’ y también se retorna. Los segmentos DS y ES en el programa principal son coincidentes. No usar lazos. DATOS1 DW 50 DUP(¿) DATOS2 DW 50 DUP(¿)

MSG0 DB “Datos totalmente diferentes”, ‘$’ MSG1 DB “Datos totalmente iguales”, ‘$’ MSG2 DB “Datos diferentes”, ‘$’ ; ES = DS COMPROBAR PROC NEAR MOV SI, OFFSET DATOS1 MOV DI, OFFSET DATOS2 MOV CX, 50 CLD REPNE CMPSW JNZ DIFERENTES;CX=0 Z=0 MOV CX, 50 MOV SI, OFFSET DATOS1 MOV DI, OFFSET DATOS2 CLD REPE CMPSW JZ IGUALES; CX=0 Z=1 MOV DX, OFFSET MSG2 MOV AH, 09H INT 21H RET DIFERENTES: MOV DX, OFFSET MSG0 MOV AH, 09H INT 21H RET IGUALES: MOV DX, OFFSET MSG1 MOV AH, 09H INT 21H RET COMPROBAR ENDP

Escriba las instrucciones para dividir un # binarios sin signo de 16 bits que está en la localidad NUM, entre un valor de 16 bits sin signo en la localidad valor. El cociente se guarda en código ascii en la localidad COCI y el residuo, también en ascii, en la localidad RES. Considerar que el residuo y cociente son 0 (JA) ir a restar RESTA -C las veces necesarias hasta que el resultado sea cero (JE) entonces incrementar COCI y retornar (el coc en COCI y el residuo ni en RESTA ni en C), o >0 entonces incrementar COCI y continuar con la resta RESTA-C hasta que se cumpla una de las condiciones anteriores. Para la resta RESTA-C poner en AL cada byte de RESTA con direcc relativo a SI. Cada byte de C accesarlo con el mismo valor relativo de SI. La resta de cada byte queda en AL que debe guardarse en la misma posición relativa de RESTA. Usar un LOOP para la primera resta B-C. Si se requieren restas RESTAC ejecutar otro loop para cada una de ellas las veces necesarias hasta que el resultado sea igual a cero, o negativo. El código ejecutable inicia llamando a DATOS para llenar las tablas B y C. DSEG SEGMENT 'DATA' PUBLIC B PUBLIC C PUBLIC RESTA PUBLIC COCI B db 256 dup (?) C db 256 dup (?) RESTA db 256 dup (?) COCI db 00h DSEG ENDS CSEG SEGMENT 'CODE' ASSUME DS:DSEG, CS:CSEG PUBLIC DIVIDIR EXTRN DATOS:FAR DIVIDIR PROC FAR MOV AX,DSEG MOV DS, DSEG CALL DATOS MOV SI,0 MOV BX, OFFSET B MOV CX,256 CLC ;Limpiar carry

bmenosc: MOV AL,[BX] SBB AL,C[SI] MOV RESTA[SI],AL INC BX INC SI loop bmenosc JB MENOR; cociente = COCI, residuo =c y retornar JE IGUAL; inc coci y retornar JA MAYOR; MENOR: RET IGUAL: INC COCI RET MAYOR: MOV CX,256 MOV SI,0 CLC RESTAC: MOV AL,RESTA[SI] SBB AL, C[SI] MOV RESTA[SI],AL loop RESTAC JE IGUAL JB MENOR INC COCI JMP MAYOR DIVIDIR ENDP CSEG ENDS END

Escriba un procedimiento cercano CONVOUT, con instrucciones 8086, que convierte un # binario en AL en otro código binario de 8 bits que se encuentra en la tabla CODE de 256 bytes en el segmento extra de datos- Cada # binario en AL se obtiene de un puerto de entrada 0AH (sin retardo para lectura). Se obtienen 256#s haciéndose la conversión de código de cada uno de ellos que se guarda consecutivamente en la tabla DATOS con direccionam relativo a SI. Al completarse esta tabla, se envían los 256 bytes en ella, desde el primero, al puerto de salida de 8 bits 0BH con la instrucción OUTS. DSEGE SEGMENT 'DATA' CODE DB 256 DUP (?) DSEGE ENDS DSEG SEGMENT 'DATA' DATOS DB 256 DUP (?) DSEG ENDS CSEG SEGMENT 'CODE' ASSUME DS:DSEG, ES:DSEGE, CS:CSEG CONVOUT PROC NEAR MOV AX, DSEG MOV DS, AX MOV AX, DSEGE MOV ES, AX XOR AX,AX MOV CX, 256 MOV BX, OFFSET CODE MOV SI, 0 CONVERTIR:

IN AL, 0AH XLATB MOV DATOS[SI], AL INC SI LOOP CONVERTIR MOV SI, 0 MOV CX, 256 ENVIAR: MOV DX, 0BH OUTS DX, DATOS[SI] INC SI LOOP ENVIAR RET CONVOUT ENDP CSEG ENDS

Escriba un grupo de instrucciones para buscar en una tabla MENS con 200 caracteres ascii, en el segmento es, el código para el carácter espacio (20h) y para contar el numero de veces que este puede aparecer en la tabla. La cuenta queda en la variable CNTA inicialmente en cero, en el segmento DS. Use la instrucción de string debida con el prefijo apropiado y la instrucción JCXZ inmediatamente después. Cuando CX = 0 saltar a SEGUIR después del grupo de instrucciones. org 100h MOV AX, DS MOV ES, AX MOV DI, OFFSET MENS MOV CX, 200 MOV AX, 0020h CLD Buscar: REPNE SCASB JCXZ SEGUIR INC CNTA jmp Buscar SEGUIR: JNE Retornar INC CNTA Retornar: RET ;Tabla MENS contendra 200 ASCII MENS db 200 dup (?) CNTA db 00h END

Escriba como un procedimiento cercano las instrucciones para contar con las instrucciones ROR y RCR y un loop el # de unos que hay en la doble palabra cuya palabra menos significante inicia en la variable DPAL en el segmento ds. La cuenta de unos que en el byte UNOS. El contenido en DPAL no se debe modificar, para ello usar el reg AX para la palabra menos sig y BX para la palabra mas sig junto con las instrucciones de rotación especificadas. Cuando el bit c = 1

incrementar la cuenta y continuar la rotación. No use SI ni DI como punteros. org 100h ;USAR BX para MSW DPAL[2] ;Usar AX para LSW DPAL[0] ;Cuando c = 1 inc UNOS y continuar ;No usar SI ni DI como punteros ;ROR y RCR, 1 loop MOV AX, DPAL[0] MOV BX, DPAL[2] MOV CX,32 CONTAR: ROR BX,1 RCR AX,1 JNC continuar INC UNOS continuar: LOOP CONTAR RET DPAL dw 02FAFh,0F10Fh UNOS db 0 END 1A

1A

1B

1C 1B

1A

2.1

1B

2.1

2.2