Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Primer_kontr._raboty_208_FGOS_.doc
Скачиваний:
7
Добавлен:
16.11.2019
Размер:
318.98 Кб
Скачать

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

Волжский политехнический институт (филиал) федерального государственного бюджетного образовательного учреждения высшего профессионального образования «Волгоградский государственный технический университет»

(ВПИ (филиал) ВолгГТУ)

Вечерний факультет

Ф

Информатика и технология программирования

акультет «_________________________________________________________»

Кафедра «___________________________________________________________»

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

Машинно-зависимые языки

по дисциплине «_____________________________________________________»

Программирование задач

на языке Ассемблер

(вариант №7)

на тему______________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

Сергей Петрович Исаев

Студент_____________________________________________________________

(

ВИП-208

имя, отчество, фамилия)

Группа________________________

Оценка ________________________

(зачтено / незачтено )

ст. преп. Белова С.В.

Проверил ________________________ _____________________

(подпись и дата подписания) (долж., инициалы и фамилия)

Н.А. Билялова

Нормоконтролер ______________________________ _____________________________

(подпись, дата подписания) (инициалы и фамилия)

Волжский, 2012 г.

Тема №1 «Арифметические и логические команды в ассемблере».

Условие задачи

1.

Исходный текст программы

data segment ;описание сегмента данных

x3 db 3

x2 db 2

x8 db 8

data ends

stk segment stack ;описание стека размерностью 128 бит

db 128 dup(?)

stk ends

assume ss:stk,ds:data,cs:code

code segment

main proc

mov ax,data

mov ds,ax

mov ax,0 ;регистр заполнен нулями

mov al,36

sub al,4 ; находим 36-4

xor ah,ah

div x3 ; находим (36-4)/3

sub al,17 ; находим (36-4)/3 - 17

mov bl,al

xor ah,ah

mov al,4

mul x3 ; находим 4*3

mul x2 ; находим 4*3*2

add al,171 ; находим 171 + 4*3*2

xor ah,ah

idiv bl ; находим (171 + 4*3*2)/((36-4)/3 - 17)

mov cl,al

mov bl,5

mov al,17

xor ah,ah

div bl ; находим 17/(5+2)

mul x8 ; находим 8*17/(5+2)

mov bl,5

add bl,6 ; находим 5+6

mul bl ; находим (5+6)*8*17/(5+2)

add al,cl ; находим (171 + 4*3*2)/((36-4)/3 - 17) + (5+6)*8*17/(5+2). Результат в AL

mov ax,4c00h

int 21h

main endp

code ends

end main

Результат работы программы

Результат = 149 (95h)

Условие задачи

2. Дано число в двоичном виде. Обнулить 2,3,4 разряды тремя способами.

Исходный текст программы

data segment ; описание сегмента данных

x db 10111011b ; число в двоичном виде

data ends

stk segment stack ;описание стека размерностью 128 бит

db 128 dup(?)

stk ends

assume ss:stk,ds:data,cs:code

code segment

main proc

.486

mov ax,data

mov al,x ; заносим число в регистр al

and al,11100011b ; обнуляем 2,3,4 разряды. Результат в al

mov bl,x

shl bx,3

shl bl,3

shr bl,3

shr bx,3 ; обнуляем 2,3,4 разряды вторым способом. Результат в bl.

mov cl,x

mov dl,x

and dl,00011100b

xor cl,dl ; обнуляем 2,3,4 разряды третий способом. Результат в cl

mov ax,4c00h ; выходим из программы

int 21h

main endp

code ends

end main

Результат работы программы

Результат = 163 (A3h)

Тема №2 «Арифметические команды и команды переходов»

Условие задачи

В соответствии с вариантом напишите программу на языке ассемблера с полным описанием сегментов для вычисления значения y. Используйте, где требуется, 32х-разрядные регистры.

; ; .

Исходный текст программы

masm

model small

.stack 100h

.data

x db 0

a db 0

y1 db ?

y2 db ?

y db ? ; описание переменных в сегменте данных

ySmall db 0

message1 db 13,10,"Введите x: $"

message2 db 13,10,"Введите a: $"

message3 db 13,10,'y = $'

flag db 0

.code

start:

mov ax,@data ; инициализация сегмента данных

mov ds,ax

mov ah,9h ; вывод приглашения к вводу

lea dx,message1

int 21h

mov ah,1

int 21h

cmp al,'-' ; проверяем на наличие минуса

jne AfterPress

mov flag,1

input:

mov ah,1

int 21h ; ввод символа с клавиатуры

AfterPress:

cmp al,13 ; проверка на нажатие Enter

je endInput ; если нажат Enter конец ввода

sub al,30h

mov bl,al

mov bh,10

xor ah,ah

mul bh ; умножаем уже введенное число на 10

add al,bl ; суммируем с введенной цифрой

mov x,al

loop input

endInput:

cmp flag,1 ; если изначальное был введен минус

jne BeforeInput2

neg x ; изменяем знак

BeforeInput2:

mov flag,0 ; обнуляем флаг

mov ah,9h ; вывод приглашения к вводу

lea dx,message2

int 21h

mov ah,1

int 21h

jne AfterPress2

mov flag,1

input2:

int 21h ; ввод символа с клавиатуры

AfterPress2:

cmp al,13 ; проверка на нажатие Enter

je endInput2 ; если нажат Enter конец ввода

sub al,30h

mov bl,al

mov bh,10

mov al,a

xor ah,ah

mul bh ; умножаем уже введенное число на 10

add al,bl ; суммируем с введенной цифрой

mov a,al

loop input2

endInput2:

cmp flag,1 ; если изначальное был введен минус

jne EndInputXA

neg a ; изменяем знак

EndInputXA:

xor ah,ah

mov al,x

mov bl,3

div bl

cmp ah,1 ; сравниваем x mod 3 с 1

jne Xmod3Not1

mov y1,3 ; действия, если x mod 3 = 1

; y1 = 3

jmp CalculateY2

Xmod3Not1:

mov al,x ; действия, если x mod 3 <> 1

sub al,a

mov y1,al ; сохраняем значение y1 = x-a

CalculateY2:

xor ah,ah

mov al,x

cmp al,0 ; сравниваем x с 0

je Xeq0

mov al,a ; действия, если x<>0

div x

mov y2,al ; y2 = a/x

jmp CalculateY

Xeq0:

; действия, если x=0

mov y2,4 ; сохраняем значение y2 = 4

CalculateY:

cmp y2,0

jge y2more0

neg y2

y2more0:

mov al,y1

add al,y2

mov y,al ; находим произведение y1 и y2

OutY: ; вывод y

mov ah,9h ; вывод сообщения о выводе

lea dx,message3

int 21h

cmp y,0

jge Yge0 ; если y - отрицательное число

mov al,'-' ; выводим минус

int 29h

neg y ; меняем знак

Yge0:

mov ah,0

mov al,y

mov bl,100

div bl ; в al - сотни, в ah - остаток

push ax

add al,'0'

cmp al,'0'

jna outAllY

int 29h ; выводим сотни

outAllY:

mov al,ah ; в al - остаток после деления на 100

aam ; ah = al/10, al = остаток

add ax,'00' ; приводим числа в al и ah к виду, удобному для вывода

mov dx,ax ; копируем ax в dx

push dx

mov al,dh ; выводим десятки

int 29h

pop dx

mov al,dl ; выводим единицы

int 29h

mov ah,10h ; ожидаем нажатия клавиши

int 16h

mov ax,4c00h ; завершаем работу программы

int 21h

end start

Результат работы программы

При x = 4, a = 9 результат = 5 (5h).

При x = 5, a = 3 результат = 2 (2h).

При x = 0, a = -5 результат = 9 (9h).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]