ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Пример программы работы с командами двоичной арифметикиЗадание: (590-770) * 54 + 950 / (75+20)
Для удобства дальнейшего анализа работы программы составим таблицы соответствия данных их шестнадцатеричным значениям.
Data SEGMENT IsB DB 54,75,20 IsW DW 590,770,950 PromRezB DB 2 dup (0) PromRezW DW 5 dup (0) Data ENDS Code SEGMENT ASSUME DS:Data,CS:Code,SS:Stack1,ES:Data Start:; Настройка регистра DS на начало сегмента данных нашей программы mov AX,Data mov DS,AX ;Вычисление значения (590-770) mov AX,IsW; загрузка на регистр AX значения 590 sub AX,isW+2;вычитание из AX значения 770. ;Результат будет на AX mov PromRezW,AX; запись результата вычитания в область ;памяти для промежуточных результатов
; Вычисление значения (590-770)*54
;Умножение в данной ситуации должно быть знаковым ;(т.е. выполнять его будем командой IMUL), ;так как результат выполнения действия вычитания - отрицательное значение. ;Кроме того, мы должны учесть, что в данном умножении у нас;участвуют ;одно байтовое значение (54) и одно слово (-180), ;но так как команда умножения выполняет обработку данных ;только по схемам: ;AL * байт -> результат на AX или ;AX * слово -> результат на регистровой паре DX:AX, ;то мы должны байтовое значение (54) использовать как словесное, ;для этого 54 мы запишем на BL (младший байт регистра BX) ;а старший байт регистра BX - BH - обнулим при помощи команды xor. ;Значение результата вычитания у нас уже находиться на AX ;после последнего действия mov BL,IsB;загрузка на BL значения 54 xor BH,BH;обнуление старшего байта регистра BH imul BX;результат умножения будет на регистровой паре DX:AX ;сохранение в сегменте данных младшей части результата mov PromRezW+2,AX ;сохранение в сегменте данных старшей части результата mov PromRezW+4,DX
;Вычисление значения (75+20) mov BL,IsB+1;запись на BL исходного значения 75 add BL,IsB+2;суммирование его с исходным значением 20 mov PromRezB,BL;сохранение результата в сегменте ; данных
;Выполнение действия (950/(75+20)) ;Так как и делимое и делитель числа положительные, ;то для деления выбираем команду целочисленного без знакового деления DIV ;Деление на ассемблере выполняется по следующим схемам: ;AX/байт -> результат распределяется так: ;в AL - частное, в AH - остаток ;или DX:AX/слово -> результат распределяется так: ;в AX - частное, в DX - остаток. ;Так как в нашей ситуации длина делимого (950) слово, а делителя байт (95), ;то у нас будет первый вариант схемы выполнения деления ;Загружаем на AX делимое mov AX,IsW+4 ;делитель в данный момент у нас уже на регистре BL ;после выполнения действия сложения (вычисление значения знаменателя) ;Делим div BL ;Сохраняем частное в сегменте данных mov PromRezB,AL ;Остаток - равен нулю ;Вычисление результата = (590-770)*54 + 950/(75+20)
;Суммирование промежуточных результатов вычисления двух частей выражения ;Так как мы должны просуммировать значение двухсловное с байтовым, ;суммирование будем выполнять так: младшее слово с байтом, ;приведенным к длине слова mov CX,PromRezW+2;загрузка на CX первого слагаемого xor AH,AH;обнуление старшего байта AX ;(там сейчас находится остаток от деления) add CX,AX;суммируем, результат будет на CX mov PromRezW+6,CX ;переписываем старшую часть результата ;(она сейчас в ячейке памяти по адресу PromRez+4 ;и на регистре DX, так как после умножения мы этот регистр не использовали) mov PromRezW+8,DX
;Завершаем программу mov ah,4ch int 21h code SEGMENT stack1 segment 'stack' DB 80 dup (0) stack1 ends end start Содержание отчета Отчет по лабораторной работе должен содержать:
1) титульный лист; 2) тему и цель работы; 3) листинг программы; 4) таблицу, содержащую исходные данные, промежуточные значения и результат вычисления примера в десятичном и шестнадцатеричном форматах (для быстрой проверки); 5) дамп памяти после выполнения программы; 6) выводы по работе. Не нашли, что искали? Воспользуйтесь поиском:
|