Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 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-го поколения, базирующихся на распределенной ≪нейронной≫ архитектуре – нейрокомпьютеров. В частности, в нейрокомпьютерах могут использоваться уже имеющиеся специализированные сетевые МП – транспьютеры. Транспьютер – микропроцессор сети со встроенными средствами связи. Повсеместное использование мультиканальных широкополосных радио, волоконно-оптических и оптических каналов обмена информацией между компьютерами обеспечат практически неограниченную пропускную способность.

Широкое внедрение средств мультимедиа, в первую очередь аудио- и видеосредств ввода и вывода информации, позволят общаться с компьютером естественным для человека образом.

Информационная революция затронет все стороны жизнедеятельности. Компьютерные системы: при работе на компьютере с ≪дружественным интерфейсом≫ человек будет воочию видеть виртуального собеседника, активно общаться с ним на естественном речевом уровне с аудио- и видеоразъяснениями, советами, подсказками. ≪Компьютерное одиночество≫, так вредно влияющее на психику активных пользователей, исчезнет.

Системы автоматизированного обучения: при наличии обратной видеосвязи ученик будет общаться с персональным виртуальным наставником, учитывающим психологию, подготовленность, восприимчивость подопечного.

Торговля: любой товар будет сопровождаться не штрих-кодом, нанесенным на торговый ярлык, а активной компьютерной табличкой, дистанционно общающейся с потенциальным покупателем и сообщающей всю необходимую ему информацию – что, где, когда, как, сколько и почем. И так далее, и тому подобное.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных