ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Программирование на ассемблере х86.
Задание: На ассемблере процессоров x86 написать две программы: 1) программу вычисления выражения 2) программу вычисления произведения левых разностей элементов одномерного массива , замены четных элементов массива на полученное произведение и подсчета произведенных замен. Текст программы 1:
title Prim assume cs:C, ds:D, ss:S
;описываем сегмент стека S segment stack dw 128 dup (?) ;резервируем 128 слов с;неопределенным содержимым S ends ;закончили описание сегмента стека
;определяем символы возврата каретки и перевода строки cr = 0dh lf = 0ah
;описываем сегмент данных D segment ;резервируем место под переменные A dw? B dw?
;размещаем тексты сообщений программы MSG1 db 'Введите А и В:$' MSG2 db ‘A+B=0’, cr, lf, ’$’ MSG3 db ‘B-A=0’, cr, lf, ’$’ MSG4 db ‘Y=$’ CRLF db cr,lf,’$’ ;последовательность символов для;перевода курсора в начало следующей;строки
;описываем данные процедуры ввода числа string db 255, 0, 255 dup (?) errmsg db 'Недопустимый символ, можно использовать’ db ‘только цифры, первый символ может быть’ db ‘знаком + или -', cr, lf,'$' negflag dw? D ends ;закончили описание сегмента данных ;описываем макрокоманду вывода текстовой строки PRINT macro STR push ax push dx mov ah, 9 lea dx, STR int 21h pop dx pop ax endm
;описываем сегмент кодов команд C segment ;описываем процедуру ввода целого числа в регистр ax IntegerIn proc im: push bx push dx push si mov ah, 0ah lea dx, string int 21h xor ax, ax lea si, string+2 mov negflag, ax cmp byte ptr [si], '-' jne im2 not negflag inc si jmp im1 im2: cmp byte ptr [si], '+' jne im1 inc si im1: cmp byte ptr [si], cr je iex1 cmp byte ptr [si], '0' jb ierr cmp byte ptr [si], '9' ja ierr mov bx, 10 mul bx sub byte ptr [si], '0' add al, [si] adc ah,0 inc si jmp im1 ierr: print errmsg jmp im iex1: cmp negflag, 0 je iex neg ax iex: pop si pop dx pop bx ret IntegerIn endp
;описываем процедуру вывода целого числа из регистра ax IntegerOut proc push ax push bx push cx push dx xor cx, cx mov bx, 10 cmp ax, 0 jge om neg ax push ax mov ah, 2 mov dl, '-' int 21h pop ax om: inc cx xor dx, dx div bx push dx or ax, ax jnz om om1: pop dx add dx, '0' mov ah, 2 int 21h loop om1 pop dx pop cx pop bx pop ax ret IntegerOut endp
;основная программа start: ;точка входа в программу mov ax, D ;в ds заносим адрес сегмента данных mov ds, ax print MSG1 ;выводим приглашение к вводу;исходных данных call IntegerIn ;вызываем процедуру ввода числа mov A, ax ;помещаем его в переменную А print CRLF ;переводим курсор в начало следующей;строки call IntegerIn ;вызываем процедуру ввода числа mov B, ax ;помещаем его в переменную В print CRLF ;переводим курсор в начало следующей;строки
;вычисляем первый знаменатель и проверяем его mov si, A ;получаем сумму А+В в регистре si add si, B jnе m ;если она не равна 0 уходим на метку;m и продолжаем вычисления print MSG2 ;иначе выводим сообщение А+В=0 jmp ex ;и завершаем выполнение программы
;вычисляем второй знаменатель и проверяем его m: mov di, B ;получаем разность В-А в регистре di sub di, A jnz m1 ;если она не равна 0 уходим на метку;m1 и продолжаем вычисления print MSG3 ;иначе выводим сообщение B-А=0 jmp ex ;и завершаем выполнение программы ;вычисляем второй числитель m1: mov ax, A ;получаем разность А-2 в регистре ax sub ax, 2 ;получаем абсолютную величину этой разности jge m2 ;если она больше или равна 0 уходим на метку m2 neg ax ;иначе меняем ее знак на противоположный ;получаем значение второй дроби m2: cwd ;преобразуем числитель в 32 –;разрядное число idiv di ;делим на знаменатель mov bp, ax ;частное пересылаем в регистр bp;(освобождаем регистр ax)
;вычисляем первый числитель ;в регистре ax получаем четвертую степень В mov ax, B ;помещаем В в ax mul ax ;возводим в квадрат mul ax ;полученный квадрат В еще раз;возводим в квадрат ;к полученной четвертой степени В добавляем 3А add ax, A add ax, A add ax, A
;получаем значение первой дроби cwd ;преобразуем числитель в 32 –;разрядное число idiv si ;делим на знаменатель ;получаем и выводим окончательный результат add ax, bp ;складываем значения первой и второй;дробей print MSG4 ;оформляем вывод результата call IntegerOut ;вызываем процедуру вывода целого;числа из ax ;завершаем выполнение программы ex: mov ah, 4ch int 21h C ends ;закончили описание сегмента кодов команд
end start ;закончили программу с указанием точки входа в;нее
Текст программы 2:
title Prim assume cs:C, ds:D, ss:S
;описываем сегмент стека S segment stack dw 128 dup (?) ;резервируем 128 слов с;неопределенным содержимым S ends ;закончили описание сегмента стека
;определяем символы возврата каретки и перевода строки cr = 0dh lf = 0ah
;описываем сегмент данных D segment ;резервируем место под переменные N dw? ;размер массива T dw? ;вспомогательная переменная A dw 100 dup (?); обрабатываемый массив ;размещаем тексты сообщений программы CRLF db cr,lf,’$’ ;последовательность символов для;перевода курсора в начало следующей;строки SPACE db ‘ $‘ ;последовательность пробелов для;разделения чисел в строке MSG1 db 'Размер массива?: $' MSG2 db 'Массив?:’, cr, lf, ’$’ MSG3 db ‘Произведение левых разностей: $’ MSG4 db ‘Произведено замен: $’ MSG5 db 'Итоговый массив:’, cr, lf, ’$’
;описываем данные процедуры ввода числа string db 255, 0, 255 dup (?) errmsg db 'Недопустимый символ, можно использовать’ db ‘только цифры, первый символ может быть’ db ‘знаком + или -', cr, lf,'$' negflag dw? D ends ;закончили описание сегмента данных
;описываем макрокоманду вывода текстовой строки PRINT macro STR push ax push dx mov ah, 9 lea dx, STR int 21h pop dx pop ax endm
;описываем сегмент кодов команд C segment ;описываем процедуру ввода целого числа в регистр ax IntegerIn proc im: push bx push dx push si mov ah, 0ah lea dx, string int 21h xor ax, ax lea si, string+2 mov negflag, ax cmp byte ptr [si], '-' jne im2 not negflag inc si jmp im1 im2: cmp byte ptr [si], '+' jne im1 inc si im1: cmp byte ptr [si], cr je iex1 cmp byte ptr [si], '0' jb ierr cmp byte ptr [si], '9' ja ierr mov bx, 10 mul bx sub byte ptr [si], '0' add al, [si] adc ah,0 inc si jmp im1 ierr: print errmsg jmp im iex1: cmp negflag, 0 je iex neg ax iex: pop si pop dx pop bx ret IntegerIn endp ;описываем процедуру вывода целого числа из регистра ax IntegerOut proc push ax push bx push cx push dx xor cx, cx mov bx, 10 cmp ax, 0 jge om neg ax push ax mov ah, 2 mov dl, '-' int 21h pop ax om: inc cx xor dx, dx div bx push dx or ax, ax jnz om om1: pop dx add dx, '0' mov ah, 2 int 21h loop om1 pop dx pop cx pop bx pop ax ret IntegerOut endp ;основная программа start: ;точка входа в программу mov ax, D ;в ds заносим адрес сегмента данных mov ds, ax
;вводим размер массива print MSG1 ;выводим приглашение к вводу;размера массива call IntegerIn ;вызываем процедуру ввода числа mov N, ax ;помещаем его в переменную N print CRLF ;переводим курсор в начало следующей;строки
;цикл ввода массива print MSG2 ;выводим приглашение к вводу;массива mov cx, N ;кладем в cx количество повторений;цикла lea si, A ;заносим в si смещение до начала;массива m: call IntegerIn ;вызываем процедуру ввода числа mov [si], ax ;введенное число из ax помещаем в;элемент массива, адресуемый si print CRLF ;переводим курсор в начало следующей;строки add si, 2 ;формируем в si смещение до;следующего элемента массива loop m ;уменьшаем cx на 1 и, если он не равен;0, уходим на метку m
;цикл подсчета произведения левых разностей элементов;массива mov cx, N ;формируем в cx количество;повторений цикла dec cx lea si, A+2 ;заносим в si смещение до второго;элемента массива mov ax, 1 ;заносим в ax начальное значение;произведения m1: mov bx, [si] ;помещаем в bx значение очередного;элемента массива sub bx, -2[si] ;вычитаем из него значение;предыдущего элемента imul bx ;домножаем накопленное произведение;на полученную левую разность add si, 2 ;формируем в si смещение до;следующего элемента массива loop m1 ;уменьшаем cx на 1 и, если он не равен;0, уходим на метку m1
;выводим полученное произведение левых разностей print MSG3 ;оформляем вывод call IntegerOut ;вызываем процедуру вывода целого;числа из ax print CRLF ;переводим курсор в начало следующей;строки
;цикл замены четных элементов массива на произведение xor bx, bx ;обнуляем счетчик произведенных;замен mov cx, N ;кладем в cx количество повторений;цикла lea si, A ;заносим в si смещение до начала;массива m3: test word ptr [si], 1 ;проверяем элемент массива на;четность jnz m2 ;если он нечетный - уходим на метку;m2 mov [si], ax ;иначе - заменяем на произведение inc bx ;увеличиваем счетчик замен m2: add si, 2 ;формируем в si смещение до;следующего элемента массива loop m3 ;уменьшаем cx на 1 и, если он не равен;0, уходим на метку m3 ;выводим количество замен и получившийся массив mov ax, bx ;помещаем счетчик замен в ax print MSG4 ;оформляем вывод call IntegerOut ;вызываем процедуру вывода целого;числа из ax print CRLF ;переводим курсор в начало следующей;строки
;цикл вывода массива print MSG5 ;оформляем вывод mov cx, N ;кладем в cx количество повторений;цикла lea si, A ;заносим в si смещение до начала;массива m4: mov ax, [si] ;помещаем значение очередного;элемента массива в ax call IntegerOut ;вызываем процедуру вывода целого ;числа из ax print SPACE ;выводим пробелы между числами add si, 2 ;формируем в si смещение до;следующего элемента массива loop m4 ;уменьшаем cx на 1 и, если он не равен;0, уходим на метку m4 ;завершаем выполнение программы mov ah, 4ch int 21h C ends ;закончили описание сегмента кодов команд
end start ;закончили программу с указанием точки входа в;нее Результаты работы программ («скриншоты»)
Результаты работы программы вычисления выражения
Результаты работы программы обработки массива
ЗАКЛЮЧЕНИЕ Основной тенденцией развития вычислительной техники в настоящее время является дальнейшее расширение сфер применения компьютеров и, как следствие, переход от отдельных машин к их системам – вычислительным системам и комплексам разнообразных конфигураций с широким диапазоном функциональных возможностей и характеристик. Наиболее перспективные, создаваемые на основе персональных компьютеров, территориально распределенные информационно-вычислительные сети ориентируются не столько на вычислительную обработку информации, сколько на коммуникационные информационные услуги: электронную почту, системы телеконференций и информационно-справочные системы. Уже сегодня пользователям глобальной информационной сети Интернет стала доступной практически любая находящаяся в хранилищах знаний этой сети информация. При разработке и создании собственно компьютеров существенный и устойчивый приоритет в последние годы имеют сверхмощные компьютеры – суперкомпьютеры, миниатюрные и сверхминиатюрные ПК. Ведутся, как уже указывалось, поисковые работы по созданию компьютеров 6-го поколения, базирующихся на распределенной ≪нейронной≫ архитектуре – нейрокомпьютеров. В частности, в нейрокомпьютерах могут использоваться уже имеющиеся специализированные сетевые МП – транспьютеры. Транспьютер – микропроцессор сети со встроенными средствами связи. Повсеместное использование мультиканальных широкополосных радио, волоконно-оптических и оптических каналов обмена информацией между компьютерами обеспечат практически неограниченную пропускную способность. Широкое внедрение средств мультимедиа, в первую очередь аудио- и видеосредств ввода и вывода информации, позволят общаться с компьютером естественным для человека образом. Информационная революция затронет все стороны жизнедеятельности. Компьютерные системы: при работе на компьютере с ≪дружественным интерфейсом≫ человек будет воочию видеть виртуального собеседника, активно общаться с ним на естественном речевом уровне с аудио- и видеоразъяснениями, советами, подсказками. ≪Компьютерное одиночество≫, так вредно влияющее на психику активных пользователей, исчезнет. Системы автоматизированного обучения: при наличии обратной видеосвязи ученик будет общаться с персональным виртуальным наставником, учитывающим психологию, подготовленность, восприимчивость подопечного. Торговля: любой товар будет сопровождаться не штрих-кодом, нанесенным на торговый ярлык, а активной компьютерной табличкой, дистанционно общающейся с потенциальным покупателем и сообщающей всю необходимую ему информацию – что, где, когда, как, сколько и почем. И так далее, и тому подобное.
Не нашли, что искали? Воспользуйтесь поиском:
|