- •Контрольная работа
- •Тема №1 «Арифметические и логические команды в ассемблере».
- •Тема №3 « Работа с массивами и стеком на языке ассемблера»
- •Тема №4 «Работа с математическим сопроцессором в среде Assembler»
- •Тема №5 «Программирование на языке ассемблера задач с использованием системных ресурсов bios. Работа в графическом режиме»
- •Тема №6 «Работа с файлами в языке Assembler»
Министерство образования и науки Российской Федерации
Волжский политехнический институт (филиал) федерального государственного бюджетного образовательного учреждения высшего профессионального образования «Волгоградский государственный технический университет»
(ВПИ (филиал) ВолгГТУ)
Вечерний факультет
Ф
Информатика и
технология программирования
Кафедра «___________________________________________________________»
Контрольная работа
Машинно-зависимые
языки
по дисциплине «_____________________________________________________»
Программирование
задач
на языке
Ассемблер
(вариант №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).