Лаба 10. Лабораторная работа 10 Табличные функции. Прерывания. Студент Одинцов В. В. Группа эм17 Преподаватель Льготчиков В. В. Смоленск 2019
Скачать 43.6 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФИЛИАЛ федерального государственного бюджетного образовательного учреждения высшего образования «Национальный исследовательский университет «МЭИ» в г. Смоленске Кафедра ЭМС Лабораторная работа №10 Табличные функции. Прерывания. Студент: Одинцов В.В. Группа: ЭМ-17 Преподаватель: Льготчиков В.В. Смоленск 2019 Цель работы: приобретение навыков использования при программировании процедур, аппарата прерываний, приемов вычисления иррациональных и других функций. Задание: Составить на языке Ассемблер программу расчета величины С в соответствии с уравнением: , где А, В, n – переменные; - трансцендентная функция. Отладить и выполнить программу. Оформить отчет Вариант №1 B = [3…8] A = [0…900] 2 Алгоритм работы программы: Для вычисления логарифмической функции в памяти были созданы 2 таблицы: таблица аргументов и таблица значений функции. Определяя положение N аргумента наиболее близкого к заданному, мы ставили в соответствие ему определенное значение функции, расположенное в позиции N таблицы значений. В основу реализации извлечение квадратного корня было положено следующее интересное свойство: Целая часть квадратного корня из числа равна количеству элементов в последовательности нечетных чисел, которые можно вычесть из этого числа. Листинг программы: Turbo Assembler Version 2.5 14/11/18 23:25:02 Page 1 Lab8.asm LABA10 1 TITLE LABA10; 2 3 4 0000 SSEG SEGMENT PARA STACK 'STACK'; Резервирование памяти под стек; 5 0000 40*(53 54 41 43 4B + DB 64 DUP('STACK '); 6 20) 7 0180 SSEG ENDS; 8 0000 DSEG SEGMENT PARA PUBLIC 'DATA'; Резервирование памяти под данные; 9 10 11 0000 07D0 084C 08D0 095D + ARGUM DW 2000,2124,2256,2397,2546,2704,2872; Задаем таблицу аргументов 12 09F2 0A90 0B38 13 000E 0BEA 0CA8 0D71 0E47 + DW 3050,3240,3441,3655,3883 14 0F2B 15 0018 101C 111C 122C 134E DW 4124,4380,4652,4942 16 0020 1481 15C7 1722 DW 5249,5575,5922 17 0026 1892 1A19 DW 6290,6681 18 002A 1BB8 1D71 DW 7096,7537 19 002E 1F46 2137 DW 8006,8503 20 0032 2348 2579 DW 9032,9593 21 22 0036 03E8 043F 0496 04ED + FUN DW 1000,1087,1174,1261,1348,1435,1522; Задаем таблицу значений логарифма 23 0544 059B 05F2 24 0044 0649 06A0 06F7 074E + DW 1609,1696,1783,1870,1957 25 07A5 26 004E 07FC 0853 08AA 0901 DW 2044,2131,2218,2305 27 0056 0958 09AF 0A06 DW 2392,2479,2566 28 005C 0A5D 0AB4 DW 2653,2740 29 0060 0B0B 0B62 DW 2827,2914 30 0064 0BB9 0C10 DW 3001,3088 31 0068 0C67 0CBE DW 3175,3262 32 33 ; 34 006C 45 52 52 4F 52 3A 20+ ER1 DB 'ERROR: A>900 ! ', '$' 35 41 3E 39 30 30 20 21+ 36 20 24 37 007C 45 52 52 4F 52 3A 42+ ER2 DB 'ERROR:B<>[3,8]!', '$' 38 3C 3E 5B 33 2C 38 5D+ 39 21 24 40 008C 012C A DW 300; А<=900 41 008E 122A B DW 4650; Аргумент логарифма, умноженный на 1000 (4650->4.56) [3..8] + 42 (3000...8000) 43 0090 00 @SQRT DB 0; Квадратный корень из А 44 0091 0000 FUNC DW 0; Логарифм В по основ. 2 45 0093 00 REZ_C DB 0; Целая часть результата 46 0094 0000 REZ_D DW 0; Дробная часть результата 47 ; 48 49 50 0096 DSEG ENDS; 51 0000 CSEG SEGMENT PARA PUBLIC 'CODE'; Определяем кодовый сегмент; 52 0000 MYPG PROC FAR; 53 ASSUME CS:CSEG, DS:DSEG,SS:SSEG; 54 55 0000 1E PUSH DS; Сохраняем в стеке DS; 56 0001 B8 0000 MOV AX,0; 57 0004 50 PUSH AX; Помещаем в стек аккумулятор; Turbo Assembler Version 2.5 14/11/18 23:25:02 Page 2 Lab8.asm LABA10 58 0005 B8 0000s MOV AX,DSEG; Инициализация адреса сегмента данных; 59 0008 8E D8 MOV DS,AX; 60 000A B8 0000s MOV AX,SSEG; Инициализация стека; 61 000D 8E D0 MOV SS,AX; 62 63 000F 81 3E 008Cr 0384 CMP A, 900; если А<=900, 64 0015 76 0D JBE @1; прейти к @1, иначе вывести сообщ. об ошибке 65 0017 BA 006Cr LEA DX, ER1; вывод сообщения ER1 66 001A B4 09 MOV AH, 9; на экран с помощью прерывания 67 001C CD 21 INT 21H; 68 001E B2 07 MOV DL, 7; 69 0020 B4 02 MOV AH, 2; 70 0022 CD 21 INT 21H; 71 0024 81 3E 008Er 0BB8 @1: CMP B, 3000; Если В<3000, то 72 002A 72 08 JB @ER2; Вывести сообщение об ошибке 73 002C 81 3E 008Er 1F40 CMP B, 8000; если В<=8000, то 74 0032 76 10 JBE @2; Перейти к @2 75 0034 BA 007Cr @ER2: LEA DX, ER2; иначе сообщение об ошибке 76 0037 B4 09 MOV AH, 9; 77 0039 CD 21 INT 21H; 78 003B B2 07 MOV DL, 7; 79 003D B4 02 MOV AH, 2; 80 003F CD 21 INT 21H; 81 0041 EB 1D 90 JMP @FIN; 82 0044 E8 001C @2: CALL SQRTA; Вызов процедуры SQRTA 83 0047 one: 84 0047 E8 0034 CALL FUN_LOG; Вызов процедуры FUN_LOG 85 004A two: 86 004A A0 0090r MOV AL, @SQRT; Помещаем в Al значение квадратного корня @SQRT 87 004D 98 CBW ;al->ax; 88 004E 8B 1E 0091r MOV BX,FUNC; Помещаем в BX значение логарифма FUNC 89 0052 F7 E3 MUL BX ; Перемножаем полученные значения 90 0054 BB 03E8 mov bx,1000; 91 0057 F7 F3 DIV bx; Находим остаток 92 0059 A2 0093r MOV REZ_C, AL; Записываем в память целую часть 93 005C 89 16 0094r MOV REZ_D, DX; Записываем в память остаток 94 0060 EB 45 90 @FIN: JMP THREE; 95 96 0063 MYPG ENDP; 97 98 0063 SQRTA proc 99 0063 B3 00 MOV BL, 0; 100 0065 BE FFFF MOV SI, -1; 101 0068 A1 008Cr MOV AX, A; 102 006B FE C3 BEG: INC BL ; 103 006D 83 C6 02 ADD SI, 2; 104 0070 2B C6 SUB AX, SI; 105 0072 79 F7 JNS BEG;; 106 0074 74 02 JZ @END; 107 0076 FE CB DEC BL; 108 0078 88 1E 0090r @END: MOV @SQRT, BL; 109 007C EB C9 JMP ONE; 110 111 007E SQRTA ENDP 112 113 007E FUN_LOG proc 114 007E BF 0000 MOV DI, 0; Turbo Assembler Version 2.5 14/11/18 23:25:02 Page 3 Lab8.asm LABA10 115 0081 A1 008Er MOV AX, B; Помещаем в АХ значение B 116 0084 83 C7 02 OPR_A: ADD DI, 2; 117 0087 8B 8D 0000r MOV CX, ARGUM[DI]; Помещаем в CX значение ARGUM[DI] 118 008B 3B C8 CMP CX, AX; если CX 119 008D 78 F5 JS OPR_A; перейти к OPR_A 120 008F 2B C8 SUB CX,AX; иначе вычитаем АХ из СХ 121 0091 8B D0 MOV DX, AX; 122 0093 2B 95 FFFEr SUB DX, ARGUM[DI-2]; 123 0097 3B CA CMP CX, DX; Если CX 124 0099 78 03 JS NEXT; перейти к NEXT, 125 009B 83 EF 02 SUB DI, 2; иначе DI <- DI - 2 126 009E 8B 85 0036r NEXT: MOV AX, FUN[DI]; Помещаем в АX значение FUN[DI] 127 00A2 A3 0091r MOV FUNC, AX; Присваиваем FUNC значение AX 128 00A5 EB A3 JMP TWO; 129 00A7 FUN_LOG ENDP 130 00A7 THREE: 131 00A7 C3 RET; 132 00A8 CSEG ENDS; 133 END MYPG; Turbo Assembler Version 2.5 14/11/18 23:25:02 Page 4 Symbol Table LABA10 Symbol Name Type Value ??DATE Text "14/11/18" ??FILENAME Text "Lab8 " ??TIME Text "23:25:02" ??VERSION Number 0205 @1 Near CSEG:0024 @2 Near CSEG:0044 @CPU Text 0101H @CURSEG Text CSEG @END Near CSEG:0078 @ER2 Near CSEG:0034 @FILENAME Text LAB8 @FIN Near CSEG:0060 @SQRT Byte DSEG:0090 @WORDSIZE Text 2 A Word DSEG:008C ARGUM Word DSEG:0000 B Word DSEG:008E BEG Near CSEG:006B ER1 Byte DSEG:006C ER2 Byte DSEG:007C FUN Word DSEG:0036 FUNC Word DSEG:0091 FUN_LOG Near CSEG:007E MYPG Far CSEG:0000 NEXT Near CSEG:009E ONE Near CSEG:0047 OPR_A Near CSEG:0084 REZ_C Byte DSEG:0093 REZ_D Word DSEG:0094 SQRTA Near CSEG:0063 THREE Near CSEG:00A7 TWO Near CSEG:004A Groups & Segments Bit Size Align Combine Class CSEG 16 00A8 Para Public CODE DSEG 16 0096 Para Public DATA SSEG 16 0180 Para Stack STACK Результат работы программы: 4F21:0088 39 5D 21 24 2C 01 2A 12 5690:01A8 11 AA 08 25 C2 02 00 00 А = 300 (12Сh) B = 4650 (122Ah) – 4.650 SQRT(A) = 17 (11h) LOG2(B) = 2218 (8AAh) – 2.218 REZ_C = 37 (25h) REZ_D = 706 (2C2h) ПРОВЕРКА: |