9_Дополнительные воможности ассемблера (975806), страница 7
Текст из файла (страница 7)
Так, хорошо изучив рекомендованный Вам учебник по языку Ассемблера, постарайтесьпонять, что type Z.Year=2 , type (Z+Year)=35 , а type Z+Year=68 . Другим отличием(для нашего примера, впрочем, несущественным), является различный приоритет операций Ас-20семблере '.' и '+'. Операция '.' имеет более высокий приоритет, чем операция '+', что можетоказаться полезным для записи некоторых выражений без использования круглых скобок. Приоритеты всех операций языка Ассемблер и правила вычисления типов Вам необходимо обязательно выучить по учебнику [5].В качестве ещё одного примера напишем на Ассемблере функцию со стандартным соглашениемо связях, которая получает в качестве параметров массив KURS структур с данными о студентах,длину этого массива N и беззнаковое целочисленное значение Y.
Функция будет вырабатывать в качестве своего значения количество студентов, родившихся в году Y. Соответствующие данные в Ассемблере можно, например, описать так (предполагаем, что структура Stud уже описана):NequKURS StudYdw500N dup (<>)?Тогда вызов нашей процедуры (дадим ей, не долго думая, имя P) будет производиться, например, командами:movpushmovpushpushcallax,offset KURSaxax,NaxYPНиже приведён возможный текст этой процедурыPprocpushmovpushpushpushmovmovmovxorjcxzL:cmpjneincL1:addloopVozv: poppoppoppopretPendpnearbpbp,spbxdxcxdx,[bp+4]; Год Ycx,[bp+6]; Длина массива Nbx,[bp+8]; Начало массиваax,ax; Число студентов с годом рождения YVozv; Всех студентов уже отчислили? ☺[bx].Year,dxL1axbx,type Stud; На след.
студента в массиве XLcxdxbxbp6Из этого примера видно, что значением одноместного оператора type, применённого к именитипа структуры (как, впрочем, и к имени самой переменной этого типа) является длина структуры вбайтах. Для нашего примера type Stud = type KURS = type St1 = 25. Здесь следует подчеркнуть, что наша функция, конечно, не знает, что переданный ей массив программист назвал именем KURS. В то же время для правильной работы функция обязана знать имя типа Stud, которыйимеют элементы массива, а также должна знать имена всех полей структуры, с которыми она работает. Стоит отметить, что это же будет справедливо и для аналогичной функции, написанной на Паскале.На этом мы завершим знакомство с дополнительными возможностями языка Ассемблер, болееподробно эту тему необходимо изучить по учебнику [5].21Вопросы и упражнения1.2.3.4.5.6.7.8.9.Что такое флаг направления?Напишите фрагмент программы на Ассемблере, который выводит на печать (по макрокомандеoutword) текущее значение флага направления (знать номер этого флага в регистре флаговдля этого не нужно).Почему необходимо уметь копировать массивы как в прямом, так и в обратном направлении?Определите, какие значения должен иметь флаг направления DF при операции вставки и приоперации удаления участка редактируемого текста в некотором текстовом редакторе, которыйиспользует для этих целей строковые команды.Что является операндами логических команд?Когда можно, а когда нельзя использовать команды сдвига для умножения и деления целыхчисел на степень двойки?В каком случае следует использовать в программе упакованные структуры данных?Как выполняется операция языка Ассемблера "точка".Для описания упакованного массива данныхNData; varAXequ10000segmentA: packed array[1..N] of 0..15;dbN/2 dup (?); N/2 ≡ N div 2db?Реализуйте оператор присваивания A[i]:=X..