Главная » Просмотр файлов » assembler. Учебник для вузов_Юров В.И_2003 -637с

assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 43

Файл №862834 assembler. Учебник для вузов_Юров В.И_2003 -637с (Юров В.И - Assembler. Учебник для вузов. 2003) 43 страницаassembler. Учебник для вузов_Юров В.И_2003 -637с (862834) страница 432021-12-22СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 43)

При этом команду SUB есть смысл использовать только один разпри вычитании самых младших цифр операндов, далее должна применяться команда SB В, которая будет учитывать возможный заем из старшего разряда. В листинге 8.9 мы обходимся одной командой SB В, которая в цикле производит поразрядное вычитание двух BCD-чисел.Листинг 8.9. Вычитание неупакованных BCD-чисел<1> ;prg_8_9.asm<2> masm<3><4><5><6><7><8><9>modelsmallstack256.data;сегмент данныхbdb 1,7;неупакованное число 71с db 4,5;неупакованное число 54subs db 2 dup (0).codemain:;точка входа в программуmov ax,@data;связываем регистр dx с сегментомmov ds.ax;данных через регистр ахxor ax,ax;очищаем ахlen equразрядность чисел<15>xor bx.bxmov ex, len<16>;загрузка в сх счетчика цикла<17>ml:mov al,b[bx]<18><19>sbb al,c[bx]<20>aasmov subs[bx] al<21><22>inc bx<23>loopml;анализ флага заема<24>jc m2<25>jmp exitm2: ; .

. .<26><27>exi t :стандартный выход<28>mov ax,4c00h<29>int 21h<30>end main;конец программыДанная программа не требует особых пояснений в случае, когда уменьшаемоебольше вычитаемого. Поэтому обратите внимание на строку 24. С ее помощью мыпредусматриваем случай, когда после вычитания старших цифр чисел был зафиксирован факт заема.

Это говорит о том, что вычитаемое было больше уменьшаемого, в результате чего разность оказалась неправильной. Эту ситуацию нужно както обработать. С этой целью в строке 24 командой JC анализируется флаг CF. Порезультату этого анализа мы уходим на ветку программы, обозначенную меткойт2, где и выполняются нужные действия. Набор этих действий зависит от конкретного алгоритма обработки, поэтому поясним только их суть.

Для этого посмотрите в отладчике, как наша программа выполняет вычитание 50 - 74 (правильныйответ24). То, что вы увидите в окне Dump отладчика (в поле, соответствующемадресу subs), окажется далеким от истины. Что делает в этом случае человек? Онпросто мысленно меняет местами вычитаемое и уменьшаемое (74 - 50 = 24), а ре-188Глава 8. Арифметические командызультат рассматривает со знаком «минус». Так и фрагмент программы, обозначенный меткой т2, может, поменяв уменьшаемое и вычитаемое местами и выполниввычитание, где-то отметить тот факт, что разность, на самом деле, нужно рассматривать как отрицательное число.УмножениеНа примере сложения и вычитания неупакованных чисел мы выяснили, что стандартных алгоритмов для выполнения этих действий над BCD-числами нет и программист должен сам, исходя из требований к своей программе, реализовать этиоперации.

Реализация двух оставшихся операций — умножения и деления — ещесложнее. В системе команд процессора присутствуют только средства для умножения и деления одноразрядных неупакованных BCD-чисел. Для их умножениянеобходимо воспроизвести описанную далее процедуру.1. Поместить один из сомножителей в регистр AL (как того требует команда MUL).2. Поместить второй сомножитель в регистр или память, отведя для него байт.3.

Перемножить сомножители командой MUL (результат, как и положено, окажется в регистре АХ).4. Скорректировать результат, который, конечно, будет представлен в двоичномкоде.Для коррекции результата после умножения в целях представления его в символьном виде применяется специальная команда ДАМ (ASCII Adjust for Multiplication).

Она не имеет операндов и работает с регистром АХ следующим образом.1. Делит AL на 10.2. Результат деления записывается так: частное — в AL, остаток — в АН.В результате после выполнения команды ДАМ в регистрах AL и АН находятсяправильные двоично-десятичные цифры произведения двух цифр.В листинге 8.10 приведен пример умножения BCD-числа произвольной размерности на однозначное BCD-число.Листинг 8.10. Умножение неупакованных BCD-чисел<1><2><3><4><5><6><7><8>masmmodelsmall256stack.databdb 6,7с db 4proizv db 4 dup (0).code<9> main:<18>mov ax,@datamov ds.axxor ax,axlen equ 2xor bx.bxxor si,sixor di,dimov cx.lenml:mov a l , b [ s i ];неупакованное число 76;неупакованное число 4;точка входа в программу;размерность сомножителя 1;в сх длина наибольшего сомножителя 1Арифметические операции над двоично-десятичными числами1 89<20>mul саат; коррекция умноженияadc al.dl;учли предыдущий переносааа^корректировали результат сложения с переносомmov dl ,ah;запомнили переносmov proizv[bx] ,alinc siinc bxloop ml;цикл на метку mlmov proizv[bx] ,dT;учли последний перенос<30>exi t :<31>mov ax,4c00h<32>int 21h<33>end mainДанную программу можно легко модифицировать для умножения BCD-чиселпроизвольной длины.

Для этого достаточно представить алгоритм умноженияв «столбик». Листинг 8.10 можно использовать для получения частичных произведений в этом алгоритме. После их сложения со сдвигом получится искомый результат. Попробуйте написать эту программу самостоятельно. Если же данная задача окажется для вас непосильной, ее решение вы можете найти в [8].Перед окончанием обсуждения команды ДАМ необходимо отметить, что ее можноприменять для преобразования двоичного числа в регистре AL в неупакованноеBCD-число, которое окажется в регистре АХ: старшая цифра результата — в АН,младшая — в AL.

Понятно, что двоичное число должно быть в диапазоне 0...99.<21><22><23><24><25><26><27><28><29>ДелениеПроцесс деления двух неупакованных BCD-чисел несколько отличается от других рассмотренных ранее операций с ними. Здесь также требуются действия покоррекции, но они должны выполняться до основной операции, выполняющейнепосредственно деление одного BCD-числа на другое BCD-число.

Предварительно в регистре АХ нужно получить две неупакованные BCD-цифры делимого. Этоделает программист удобным для него способом. Далее для коррекции результатаделения в целях представления его в символьном виде нужно выполнить командуA A D (ASCII Adjust for Division).Команда AAD не имеет операндов и преобразует двузначное неупакованное BCDчисло в регистре АХ в двоичное число, которое впоследствии будет играть рольделимого в операции деления.

Кроме преобразования, команда A A D помещает полученное двоичное число в регистр AL. Делимое, естественно, является двоичнымчислом из диапазона 0...99. Алгоритм, по которому команда A A D осуществляет этопреобразование, выглядит следующим образом.1. Умножить на 10 старшую цифру исходного BCD-числа в АХ (содержимое АН).2. Выполнить сложение АН + AL, результат которого (двоичное число) занести в AL.3. Обнулить содержимое АН.Далее программисту нужно выполнить обычную команду деления DIV для деления содержимого АХ на одну BCD-цифру, находящуюся в байтовом регистре илибайтовой ячейке памяти.

Деление неупакованных BCD-чисел иллюстрирует листинг 8.11.1 90Глава 8. Арифметические командыЛистинг 8.1 1 . Деление неупакованных BCD-чисел<1> ;prg_8_ll.asm<2> . . .<3> .data<4> b db<5> сdb1,74;сегмент данных;неупакованное BCD-число 71<б> .code;сегмент кода<7> m a i n :;точка входа в программу<8> ...<9>mov al,b<10>aad; коррекция перед делением<11>div с;в al BCD — частное, в ah BCD - остаток<13>exit:Аналогично ДАМ, команде A A D можно найти и другое применение — использовать ее для перевода неупакованных BCD-чисел из диапазона 0...99 в их двоичныйэквивалент.Для деления чисел большей разрядности так же, как и в случае умножения,нужно реализовывать, например, алгоритм деления в «столбик» или найти болееоптимальный путь.

Любопытный и настойчивый читатель, возможно, самостоятельно разработает эти программы. Но это делать совсем необязательно. Средифайлов, прилагаемых к книге, в каталоге данной главы приведены тексты макрокоманд, которые выполняют четыре основных арифметических действия с BCDчислами любой разрядности. Кроме этого в [8] вы найдете дополнительный материал по этому вопросу.Упакованные BCD-числаКак уже отмечалось ранее, упакованные BCD-числа можно только складывать и вычитать. Для выполнения других действий над ними их нужно дополнительно преобразовывать либо в неупакованный формат, либо в двоичное представление. Таким образом, сами по себе упакованные BCD-числа представляют не слишкомбольшой интерес для программиста, поэтому мы их рассмотрим кратко.СложениеВначале разберемся с сутью проблемы и попытаемся сложить два двузначных упакованных BCD-числа:67 =01100111+75 =01110101142=11011100 = 220Как видим, в двоичном виде результат равен 1 101 1 100 (или 220 в десятичномпредставлении), что неверно.

Это происходит по той причине, что процессор неподозревает о существовании BCD-чисел и складывает их по правилам сложениядвоичных чисел. На самом деле результат в двоично-десятичном виде должен бытьравен 0001 0100 0010 (или 142 в десятичном представлении). Этот пример иллюстрирует необходимость корректировки результатов арифметических операцийс упакованными BCD-числами, так же как это было в случае неупакованных BCD-Арифметические операции над двоичнв-десятичными числами191чисел. Для корректировки результата сложения упакованных чисел в целях представления его в десятичном виде процессор предоставляет команду DAA (DecimalAdjust for Addition).Команда DAA преобразует содержимое регистра AL в две упакованные десятичные цифры (по алгоритму, приведенному в приложении А, где данная командаописана более подробно).

Получившаяся в результате сложения единица (еслирезультат сложения больше 99) запоминается во флаге CF, тем самым учитываетсяперенос в старший разряд.Проиллюстрируем сказанное на примере сложения двух двузначных BCD-чисел в упакованном формате (листинг 8.12).Листинг 8.12. Сложение упакованных BCD-чисел<1> ;prg_8_12.asm<2> ...<3> .data;сегмент данных<4> bdb 17h;упакованное число 17<5> сdb 45h;упакованное число 45<6> sum db 2 dup (0)<7> .code;сегмент кода<8> main:;точка входа в программу<9> ...<10>mov al ,b<11>add al,c<12>daa<13>jnc $+6;переход через команду, если результат <= 99<14>mov sum+l,ah;учет переноса при сложении (результат > 99)<15>mov sum.al;младшие упакованные цифры результата<16>exit:В приведенном примере все достаточно прозрачно; единственное, на что следует обратить внимание, — это описание упакованных BCD-чисел и порядок формирования результата.

Характеристики

Тип файла
PDF-файл
Размер
14,34 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6549
Авторов
на СтудИзбе
299
Средний доход
с одного платного файла
Обучение Подробнее