Язык Assembler

 

Министерство образования и науки Российской Федерации

Государственное образовательное учреждение высшего профессионального образования

«Волгоградский государственный технический университет»








Контрольная работа

по дисциплине: «Машинно-ориентированные языки»

Вариант № 9




Выполнил: студент 2 курса ФПИК

группы АУЗ - 261с Тюляева И.А.

номер зачетной книжки 20161639

Проверил: ст. пр.Федоров М.А.








Волгоград 2011

Содержание


Задание №1

Задание №2

Задание №3

Задание №4

Задание №5

Список литературы



Задание №1


Арифметические команды языка Assembler в архитектуре x86:


(A+C)*(B-D)/E.


.686 ; директива определения типа микропроцессора

.model flat,stdcall ; задание линейной модели памяти

; но соглашения ОС Windows

.data ; директива определения данных

_a dw 1

_b dw 2

_c dw 3

_e dw 4

_d dw 5 dw 0 ; резервирование памяти для сохранения переменной

; res

.code ; директива начала сегмента команд : edx,0 ; очистка регистров ebx,0 ; очистка регистров ecx,0 ; очистка регистров ах,_a ; в регистр ах заносим число _a ax,_c ; складываем с _cedx,16 ; сдвиг на 16 dx,ax edx ; заносим значение в стек edx,0 ах,_b ax,_d ; отнимаем от _b значение _d_e ; делим ах на _eecx ; вызываем из стека значения

mul ecx ; умножаемres, eax

ret ; возвращение управление ОС start ; окончание программы с именем _start


Задание №2


Организация ветвлений и циклов в программах на языке Assembler. Вводить с клавиатуры элементы массива не требуется, на экран выводить необходимо:

Обнулить все элементы массива, которые по модулю меньше 10.


.model tiny

.code100h: mov ax,3

int 10h ; очищение экранаcx,-50:xor ax,axax,[massiv+cx+50] ; заносим очередной символ

cmp ax,10b1ax,ax

mov [massiv+cx+50],ax; обнуляем элемент меньше 10: bl,10 ; переводим число в строку для вывода на

; экранbl[x+2],ahblword ptr [x],axah,9dx,offset string1

int 21h ; выводим на экранcx,2; на следующий элемент массива

jne a1ah,016h ; задержка экрана

retn ; выход из программыdw 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50

string1 db " result= "db "000$"

END start


Задание №3


Ввод строк с клавиатуры и команды пакетной обработки (строковые команды) в языке Assebmler. С клавиатуры вводятся только символы латинского алфавита. При выполнении каждого задания необходимо использовать команды пакетной обработки:

Ввести с клавиатуры строку и символ. Вывести номер позиции последнего вхождения введенного символа в строку.


.model small

.stack 100h

.datadb 80 dup(?),'$'

symb db ?,' ','$' ; можно и не выделять память для символа

msg_inp db 0ah,0dh,"Vvedite stroku:",0ah,0dh,"$"_in db 0ah,0dh,"Vvedite simvol:",0ah,0dh,"$"db 0ah,0dh,"Simvol ","$"db "nayden! Ego index - ","$"_err db "ne nayden.","$"dw 10dw ?

.code:ax,@datads,axdx,msg_inp ; вывод msg_inpah,09h21hbx,bx ; в bx - индекс вводимого символа

input_loop:ah,01h ; считываем символ

int 21hal,13 ; если это enter

je for_find ; то конец вводаstroka[bx],al ; иначе записываем символ в строкуbx,80 ; если ввели 80 символовfor_find ; то конец вводаbx ; увеличиваем bxinput_loop

for_find:dx,msg_in ; вывод msg_inah,09h21hah,01h ; ввод нужного символа21hbyte ptr symb,al ; сохраняем его в symb

mov cx,bx ; в cx - длина строкиcurlen,bxbx,bx ; bx - индекс элементаah,byte ptr symb ; в ah - нужный символ: cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным

; символомfind ; если совпадают, то jmp на finditer :ah,stroka[bx] ; сравниваем текущий элемент с нужным

; символомvuvod ; если совпадают, то jmp на vuvodnext:: ; если найден символ

lea dx,msg ; вывод msgah,09h

int 21hdx,symb ; вывод самого символа

int 21hdx,msg1 ; вывод msg1

int 21hax,bx ; сохраняем индекс в axcx,cx ; cx - счетчик цифр_to_string:dx,dx ; подготовка к делениюc10 ; делениеdx,30h ; в dx - ASCII-код остатка от деленияdx ; сохраняем его в стекеcx ; инкремент счетчика цифрax,0 ; цикл, пока частное ненулевое

jne number_to_string_index_loop: ; цикл вывода индекса

pop dx ; извелекаем очередную цифруah,02h ; выводим ее на экран

int 21hout_index_loopcx,cxcx,curlenah,byte ptr symb ; в ah - нужный символ:bxbx,cx

jne find ;цикл повторяется cx раз

call end_program ; завершить программу :

inc bxbx,cxer ;цикл повторяется cx раз dx,msg ; если символ не найден, то

mov ah,09h ; вывод msg21h

lea dx,symb ; вывод самого символа

int 21hdx,msg_err ; вывод msg_err21hend_program ; завершить программу_program proc nearah,4ch21h_program endpstart


Задание №4


Вывод на экран в текстовом режиме с использованием средств BIOS:

Ввести с клавиатуры строку, и вывести её на экран «ступеньками», то есть, увеличивая номер строки для каждого введенного символа, каждый символ должен иметь атрибуты отличные от остальных.

data segmentdb 0Ah, 0Dh, '$'DB 255, 0, 256 DUP (0) endssegment ;отмечаем начало сегмента кодовcs:code, dsata: ax,data ;копируем адресds,ax ;сегмента данных

mov dx,offset Buf ;считываем строку с клавиатуры

mov ah,0Ah21hcx,cx

mov al,[Buf+1] ;если считано 0 байт, то выход изcl,al ;задаем количество повторений

;(длина строки)al,al ;программыExitah,09hdx,offset NL ; перейти на следующую строку

int 21hsi,offset Buf+2

Cycle:dl,[si] ;считать символah,09h ; перевод кареткиdx,offset NL ;адрес строки с переводом каретки21h ;вызов DOSah,02h ;выбор функции 221h ;вызов DOSsi ;перейти к следующему символу

loop Cycle:AX,4C00h ;выход

int 21h ;из программыendsSTART


Задание №5


Вывод на экран в графическом режиме. Найти алгоритм Брезенхема, и написать программу, выводящую на экран прямую по двум заданным точкам в графическом режиме.

.model small

.stack 100h

.data_1 dw 20_2 dw 200_1 dw 0_2 dw 80_d_x dw ?_d_y dw ?

.code

.startup

; set segment registersax, @datads, axax, 0A000hes, ax

; set video mode ( 320x240@256 )ax, 13h10h

; di <- Y1ax, y_1bx, 320bxax, x_1di, ax

; calculate delta(X)ax, x_2ax, x_1

; calculate delta(Y)dx, y_2dx, y_1 ; dx < delta(Y)dx, 1 ; dx < 2 * delta(Y)two_d_y, dx

; calculate Ebx, dxbx, ax ; bx <- E

; cx <- delta(X)cx, axcx

; calculate 2*delta(X)ax, 1two_d_x, ax_loop:

; draw pixel

;byte ptr es:[di], 024h

;

; E loop_loop_condition:bx, 0e_loop_end

; increase y ( 320 bytes offset per y )di, 320

; E = E - 2 * delta(X)bx, two_d_xshort e_loop_condition_loop_end:

; increase Xdi

; E = E + 2 * delta(Y)bx, two_d_ymain_loop

; wait for any keyah, 0h16h ax, 3h

int 10h

.exit(0)


Список литературы


Питер Абель. Ассемблер и программирование для IBM PC. Корона-Век, Энтроп, 2007.

Голубь Н.Г. Искусство программирования на ассемблере. М:DiaSoft,2002

Зубков С.В. Assembler. Язык неограниченных возможностей. ДМК Пресс, 1999. assembler команда цикл строка

Юрий Магда. Ассемблер для процессоров Intel Pentium. Питер, 2006.

Кип Р. Ирвин. Язык ассемблер для процессоров Intel. Вильямс, 2005.

Рудаков П. И., Финогенов К. Г. Язык ассемблера: уроки программирования.М: ДИАЛОГ-МИФИ, 2001.



Министерство образования и науки Российской Федерации Государственное образовательное учреждение высшего профессионального образования «Волгоградский

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2019 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ